2017년 6월 1일 목요일

C# struct, value type, reference type

C++에서는 Class와 Struct가 거의 차이가 없어
method가 필요없는 data model은 struct로 지정해서 사용하던게 버릇이었는데
C#에서는 좀 상황이 달라서 찾아봄.

일단 C#에서의 Struct와 Class의 차이점은 아래 정리하였음.
http://charlie0301.blogspot.kr/2016/11/struct-vs-class-in-c.html

간단히 정리하면
https://msdn.microsoft.com/ko-kr/library/aa664471(v=vs.71).aspx

구조체는 여러 가지 중요한 점에서 클래스와 다릅니다.
  • 구조체는 값 형식입니다(11.3.1 단원).
  • 모든 구조체 형식은 암시적으로 클래스 System.ValueType에서 상속됩니다(11.3.2 단원).
  • 구조체 형식의 변수에 대입이 이루어지면 지정되는 값이 복사됩니다(11.3.3 단원).
  • 구조체의 기본값은 모든 값 형식 필드를 기본값으로 설정하고 모든 참조 필드를 null로 설정했을 때 생성되는 값입니다(11.3.4 단원).
  • Boxing과 unboxing 연산은 구조체 형식과 object 간의 변환에 필요합니다(11.3.5 단원).
  • this의 의미는 구조체의 경우 다릅니다(11.3.6 단원).
  • 구조체에 대한 인스턴스 필드 선언은 변수 이니셜라이저를 포함할 수 없습니다(11.3.7 단원).
  • 구조체는 매개 변수가 없는 인스턴스 생성자를 선언할 수 없습니다(11.3.8 단원).
  • 구조체는 소멸자를 선언할 수 없습니다(11.3.9 단원).


요약 첫줄에도 나오듯이 구조체는 value type이라서
구조체 변수간 대입 시 변수의 값을 전달하게 된다는것이 중요.

그럼 자연스레 드는 궁금증은 call by reference, call by value일 것 같은데..
아래 링크를 정독하면 아주 도움이 된다.

http://www.yoda.arachsys.com/csharp/parameters.html

모든 상황에서 다 맞는 것은 아니지만 ...

변수간 대입은 value type이면 value를
reference type이면 reference를...

함수 parameter일 경우
기본적으로 call by value인데
value type의 value는 value, reference type의 value는 reference를 (왠지 말장난같은..)

정도로 요약하여 생각하면 되지 않을까 생각하지만

case마다 딱 들어맞지 않아 한번 정독이 꼭 필요함!!!


댓글 없음:

댓글 쓰기