TIL

20240207 TIL

[폴른] 2024. 2. 7. 22:41

Today I Learned :

UI - Anchor Preset

캔버스에서 UI를 그릴때 위치와 크기를 조정하는 것

  • Anchor
    • 부모 하위의 자식들 위치 기준점을 지정
    • 부모의 크기 변화에 따라 자식 위치가 결정된다.
  • Pivot
    • 자신의 기준점, 드로우 시작점.
    • 회전, 크기변경의 기준점

 

메모리 - 박싱 / 언박싱

값형식과 참조형식 간의 형변환을 말한다

  • 박싱
    • 박싱은 값 -> 참조 형식으로 변환하는 과정
    • 박싱이 되면 Heap 메모리에 새로운 객체로 저장
    • 박싱된 객체는 추가 메모리 오버헤드를 발생시킬수 있음
    • 힙에 메모리 할당 -> 스택의 값을 복사 -> 힙메모리의 주소값을 저장할 스택 할당
int i = 10;
object obj = i; // int가 Object로 박싱됨

 

  • 언박싱
    • 참조 -> 값 형식으로 변환하는 과정
    • 언박싱은 명시적인 형변환을 통해 이루어진다
    • 박싱된 객체의 데이터를 꺼내 Stack 메모리 영영에 해당 값 형식으로 변수 할당하는 것
    • 힙에 남은 메모리 찌꺼기로 인한 GC 발동
    • Console.WriteLine 의 경우 오버헤드를 줄이기 위해 수많은 타입에 오버로딩 되어있다.
object obj = 10;
int i = (int)obj; // Object가 다시 int로 언박싱됨

 

* 20배 성능 저하

 

Object

MonoBehaviour 상속관계

Object < Component < Behaviour < MonoBehaviour 

 

Object 는 다른 모든 클래스의 기본 클래스로 .NET 상의 모든 형식은 Object 형식을 직간접적으로 상속한다.

Object 를 그대로 사용하는 경우 안전성이 감소하고, 형식 확인/변환, 안전성검사의 오버헤드가 발생한다.

 

 

Generic

제네릭을 사용하면 컴파일타임에 형식을 지정하여 타입 안전성 보장

박싱 언박싱이 발생하지 않는다.

코드가 간결해지고 사용성이 좋다

 

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
    // 프로퍼티
    private static T _instance;

	...
    
}

 

where T : MonoBehaviour

매개변수 T에 제약(Constraint)을 거는 것으로 T가 MonoBehaviour 형식이거나 MonoBehaviour를 상속하는 형식이어야 한다.

제약이 없는 경우 T는 어떠한 형식이든 지정이 가능하여 컴파일타임에 오류가 발생 할 수 있다.