구조체와 클래스의 차이
- 구조체 (struct): 값 타입, 스택 메모리에 저장, 할당 및 해제가 빠름.
- 클래스 (class): 참조 타입, 힙 메모리에 저장, 가비지 컬렉션의 영향을 받음, 상속 및 다형성을 지원.
Vector가 구조체인 이유
- 성능 최적화: 게임 개발에서는 성능 최적화가 매우 중요합니다. 벡터 연산은 게임 루프에서 빈번하게 일어나기 때문에, 이러한 연산이 효율적이어야 합니다. 구조체는 값 타입으로 스택에 저장되므로, 할당과 해제가 매우 빠르며, 힙 메모리 할당에 따른 가비지 컬렉션 오버헤드를 줄일 수 있습니다.
- 메모리 효율성: 구조체는 스택에 저장되기 때문에, 힙 메모리에 비해 메모리 접근 속도가 빠릅니다. 또한, 작은 크기의 데이터 구조는 구조체로 사용하는 것이 메모리 효율적입니다. Vector는 비교적 작은 데이터 구조이기 때문에 구조체로 사용하는 것이 메모리 효율성을 높이는 데 기여합니다.
Vector가 구조체임에도 불구하고 new 키워드를 사용하여 할당하는 이유
- 초기화 필요성: 구조체는 기본적으로 모든 필드를 초기화해야 합니다. new 키워드를 사용하여 구조체를 할당하면, 해당 구조체의 모든 필드가 명시적으로 초기화됩니다. 이는 명시적인 초기화를 통해 오류를 방지하고, 코드의 가독성을 높이는 데 도움이 됩니다.
- 생성자 호출: 구조체는 생성자를 가질 수 있으며, new 키워드를 통해 생성자를 호출할 수 있습니다. 이는 Vector와 같은 구조체를 초기화할 때 매우 유용합니다.
Vector3 myVector = new Vector3(1.0f, 2.0f, 3.0f);
유니티에서 Vector 사용 시 주의점
구조체는 값 타입이므로 직접 수정할 수 없습니다. 예를 들어, Transform의 position 속성은 Vector3 구조체이므로, 다음과 같은 코드에 주의해야 합니다.
transform.position.Set(1, 1, 1); // 동작 하지 않음
transform.position = new Vector3(1, 1, 1); // 동작
결론
유니티에서 Vector가 구조체로 구현된 이유는 성능 최적화, 메모리 효율성 등 여러 가지 장점이 있기 때문입니다. 또한, new 키워드를 사용하여 할당하는 것은 구조체의 모든 필드를 명시적으로 초기화하고 생성자를 호출하기 위함입니다. 이 밖에도 Quaternion, Color, Rect, Bounds, Plane 등도 new 키워드를 사용하여 할당하지만, 구조체로 구현됨으로써 값 타입의 장점을 살리고 있습니다.