ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20250321_(1) Struct 와 Class
    Study/C# 2025. 3. 23. 13:09

    Struct(구조체)와 Class(클래스)를 비교하기 앞서, C#에서 이 두 기능이 무엇을 표현하기 위한 건지 먼저 생각해 봅시다.

    둘 다

    1. 사용자 정의 자료형을 만드는데 사용되고,
    2. 내부에 필드 또는 메서드 등을 포함할 수 있습니다.

    그럼에도 불구하고 C#에서 구조체와 클래스가 따로 존재하는 이유는 무엇일까요? 각각의 차이를 하나씩 뜯어보며 비교해 봅시다!


    1. 저장되는 메모리 영역의 차이

    구조체는 기본적으로 값(Value) 타입이고, 클래스는 참조(Reference) 타입입니다. 이러한 특성 때문에 저장되는 메모리 영역에 차이가 생깁니다.

    Struct

    • 구조체는 변수에 값 자체가 저장되며, Stack 영역에 직접 저장됩니다.
    • 값 자체가 저장된다는 것은 함수 호출 시 깊은 복사가 일어난다는 의미입니다.
    • 메모리 사용이 명확하고 가볍게 동작합니다.

    Class

    • 클래스는 변수에 저장되는 것이 실제 객체의 주소(참조)이며, 실제 데이터는 Heap 영역에 저장됩니다.
    • 값이 아닌 주소가 저장되므로 함수 호출 시 얕은 복사가 일어납니다.
    • Garbage Collection을 통해 메모리가 자동 관리됩니다. (Garbage Collection에 대해서는 향후 포스팅으로 정리하겠습니다.)

    2. 사용 목적의 차이

    저장되는 메모리 영역의 특성에 따라 사용 목적에도 차이가 있습니다.

    Struct

    • 값 타입이라 Heap 할당을 줄일 수 있어, 성능상 이점이 있습니다.
    • Stack 영역에서 빠르게 처리 가능하며, 크기가 작고 단순한 데이터(예: 좌표, 색상 등)를 표현하기에 적합합니다.

    Class

    • 상속(Inheritance)을 지원하여 객체지향 프로그래밍의 핵심 기법을 활용할 수 있습니다. (구조체는 상속을 지원하지 않음)
    • Heap 영역에서 메모리가 자동 관리되므로 복잡하고 상태가 자주 바뀌는 객체를 관리하기에 적합합니다.

    이 둘의 차이를 간단한 예제 코드로 비교해볼까요?

    // 구조체 예시
    struct Point
    {
        public int X;
        public int Y;
    
        public Point(int x, int y)
        {
            X = x;
            Y = y;
        }
    }
    
    // 클래스 예시
    class Person
    {
        public string Name;
        public int Age;
    
        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }
    }
    
    // 사용 예시
    Point p1 = new Point(10, 20);
    Point p2 = p1; // 깊은 복사
    p2.X = 30;     // p1.X는 변하지 않음
    
    Person person1 = new Person("Lily", 25);
    Person person2 = person1; // 얕은 복사
    person2.Name = "Joy";     // person1.Name도 "Joy"으로 바뀜

    정리

    Struct는 작고 단순한 데이터를 빠르게 다룰 때 사용하고(성능 우선), Class는 복잡한 객체 관리 및 유지보수와 확장성이 중요할 때 사용합니다.

    'Study > C#' 카테고리의 다른 글

    20250321_(8) 🌟 Static  (0) 2025.03.24
    20250321_(7) Operator Overloading  (0) 2025.03.24
    20250321_(6) Constructor  (0) 2025.03.24
    20250321_(5) Method  (0) 2025.03.24
    20250321_(4) Fields & Properties(Getter, Setter)  (0) 2025.03.24
Designed by Tistory.