C#/.NET(13): struct와 class의 차이(1)
struct의 특징
struct와 class의 차이를 알기 전에 먼저 struct의 특징부터 이해해야 한다. (사실 struct라는 단어를 처음 들었을 때, C/C++ 에서 사용하는 구조체를 의미한다는 생각이 들었다. 하지만, C#의 struct는 조금 다른 것 같다.)
- System.ValueType 에서 상속된 Value Type이다.
- 값이 복사되어 전달된다.
- sealed 되어 있어 상속할 수 없다.
- 스택영역에 저장된다.
struct는 생성자(constructor)를 가질 수 있다.
constructor는 JAVA에서 클래스를 생성할 때, 값을 초기화해주기 위해 사용했던 기억이 있다.
C#의 struct도 constructor를 가질 수 있는데, 주위할 점이 있다.
C#의 constructor는 정의 시, 반드시 매개 변수를 포함시켜 정의해야 한다는 점이다.
아래는 struct가 construct를 가질 때, 컴파일이 불가한 예시이다.
struct Point
{
public int X;
public int Y;
// struct는 매개변수가 없는 constructor를 가질 수 없음
// 컴파일 불가
public Point()
{
}
// struct는 모든 필드가 constructor 안에 할당되어있어야 함
// 컴파일 불가
public Point(int x, int y)
{
}
}
다음은 struct가 construct를 가질 때, 컴파일이 가능한 예시이다.
using System;
namespace Struct
{
struct Point
{
public int X;
public int Y;
// 모든 필드에 값 할당
public Point(int a, int b)
{
X = a;
Y = b;
}
public void DoSomething()
{
Console.WriteLine($"{X}, {Y}");
}
}
internal class Program
{
static void Main(string[] args)
{
var obj = new Point(10, 20); // 생성자에 값 전달
obj.DoSomething();
}
}
}
필드의 정의
C#에서 필드는 class 또는 struct에서 직접 선언되는 모든 형식의 변수를 말한다.
struct는 destructors를 가질 수 없다.
struct가 constructor를 가질 수 있다면, destructor를 갖는 것도 당연하다. 하지만, struct는 destructor를 가질 수 없다.
먼저 struct가 value type임을 알아야 한다. value type은 값을 전달할 때, 스택영역에서 저장되고 복사된다.
예를 들어, 데이터베이스를 핸들링하는 구조체가 있고, 그 구조체의 마지막 실행부에 destructor가 있다고 생각해보자.
그리고 이 구조체에 있는 메소드를 콜하기 위해, 구조체가 복사되었다고 생각해보자.

복사된 구조체는 주어진 스레드를 실행하고 destructor에 의해 메모리에서 제거가 될 것이다.
그러면, 데이터베이스를 핸들링하던 복사된 구조체는 제거 되었기 때문에 데이터베이스와의 연결, 핸들링이 불가능한 끔찍한? 상황이 발생한다.

그런데 이 예시는 조금 어려운 예시인 것 같아 다른 블로그에서 쉬운 설명을 가져왔는데,
그 내용을 간추리면 struct는 Value Type으로 (보통) 스택에 생성되며 GC가 관리하지 않는다. 따라서 Destructor를 사용할 필요가 없다.
C#에서 struct를 지원하는 이유는 단순한 데이타를 스택에서 신속하게 사용하기 위해서이다. 좀 더 일반화 하면, class를 사용할 때와 struct를 사용할 때가 서로 다른 것이다.
이 정도로만 이해하고 있어도 될 것 같다…
댓글남기기