SW Programming/C#

[C#] 클래스와 구조체

victoryAshe 2022. 6. 1. 09:12

구조체와 클래스

구조체 Struct

형이 다른 여러 데이터들을 하나로 통합해 관리할 수 있는 값형 데이터.

  • 클래스와 거의 비슷하게 필드와 메소드를 가질 수 있다.
  • 클래스와 비슷하지만, 메모리 공간에 대한 구조가 다르다. -> 객체가 스택에 할당됨
    • 가용 메모리 크기가 작다.
    • GC(Garbage Collector)에 의해 관리되지 않아, 성능상 이점이 있다.
      : 구조체는 함수가 종료될 때 자동으로 메모리가 정리됨!
  • new연산자 없이도 인스턴스화 가능
  • 객체를 전달할 때: 원본의 내용을 복사한 새로운 객체를 생성하여 전달!
    -> 자신의 크기만큼 스택 공간을 새로이 할당하므로, 크기가 클수록 메모리 사용량이 늘어남
    여기서 생성된 구조체 객체는 함수가 종료되면 자동으로 메모리에서 해제됨!
  • 다른 구조체, 클래스를 상속할 수 없으며 상속의 원본이 될 수 없다. BUT, 인터페이스 장착은 가능
  • 초기화 불가능: ERROR!
    • const 또는 static으로 선언한 필드만 초기화 가능
  • 구조체 내에 클래스를 멤버 변수로 선언할 경우, 클래스처럼 힙 영역에 할당됨!
  • 변수의 크기가 작거나/ 수명이 짧고/ 자주 할당되는 객체를 만드는 데 적합
  • 유니티에서는 position, color, quaternion, rotation, scale 등이 구조체로 구현되어있음

클래스 Class

데이터와 처리를 모아놓은 것으로, 참조형 타입.

  • GC에 의해 자동으로 메모리가 관리된다.
  • 객체를 전달할 때: 원본의 메모리 주소를 전달 (원본이 그대로 넘어감)
    : 데이터를 변경하면 원본의 데이터가 변경되며, 함수가 종료되어도 원본 객체는 유효함
  • 메모리 보다는 기능적 측면이 더 중요할 때 사용

구조체와 클래스의 차이

  C++ C#
처리 속도 비교적 느림 비교적 빠름
가용 메모리 크기 비교적 큼 작음
객체 할당 영역 스택

출처

  1. 공돌창고
  2. 아마군의 Dev로그
  3. 뻔뻔한 블로그
  4. C#이 보이는 그림책, 성안당