클래스와 같이 사용자가 정의할 수 있는 값 형식의 데이터 타입이다.
클래스 vs 구조체
1. 클래스는 인스턴스 생성에 new 키워드를 반드시 써야 되지만 구조체는 선택 사항이다.
2.구조체는 기본 생성자를 명시적으로 정의할 수 없다.(C# 10부터 가능하다.)
3. 매개변수가 있는 생성자를 정의했을 때, 구조체는 자동으로 기본 생성자를 지원하지만 클래스는 직접 정의해야 한다.
4. 구조체는 반드시 생성자에서 모든 필드를 초기화해줘야 한다.
5. 구조체는 상속을 받을 수 없다. (단 인터페이스 상속은 가능하다.)
6. 구조체는 종료자를 정의할 수 없다. (값 형식이라 대부분은 GC의 관리 대상이 아니기 때문이다.)
기본형을 할당할 때도 구조체와 유사하게 할 수 있다.
struct Vector
{
public float x;
public float y;
/*
public Vector() // C# 10부터 가능
{
this.x = 0;
this.y = 0;
}
*/
public Vector(float x, float y)
{
this.x = x;
this.y = y;
}
public override string ToString()
{
return x + " " + y;
}
}
Vector v1 = new Vector();
Vector v2;
v2.x = 0;
v2.y = 0;
Vector v3 = new Vector(0, 0);
Console.WriteLine(v1.ToString());
Console.WriteLine(v2.ToString());
Console.WriteLine(v3.ToString());
int n1 = new int();
int n2;
n2 = 0;
int n3 = 0;
Console.WriteLine(n1);
Console.WriteLine(n2);
Console.WriteLine(n3);
값 형식에 속하는 모든 타입은 변수를 선언하면 메모리가 0으로 초기화된다.
다만 컴파일러는 이러한 변수를 사용할 때 컴파일 에러를 발생시킨다.
int n;
//n = 0;
Console.WriteLine(n); // 컴파일 에러 발생
그렇기 때문에 선언한 값 형식의 변수는 사용하기 전에 반드시 명시적으로 정의해야 한다. (물론 참조 형식도 당연히 null로 초기화해줘야 한다.)
참고 자료
시작하세요! C# 10 프로그래밍 - 정성태