Simple Use

using System;

public class SomeManager {
    private Lazy<SomeClass> lazyLoadedObject = new Lazy<SomeClass>(() => new SomeClass());

    public SomeClass LazyLoadedObject {
        get { return lazyLoadedObject.Value; }
    }
}

public class SomeClass {
    // SomeClass의 내용
}

 

 

초기화를 개발자가 사용하는 시점까지 미루고 이후 필요할때 로드하는 방식이다.

 

Lazy Loading 패턴을 사용하는 이유 중 하나는 성능 측면에서의 이점을 얻기 위해서다.

특히 초기화 시점에서 리소스를 할당하거나 계산을 하고 싶지 않거나, 해당 리소스가 필요한 경우가 제한적인 경우에 Lazy Loading을 사용한다.

어떤 멤버 변수나 리소스를 선언 시 초기화하는 것은 그 자체로 큰 성능 이슈를 일으키진 않는다.

그러나 프로그램의 시작 시점이나 해당 멤버 변수가 사용될 때까지 초기화할 필요가 없는 경우, 초기화를 미루는 것이 성능적으로 유리할 수 있다.

예를 들어, 어떤 멤버 변수가 초기화되고 계산에 많은 시간이 걸린다면, 해당 변수를 Lazy Loading 패턴으로 초기화하는 것이 사용자 경험과 성능을 향상시킬 수 있다. 사용자가 해당 변수를 실제로 요청할 때까지 초기화를 미루고, 필요한 경우에만 리소스를 할당하고 계산을 수행할 수 있다.

그러나 모든 상황에서 Lazy Loading을 사용하는 것이 항상 최적은 아니다. 필요한 리소스를 너무 늦게 초기화하면 사용자 경험이 저하될 수 있다. 따라서 Lazy Loading을 사용할 때는 초기화를 늦추는 것과 성능 향상 사이에서 적절한 균형을 유지하는 것이 중요하다.

'Development > C#' 카테고리의 다른 글

Cashing  (0) 2023.12.27
Object pooling  (0) 2023.12.27

Simple Used Sample

public class DataFetcher {
    private SomeData cachedData;

    public SomeData GetSomeData() {
        if (cachedData == null) {
            // 캐시된 데이터가 없는 경우에만 데이터를 가져옴
            cachedData = FetchDataFromServer(); // 데이터를 가져오는 시간이 오래 걸리는 작업
        }

        return cachedData; // 캐시된 데이터 반환
    }

    private SomeData FetchDataFromServer() {
        // 서버에서 데이터를 가져오는 작업 (시뮬레이션을 위한 임의의 데이터 생성)
        SomeData data = new SomeData(); // 실제로는 서버 통신 등의 작업을 수행
        return data;
    }
}

public class SomeData {
    // 데이터 구조 정의
}

 

'Development > C#' 카테고리의 다른 글

Lazy Loading Pattern  (0) 2023.12.27
Object pooling  (0) 2023.12.27

Pool Create

using UnityEngine;
using System.Collections.Generic;

public class ObjectPool : MonoBehaviour
{
    public GameObject prefabToPool;
    public int poolSize = 10;

    private List<GameObject> objectPool = new List<GameObject>();

    private void Start()
    {
        InitializeObjectPool();
    }

    private void InitializeObjectPool()
    {
        for (int i = 0; i < poolSize; i++)
        {
            GameObject obj = Instantiate(prefabToPool);
            obj.SetActive(false);
            objectPool.Add(obj);
        }
    }

    public GameObject GetPooledObject()
    {
        foreach (GameObject obj in objectPool)
        {
            if (!obj.activeInHierarchy)
            {
                obj.SetActive(true);
                return obj;
            }
        }

        // 오브젝트 풀에 사용 가능한 오브젝트가 없는 경우
        GameObject newObj = Instantiate(prefabToPool);
        newObj.SetActive(true);
        objectPool.Add(newObj);
        return newObj;
    }

    public void ReturnObjectToPool(GameObject obj)
    {
        obj.SetActive(false);
    }
}

 

 

Using Sample

public class YourScript : MonoBehaviour
{
    private ObjectPool objectPool;

    private void Start()
    {
        objectPool = GetComponent<ObjectPool>();
    }

    private void SpawnObjectFromPool()
    {
        GameObject newObj = objectPool.GetPooledObject();
        // 가져온 오브젝트를 사용 (위치 설정 등)
        newObj.transform.position = Vector3.zero;
    }

    private void ReturnObjectToPool(GameObject obj)
    {
        objectPool.ReturnObjectToPool(obj);
    }
}

'Development > C#' 카테고리의 다른 글

Lazy Loading Pattern  (0) 2023.12.27
Cashing  (0) 2023.12.27

+ Recent posts