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 |