C#

[C#] 구조체 (Struct)

윤창범 2021. 10. 22.

구조체

  • 구조체사용자 정의 데이터 유형으로 기본적으로 제공되는 변수 유형이 아님
    => 새로운 데이터 유형으로 사용자가 직접 정의하여 사용함
  • 클래스참조형식과 달리 구조체값 형식 참조

먼저 알아야 할 내용

값 형식 참조와 참조 형식의 차이 (Value type reference, Reference type reference)

  • 클래스는 Heap 에 인스턴스가 생성 및 할당되고 Stack 에 변수로 주소 값을 설정함 (인스턴스에 대한 참조를 포함)
  • 구조체는 Stack 에 할당되고 생성과 복사 모두 각각의 변수에 포함된 인스턴스에게 이루어짐 (인스턴스를 포함)
    => 구조체 변수에 다른 변수를 대입할 경우, 참조 값이 변하는게 아니라 값 형식으로 구조체가 복사됨
  • 구조체는 매개변수가 없는 생성자를 만들 수 없음 => null 이 존재하지 않음
  • 차이점은 아니지만, 구조체를 매개변수에 참조 형식으로 넘길 수 있음 (ref 키워드 사용)

 

< Heap 에 있는 클래스 인스턴스를 가르키는 Stack 의 두 변수 >

 

(사전 참고자료1)

(사전 참고자료2)


선언 & 사용 방법

구조체를 정의하기 위해서는 struct 문을 사용

< 본인의 프로젝트에 적용을 했었던 구조체 코드 예시 >


구조체를 사용하는 이유

  • 여러 데이터 타입들을 집합된 데이터 형태로 저장하기에 적절함 (int, float 등 => A 라는 구조체 데이터 타입으로 묶음)
  • 참조 형식이 아니라 값 타입의 변수 사용을 원하는 경우에도 구조체를 사용하기 적절함
  • 일반적인 함수로는 여러 자료형을 리턴할 수 없지만, 구조체는 가능함
  • 연관된 데이터 타입들을 한 곳에 집합시켰으니 관리와 처리가 수월함 (헷갈리지 않음)
  • 함수에 매개변수로 전달할때도 단위로 묶여서 간단함

(안쓰면 불편한 점 / 참고자료)


마무리

  • 멤버 함수의 필요성이 적고 타입이 다른 여러 데이터들을 저장 및 사용한다면, 구조체를 사용하기 좋음
    => 단, 구조체에 클래스 타입을 가지는 필드가 존재한다면 힙 영역에 할당되니 주의하여 사용할 필요가 있음
  • 구조체 데이터가 방대하다면 스택 오버플로우가 발생할 수 있으니 주의 필요
    => 반면에 스택에 할당되어서 GC (Garbage Collection) 는 발생하지 않음
  • 참고자료1
  • 참고자료2

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

[C#] 직렬화 (Serialization)  (0) 2021.11.12
[C#] 얕은 복사와 깊은 복사 (Shallow Copy & Deep Copy)  (0) 2021.10.15

댓글