반응형
01 가장 큰 차이점은 상속 가능의 여부
구조체는 상속이 안된다. 그렇다면 구조체가 필요없는거 아닐까? C와 C# 간의 호환성 때문에 C#에서도 C코드를 돌릴 수 있도록 남겨둔 것이다.
02 타입 여부
구조체는 값 타입, 클래스는 참조 타입이다.
간단한 예시로 알아보자
재산이 많은 할아버지가 자손에게 재산을 상속하고 싶은데 알고보니 재산이 구조체로 선언되어있어서 재산을 상속할 수 없다. 아래와 같이 코드를 작성하면 오류가 난다.
struct Father
{
public void fathermoney()
{
}
}
struct Son : Father
{
public void sonmoney()
{
}
}
class main
{
public static void Main()
{
Father father;
father.fathermoney();
Son son;
son.sonmoney();
}
}
상속을 받을 수 있도록 변경해보자
class Father
{
public void fathermoney()
{
Console.WriteLine("아버지 재산");
}
}
class Son : Father
{
public void sonmoney()
{
Console.WriteLine("아들 재산");
}
}
class main
{
public static void Main()
{
Father father = new Father(); // new키워드를 써서 메모리를 할당
father.fathermoney();
Son son = new Son();
son.sonmoney();
son.fathermoney(); // 아빠 재산에 접근 가능
}
}
결과적으로
구조체는 스택에 바로 할당되기 때문에 가비지 컬렉션이 발생하지 않고 클래스는 인스턴스를 생성할 때마다 힙 메모리에 할당되므로 값을 폐기하기 위해서는 가비지 컬렉션이 필요하다.
그렇다면 구조체만 사용하는게 좋을까? 아니다. 스택의 크기는 제한적이기 때문에 너무 많은 양을 가지고 있다면 스택 오버플로우가 발생할 수 있다.
반응형
'유니티 공부 > C# 문법' 카테고리의 다른 글
C# - SOLID 원칙 (0) | 2024.05.06 |
---|---|
C# - const와 readonly (0) | 2024.04.09 |
C# 문법 - 값 타입(Value type)과 참조 타입(Reference type) (0) | 2024.03.29 |
C# - SortedSet, SortedDictonary (기본생성자, IComparer생성자) (0) | 2024.03.17 |
C# - Set과 HashSet(Add,Remove,Contains,IntersectWith,UnionWith) (0) | 2024.02.20 |
댓글