CS 공부

[C#] 클래스와 구조체 (Class & Structure)

때류기 2024. 8. 4. 23:13

C#은 객체 지향 프로그래밍(OOP)을 기반으로 하는 언어로, 클래스와 구조체는 데이터를 정의하고 조작하는 두 가지 주요 방식 입니다. 둘 다 데이터와 메서드를 포함할 수 있지만, 사용되는 방식과 목적에는 중요한 차이점이 있습니다.

 

 

 

1. 클래스(Class)

클래스는 객체 지향 프로그래밍의 핵심 개념으로, 객체의 청사진(buleprint) 역할을 합니다. 클래스는 데이터(필드)와 기능(메서드)을 포함할 수 있으며, 이를 통해 객체를 생성할 수 있습니다.

 

  • 참조 타입: 클래스는 참조 타입입니다. 객체는 힙(heap) 메모리에 할당되며, 객체에 대한 참조(reference)가 변수에 저장됩니다.
  • 상속 가능: 상속을 통해 다른 클래스의 멤버를 확장할 수 있습니다.
  • 생성자: 생성자를 통해 객체가 생성될 때 초기화할 수 있습니다.
  • 소멸자: 소멸자를 통해 객체가 더 이상 필요하지 않을 때 정리할 작업을 정의할 수 있습니다.

 

예제:

using System;

public class Person
{
    // 필드
    private string name;
    private int age;

    // 생성자
    public Person(string name, int age)
    {
        this.name = name;
        this.age = age;
    }

    // 메서드
    public void Introduce()
    {
        Console.WriteLine($"Hello, my name is {name} and I am {age} years old.");
    }
}

public class Program
{
    public static void Main()
    {
        // 객체 생성
        Person person = new Person("John", 30);
        person.Introduce(); // 출력: Hello, my name is John and I am 30 years old.
    }
}

 

 

 

2. 구조체

구조체는 값 타입으로, 주로 작은 데이터 구조를 정의할 때 사용됩니다. 구조체는 클래스와 유사하게 데이터와 메서드를 포함할 수 있지만, 몇 가지 중요한 차이점이 있습니다.

 

  • 값 타입: 구조체는 값 타입입니다. 변수에 데이터를 저장하며, 메모리에 연속적으로 할당 됩니다.
  • 상속 불가: 구조체는 다른 구조체가 클래스에서 상속할 수 없습니다.
  • 생성자: 매개변수가 있는 생성자를 정의할 수 있지만, 매개변수가 없는 생성자는 자동으로 제공됩니다. 또한 매개변수가 있을 경우 매개변수를 생성자 내에서 초기화를 해야합니다.
  • 불변성: 구조체는 불변(immutable) 데이터 타입으로 사용되는 경우가 많습니다.

 

예제:

using System;

public struct Point
{
    // 필드
    public int X { get; set; }
    public int Y { get; set; }

    // 생성자
    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }

    // 메서드
    public void Display()
    {
        Console.WriteLine($"Point is at ({X}, {Y})");
    }
}

public class Program
{
    public static void Main()
    {
        // 구조체 인스턴스 생성
        Point point = new Point(10, 20);
        point.Display(); // 출력: Point is at (10, 20)
    }
}

 

 

 

3. 클래스와 구조체의 차이

 

1. 메모리 할당:

  • 클래스: 힙(heap)에 할당되며, 객체가 대한 참조가 변수에 저장됩니다. 참조 타입입니다.
  • 구조체: 스택(stack)에 할당되며, 데이터가 직접 변수에 저장됩니다. 값 타입입니다.

 

2. 상속:

  • 클래스: 상속이 가능합니다. 한 클래스는 다른 클래스에서 상속받아 기능을 확장할 수 있습니다.
  • 구조체: 상속이 불가능합니다. 구조체는 다른 구조체나 클래스를 상속할 수 없습니다.

 

3. 기본 생성자:

  • 클래스: 명시적으로 정의되지 않은 경우, 기본 생성자가 제공됩니다.
  • 구조체: 매개변수가 없는 기본 생성자는 자동으로 제공되지만, 명시적으로 정의할 수는 없습니다.

 

4. 불변성:

  • 클래스: 상태를 변경할 수 있습니다.(가변성)
  • 구조체: 주로 불변 데이터 타입으로 사용되며, 상태 변경을 최소화합니다.

 

