본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 33. 클래스와 구조체

예전에 구조체는 값을 묶어 관리하는 거고

클래스는 행동까지 (함수까지) 묶어 관리하는거라고 했는데

거짓말이다.


구조체도 함수를 가질수있다.

C++ 에서는 구조체랑 클래스랑 기본 접근제한자를 제외하고 완전 동일하고

C# 에서 구조체는 좀더 가볍게 관리가능한 클래스로 보면된다.


근데 왜 이런거짓말을 했느냐하면 C에서 전통적인 구조체(struct) 는 값만 묶어 관리 할수있었는데 여기서 발전되어 Class가 나온것이기때문에..

전통적으로 이렇게 구분하기 때문이다. 설명하기도 편하고.. 암튼


1, C#에서의 구조체와 클래스

https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/structs

여기 잘 설명되어있는데 간단하게 설명하면


namespace ConsoleApp4
{
struct StructStudent
{
public string name;
public void Display()
{
Console.WriteLine(name);
}
}

class ClassStudent
{
public string name;
public void Display()
{
Console.WriteLine(name);
}
}
class Program
{
static void Change(StructStudent ss, ClassStudent cs)
{
ss.name = "After";
cs.name = "After";
}
static void Main(string[] args)
{
StructStudent ss;
ss.name = "Before";
ClassStudent cs = new ClassStudent();
cs.name = "Before";

Change(ss, cs);

ss.Display();
cs.Display();
}
}
}


1. 구조체는 값 형식이다

: 값형식이다. Change 함수를 거쳐도 Main의 ss의 name은 변경되지 아니하였다,

값형식이기에 함수로 넘어갈때마다 복사 과정이 걸릴것.


2. new (동적할당)없어도 된다, int double처럼,

: 동적할당이 아닌 정적할당 으로도 생성이 가능하다, 동적할당보다 정적이 빠르고 관리가 필요없어서

Class보다 속도, 메모리 면에서 이점이 있다.


3. 클래스 상속이 불가능, 상속받는것도 하는것도 불가능

: 말그대로

4. 인터페이스 구현은 가능

: 말그대로



즉 가볍게 만들만한 녀석이면 구조체를 이용하면 성능면에서 이득이다~ 라는것


공식적인 말에 따르면

"일반적으로 클래스는 좀 더 복잡한 동작이나 클래스 개체를 만든 후 수정하려는 데이터를 모델링하는 데 사용됩니다. 구조체는 구조체를 만든 후에 수정하지 않으려는 데이터를 주로 포함하는 작은 데이터 구조에 가장 적합합니다."

라고한다.

728x90