[C#] 구조체(Struct)

Running boy·2023년 8월 6일
0

컴퓨터 공학

목록 보기
13/36

구조체(Struct)

클래스와 같이 사용자가 정의할 수 있는 값 형식의 데이터 타입이다.

클래스 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 프로그래밍 - 정성태

profile
Runner's high를 목표로

0개의 댓글