반응형
오랜만에 다시 C# 공부를!! ㅎㅎ
오랜만에 공부하면서 C++와 비슷한 점도 있겠지만, 차이점도 존재한다는 것을 배웠습니다.
그런 김에 class와 struct의 차이점을 작성해 보겠습니다.
`class` (클래스)
- 참조 타입 (Reference Type):
- 클래스는 힙 메모리에 저장됩니다.
- 객체의 실제 데이터를 가리키는 참조를 저장합니다.
- 동일한 객체를 여러 변수가 참조할 수 있으며, 객체의 데이터가 공유됩니다.
- 상속 가능 (Inheritance):
- 클래스는 상속을 지원합니다. 다른 클래스로부터 상속받아 기능을 확장할 수 있습니다.
- 다형성 (Polymorphism)을 지원합니다.
- 가비지 컬렉션 (Garbage Collection):
- 클래스 객체는 더 이상 참조되지 않을 때 가비지 컬렉터에 의해 메모리가 해제됩니다.
- 디폴트 생성자:
- 매개변수가 없는 디폴트 생성자를 제공합니다.
- 복잡한 데이터 구조:
- 클래스를 사용하여 복잡한 데이터 구조와 객체를 만들 수 있습니다.
- 메서드, 속성, 이벤트 등을 포함할 수 있습니다.
예제
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void Display()
{
Console.WriteLine($"Name: {Name}, Age: {Age}");
}
}
`struct` (구조체)
- 값 타입 (Value Type):
- 구조체는 스택 메모리에 저장됩니다.
- 객체의 실제 데이터를 저장합니다.
- 값을 직접 복사하여 전달하므로, 각 변수는 독립적인 데이터를 가집니다.
- 상속 불가:
- 구조체는 상속을 지원하지 않습니다.
- 다형성을 지원하지 않습니다.
- 메모리 효율성:
- 작은 크기의 데이터 구조를 위해 메모리 효율적입니다.
- 객체의 크기가 작고, 간단한 데이터 구조에 적합합니다.
- 디폴트 생성자 없음:
- 구조체는 매개변수가 없는 디폴트 생성자를 가질 수 없습니다. 모든 필드를 초기화하는 생성자를 제공해야 합니다.
- 불변 객체 (Immutable Object):
- 구조체는 일반적으로 불변 객체로 설계하는 것이 좋습니다.
- 구조체의 필드는 `readonly`로 선언하여 불변성을 유지할 수 있습니다.
예제
struct Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y)
{
X = x;
Y = y;
}
public void Display()
{
Console.WriteLine($"X: {X}, Y: {Y}");
}
}
차이점 요약
특성 | 클래스 (`class`) | 구조체 (`struct`) |
타입 | 참조 타입 (Reference Type) | 값 타입 (Value Type) |
저장 위치 | 힙 (Heap) | 스택 (Stack) |
상속 | 지원 (Inheritance 가능) | 지원하지 않음 (No Inheritance) |
가비지 컬렉션 | 가비지 컬렉션에 의해 관리 | 스택에서 자동으로 관리 |
디폴트 생성자 | 매개변수가 없는 디폴트 생성자 제공 | 디폴트 생성자 없음 |
메모리 효율성 | 복잡한 데이터 구조에 적합 | 작은 크기의 간단한 데이터 구조에 적합 |
불변성 | 불변성 보장되지 않음 | 일반적으로 불변 객체로 설계하는 것이 좋음 |
다형성 | 지원 (Polymorphism 가능) | 지원하지 않음 (No Polymorphism) |
사용 예제와 함께 차이 설명
클래스 예제
class Program
{
static void Main(string[] args)
{
Person person1 = new Person { Name = "Alice", Age = 30 };
Person person2 = person1;
person2.Name = "Bob";
person1.Display(); // 출력: Name: Bob, Age: 30
person2.Display(); // 출력: Name: Bob, Age: 30
}
}
이 예제에서 `person1`과 `person2`는 같은 객체를 참조합니다. 따라서 `person2`의 `Name`을 변경하면 `person1`의 `Name`도 변경됩니다.
구조체 예제
class Program
{
static void Main(string[] args)
{
Point point1 = new Point(10, 20);
Point point2 = point1;
point2 = new Point(30, 40);
point1.Display(); // 출력: X: 10, Y: 20
point2.Display(); // 출력: X: 30, Y: 40
}
}
이 예제에서 ` point1 `과 ` point2 `는 독립적인 값을 가집니다. ` point2 `를 변경해도 ` point1 `의 값은 변경되지 않습니다.
결론
- 클래스는 복잡한 데이터 구조와 객체지향 프로그래밍의 기능을 필요로 하는 경우에 적합합니다.
- 구조체는 메모리 효율성이 중요한 간단한 데이터 구조에 적합합니다.
반응형
'C#' 카테고리의 다른 글
[C#] 인터페이스와 추상 클래스 (1) | 2024.11.18 |
---|---|
[C#] Csv 파일을 Json 파일로 바꾸기 (3) | 2024.11.14 |
[C#] Unity에서 ProtoBuf 사용하는 방법 (1) | 2024.11.04 |
[C#] NLog 라이브러리를 사용하는데 로그가 안 찍히는 해결 방법 (0) | 2024.10.28 |
[C#] Parse() 와 TryParse()는 무슨 차이점이 있을까? (0) | 2024.08.02 |