5. 성능:

  • 클래스: 힙에 할당되고 가비지 컬렉션의 대상이 되므로, 구조체에 비해 메모리 할당과 해제가 상대적으로 느릴 수 있습니다.
  • 구조체: 스택에 할당되므로 메모리 할당과 해제가 빠릅니다. 작은 데이터 구조에 적합합니다.

 

 

 

4. 클래스와 구조체의 사용 시기

클래스와 구조체는 각각의 특성과 용도에 맞게 사용해야 합니다. 각 경우에 대해 언제나 클래스나 구조체를 선택하는 것이 적절한지에 대해 설명하겠습니다.

 

 

클래스를 사용해야 할때

1. 상속이 필요한 경우:

  • 클래스는 상속을 지원하므로, 객체 간의 계층 구조를 정의하고 재사용 가능한 기능을 구현할 수 있습니다.
public class Animal
{
    public void Eat() { }
}

public class Dog : Animal
{
    public void Bark() { }
}

 

2. 참조로 데이터 공유가 필요한 경우:

  • 객체가 여러 곳에서 참조되어야 하거나, 변경된 데이터가 모든 참조에 반영되어야 하는 경우 클래스가 적합합니다.
public class Person
{
    public string Name { get; set; }
}

public class Example
{
    public static void Main()
    {
        Person person1 = new Person { Name = "John" };
        Person person2 = person1;
        person2.Name = "Doe";

        Console.WriteLine(person1.Name); // 출력: Doe
    }
}

 

3. 큰 데이터 구조:

  • 클래스는 힙(heap)에 할당되므로, 큰 데이터 구조나 복잡한 객체를 다룰 때 유용합니다.

 

4. 가변 상태를 가지는 객체:

  • 객체의 상태가 자주 변경되거나, 다양한 상태를 가져야 하는 경우 클래스가 적합합니다.

 

5. 수명 주기 관리가 필요한 경우:

  • 객체의 생성과 소멸 시점에 특별한 처리가 필요할 때, 클래스의 생성자와 소멸자를 통해 관리할 수 있습니다.

 

 

구조체를 사용해야 할 때

1. 작고 간단한 데이터 구조:

  • 구조체는 값 타입이며, 작은 데이터 구조를 정의할 때 적합합니다. 예를 들어, 좌표, 색상, 시간 간격 등의 간단한 데이터를 표현할 때 유용합니다.
public struct Point
{
    public int X { get; set; }
    public int Y { get; set; }
}

 

2. 불변성(Immutable)

public struct ImmutablePoint
{
    public int X { get; }
    public int Y { get; }

    public ImmutablePoint(int x, int y)
    {
        X = x;
        Y = y;
    }
}

 

3. 메모리 효율성이 중요한 경우:

  • 구조체는 스택(stack)에 할당되며, 힙을 사용하지 않기 때문에 작은 데이터 구조에서 메모리 효율성을 높일 수 있습니다.

 

4. 상속이 필요없는 경우:

  • 구조체는 상속을 지원하지 않으므로, 상속 계층이 필요하지 않은 경우에 사용됩니다.

 

5. 자주 복사되는 데이터:

  • 값 타입인 구조체는 복사가 필요한 상황에서 효율적으로 사용될 수 있습니다. 예를 들어, 함수 호출 시 데이터를 전달하는 경우 등입니다.
public struct Rectangle
{
    public int Width { get; set; }
    public int Height { get; set; }
}

public class Example
{
    public static void Main()
    {
        Rectangle rect1 = new Rectangle { Width = 10, Height = 20 };
        Rectangle rect2 = rect1;
        rect2.Width = 30;

        Console.WriteLine(rect1.Width); // 출력: 10
    }
}

 

 

클래스와 구조체를 적절히 사용하면 코드의 효율성과 가독성을 높일 수 있습니다. 각자의 특성과 용도에 맞게 선택하여 사용해야 합니다.

 

 

 

 


지금까지 C# 클래스와 구조체에 대해 알아보았습니다.

현재 글의 내용 중 틀린 부분이나, 지적하실 내용이 있으시다면 언제든지 알려주세요! 읽어주셔서 감사합니다.

 

'CS 공부' 카테고리의 다른 글

[C#] 람다식(Lambda Expression)  (0) 2024.08.16
[C#] 변수 종류와 키워드  (0) 2024.08.09
[C#] 대리자 (Delegate)  (0) 2024.07.27
[C#] 메모리 구조  (0) 2024.07.22
[C#] 가비지 컬렉터 (Garbage Collector, GC)  (0) 2024.07.15