개요
진행중인 프로젝트에서 캐릭터의 스탯 등을 직렬화를 통해 저장하기 위해 원래 클래스를 사용해 데이터를 관리했는데 참조 형식이라 데이터 수정이 조금 까다로워 값 형식으로 관리하면 어떨까 해서 구조체를 사용해보게 되었음
그래서 C#에서 구조체를 클래스와 비교해 기록해보려고 함
구조체(Structure)
특징
- 구조체는 값 형식으로 키워드 class 대신 structure을 사용한다
- 값 형식이라는 것은 인스턴스를 다른 변수에 할당하거나 매개변수로 전달할 때 원본 인스턴스가 아닌 값의 복사본이 전달된다는 것을 의미함
- 메모리 할당
- 힙에 메모리가 할당되는 클래스와 달리 구조체는 할당될 때 스택에 할당된다
- 힙에 할당된 메모리는 가비지 컬렉터에 의해 사용되지 않으면 메모리가 해제되는데 이 타이밍에 해제해야 할 메모리가 많다면 프로그램에 문제가 발생할 수 있음. 하지만 스택은 사용 후에 바로 해제되어 그럴 문제가 없음
- 하지만 스택 메모리만 사용하다가는 스택 오버플로우가 발생할 수 있어 적절하게 사용하자
- 기본 생성자 없음
- 구조체는 기본 생성자를 정의할 수 없으며, 구조체의 모든 필드는 생성자에서 초기화되어야 한다
- 매개변수가 없는 생성자가 불가능하다는 의미
- 상속 불가
- 구조체는 클래스처럼 상속이 불가함
- 인터페이스는 구현이 가능
- 불변 객체 사용 권장
- 구조체는 주로 불변 객체로 사용하는 것이 좋음
언제 사용?
- 작고 간단한 데이터
- 구조체는 주로 작고 간단한 데이터 형식을 표현할 때 사용됨
- 크기가 크다면 구조체를 복사하거나 그럴 때 많은 메모리를 사용하고 그러기 때문에 성능에 좋지 않음
- 성능이 중요한 경우
- 값 형식이기 때문에 메모리 할당과 해제가 빈번하게 일어나는 경우 성능을 최적화할 수 있음
기타
찾아보면 구조체의 인스턴스 크기가 16 바이트보다 크다면 메모리 할당이 힙에서 일어난다는 이야기가 있는데 사실이 아니라고 한다. 실험해본 분도 있음참고