[TIL / C#] Structure

조재훈·2024년 8월 11일

개요

진행중인 프로젝트에서 캐릭터의 스탯 등을 직렬화를 통해 저장하기 위해 원래 클래스를 사용해 데이터를 관리했는데 참조 형식이라 데이터 수정이 조금 까다로워 값 형식으로 관리하면 어떨까 해서 구조체를 사용해보게 되었음

그래서 C#에서 구조체를 클래스와 비교해 기록해보려고 함

구조체(Structure)

특징

  • 구조체는 값 형식으로 키워드 class 대신 structure을 사용한다
    • 값 형식이라는 것은 인스턴스를 다른 변수에 할당하거나 매개변수로 전달할 때 원본 인스턴스가 아닌 값의 복사본이 전달된다는 것을 의미함
  • 메모리 할당
    • 힙에 메모리가 할당되는 클래스와 달리 구조체는 할당될 때 스택에 할당된다
    • 힙에 할당된 메모리는 가비지 컬렉터에 의해 사용되지 않으면 메모리가 해제되는데 이 타이밍에 해제해야 할 메모리가 많다면 프로그램에 문제가 발생할 수 있음. 하지만 스택은 사용 후에 바로 해제되어 그럴 문제가 없음
    • 하지만 스택 메모리만 사용하다가는 스택 오버플로우가 발생할 수 있어 적절하게 사용하자
  • 기본 생성자 없음
    • 구조체는 기본 생성자를 정의할 수 없으며, 구조체의 모든 필드는 생성자에서 초기화되어야 한다
    • 매개변수가 없는 생성자가 불가능하다는 의미
  • 상속 불가
    • 구조체는 클래스처럼 상속이 불가함
    • 인터페이스는 구현이 가능
  • 불변 객체 사용 권장
    • 구조체는 주로 불변 객체로 사용하는 것이 좋음

언제 사용?

  • 작고 간단한 데이터
    • 구조체는 주로 작고 간단한 데이터 형식을 표현할 때 사용됨
    • 크기가 크다면 구조체를 복사하거나 그럴 때 많은 메모리를 사용하고 그러기 때문에 성능에 좋지 않음
  • 성능이 중요한 경우
    • 값 형식이기 때문에 메모리 할당과 해제가 빈번하게 일어나는 경우 성능을 최적화할 수 있음

기타

찾아보면 구조체의 인스턴스 크기가 16 바이트보다 크다면 메모리 할당이 힙에서 일어난다는 이야기가 있는데 사실이 아니라고 한다. 실험해본 분도 있음참고

profile
나태지옥

0개의 댓글