반응형

오랜만에 다시 C# 공부를!! ㅎㅎ

 

오랜만에 공부하면서 C++와 비슷한 점도 있겠지만, 차이점도 존재한다는 것을 배웠습니다.

 

그런 김에 class와 struct의 차이점을 작성해 보겠습니다.


`class` (클래스)
  1. 참조 타입 (Reference Type):
    1. 클래스는 힙 메모리에 저장됩니다.
    2. 객체의 실제 데이터를 가리키는 참조를 저장합니다.
    3. 동일한 객체를 여러 변수가 참조할 수 있으며, 객체의 데이터가 공유됩니다.
  2. 상속 가능 (Inheritance):
    1. 클래스는 상속을 지원합니다. 다른 클래스로부터 상속받아 기능을 확장할 수 있습니다.
    2. 다형성 (Polymorphism)을 지원합니다.
  3. 가비지 컬렉션 (Garbage Collection):
    1. 클래스 객체는 더 이상 참조되지 않을 때 가비지 컬렉터에 의해 메모리가 해제됩니다.
  4. 디폴트 생성자:
    1. 매개변수가 없는 디폴트 생성자를 제공합니다.
  5. 복잡한 데이터 구조:
    1. 클래스를 사용하여 복잡한 데이터 구조와 객체를 만들 수 있습니다.
    2. 메서드, 속성, 이벤트 등을 포함할 수 있습니다.

예제

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public void Display()
    {
        Console.WriteLine($"Name: {Name}, Age: {Age}");
    }
}

 


`struct` (구조체)
  1. 값 타입 (Value Type):
    1. 구조체는 스택 메모리에 저장됩니다.
    2. 객체의 실제 데이터를 저장합니다.
    3. 값을 직접 복사하여 전달하므로, 각 변수는 독립적인 데이터를 가집니다.
  2. 상속 불가:
    1. 구조체는 상속을 지원하지 않습니다.
    2. 다형성을 지원하지 않습니다.
  3. 메모리 효율성:
    1. 작은 크기의 데이터 구조를 위해 메모리 효율적입니다.
    2. 객체의 크기가 작고, 간단한 데이터 구조에 적합합니다.
  4. 디폴트 생성자 없음:
    1. 구조체는 매개변수가 없는 디폴트 생성자를 가질 수 없습니다. 모든 필드를 초기화하는 생성자를 제공해야 합니다.
  5. 불변 객체 (Immutable Object):
    1. 구조체는 일반적으로 불변 객체로 설계하는 것이 좋습니다.
    2. 구조체의 필드는 `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#] Parse() 와 TryParse()는 무슨 차이점이 있을까?  (0) 2024.08.02

+ Recent posts