1. 구조체
C#에서 구조체는 스택에 할당된 경량 데이터 구조를 나타내는 값 유형입니다. 구조체는 관련 데이터 필드의 작은 집합을 캡슐화하는 데 사용됩니다. 참조 유형인 클래스와 달리 구조체는 값 유형으로, 구조체 변수가 선언된 메모리 위치에 직접 데이터를 저장합니다. 구조체는 점, 색상 또는 크기와 같은 간단한 데이터 유형을 표현하는 데 자주 사용됩니다. 또한 사용자가 만든 사용자 지정 데이터 유형과 같이 더 복잡한 데이터 유형을 나타내는 데에도 사용할 수 있습니다.
2. 구조체의 특징
값 유형: 구조체는 값 유형이므로 선언된 메모리 위치에 직접 저장됩니다. 구조체 변수가 다른 구조체 변수에 할당되거나 메서드 인수로 전달되면 전체 구조체 데이터의 복사본이 만들어집니다.
메모리 할당: 구조체는 일반적으로 힙 할당 방식이 아닌 스택 할당 방식을 사용합니다. 스택에 직접 저장되므로 가비지 컬렉션이 필요하지 않습니다. 따라서 구조체 연산을 클래스에 비해 더 빠르고 효율적으로 수행할 수 있습니다.
가볍습니다: 구조체는 작고 독립적인 데이터 구조를 표현하기 위한 것입니다. 정수, 부울 또는 관련 값의 작은 컬렉션과 같은 간단한 데이터 유형을 저장하는 데 자주 사용됩니다. 메모리 사용량 측면에서 가볍고 클래스에 비해 차지하는 공간이 더 작습니다.
값 의미론: 구조체에는 값 의미론이 있어, 구조체가 다른 구조체에 할당되거나 메서드 인수로 전달되면 구조체의 복사본이 만들어집니다. 각 복사본은 독립적으로 작동하며, 한 복사본을 수정해도 다른 복사본에는 영향을 미치지 않습니다.
상속이 없습니다: 클래스와 달리 구조체는 다른 구조체나 클래스로부터 상속할 수 없으며, 파생되거나 다른 타입의 기반으로 사용될 수 없습니다. 구조체는 독립형 엔티티이며 상속 계층 구조에 참여하지 않습니다.
기본 생성자: 구조체에는 모든 필드를 기본값으로 초기화하는 매개변수 없는 기본 생성자가 자동으로 있습니다. 이 기본 생성자는 암시적으로 제공되며 명시적으로 정의할 수 없습니다.
제한된 기능: 구조체에는 클래스에 비해 몇 가지 제한 사항이 있습니다. 예를 들어 소멸자를 갖거나 기본 유형으로 사용할 수 없습니다. 또한 값 유형이기 때문에 null이 될 수 없습니다.
구조체는 값 의미를 가지며 복잡한 동작이나 상속이 필요하지 않은 작고 독립적인 데이터 구조에 C#에서 일반적으로 사용됩니다. 구조체는 성능 향상, 메모리 사용량 감소 또는 불변 데이터 구조를 표현하기 위해 자주 사용됩니다. C#에서 구조체의 예로는 정수, 부울, 부동 소수점 같은 기본 데이터 유형과 포인트, 직사각형, 색상 같은 사용자 정의 구조체가 있습니다.
3. 구조체의 예시
다음은 C# 구조체의 예입니다.
struct Point
{
public int X { get; set; }
public int Y { get; set; }
}
이 구조체는 2차원 공간의 점을 나타냅니다. 이 구조체에는 점의 좌표를 나타내는 두 가지 속성, 즉 X와 Y가 있습니다.
다음은 포인트 구조체를 사용하는 방법의 예입니다.
Point point = new Point();
point.X = 10;
point.Y = 20;
이 코드는 새 Point 객체를 생성하고 해당 객체의 X 및 Y 좌표를 각각 10과 20으로 설정합니다.
4. 구조체의 장점
구조체는 스택에 할당되므로 효율적입니다.
구조체는 암시적으로 기본 유형으로 변환할 수 있습니다.
구조체는 간단한 데이터 유형을 표현하는 데 사용할 수 있습니다.
구조체는 사용자 정의 데이터 유형을 만드는 데 사용할 수 있습니다.
5. 구조체의 단점
구조체는 클래스만큼 유연하지 않습니다.
구조체는 상속할 수 없습니다.
구조체는 일반 유형 인수로 사용할 수 없습니다.
1. 클래스
C#에서 클래스는 개체를 정의하고 데이터와 동작을 캡슐화하는 데 사용되는 기본 구성 요소입니다. 인스턴스라고 하는 개별 개체를 생성할 수 있는 청사진 또는 템플릿 역할을 합니다. 클래스는 C#에서 객체 지향 프로그래밍(OOP)의 기본 부분이며 코드를 구성하고 구조화하는 방법을 제공합니다. C#에서 클래스는 "class" 키워드를 사용하여 정의됩니다.
2. 클래스의 특징
객체 지향 프로그래밍(OOP): C#은 객체 지향 프로그래밍 언어이며 클래스는 OOP 개념을 구현하는 주요 수단입니다. 클래스를 사용하면 객체가 가질 속성(데이터)과 메서드(동작)를 정의할 수 있습니다.
객체의 청사진: 클래스는 객체의 구조와 동작을 정의하는 청사진 또는 템플릿 역할을 합니다. 객체가 필드 또는 속성의 형태로 보유할 수 있는 데이터와 메서드의 형태로 수행할 수 있는 작업을 지정합니다.
객체 및 인스턴스: 객체는 클래스의 인스턴스입니다. 객체를 만들면 클래스를 인스턴스화하는데, 이는 메모리에 해당 클래스의 고유한 인스턴스를 생성한다는 의미입니다. 각 객체에는 고유한 데이터 집합이 있으며 클래스에 정의된 메서드에 따라 작업을 수행할 수 있습니다.
데이터와 동작: 클래스는 데이터와 동작을 모두 결합합니다. 데이터는 객체의 상태 또는 속성을 보유하는 필드 또는 속성으로 표현됩니다. 동작은 객체가 수행할 수 있는 작업 또는 연산을 나타내는 메서드로 정의됩니다.
캡슐화: 클래스는 데이터 및 관련 동작을 단일 단위로 묶는 개념인 캡슐화를 제공합니다. 이를 통해 객체의 내부 데이터에 대한 액세스를 제어할 수 있으며 데이터 무결성을 보장하고 구현 세부 정보를 숨길 수 있는 방법을 제공합니다.
상속: 클래스는 상속 계층 구조에 참여할 수 있으며, 여기서 파생 클래스는 기본 클래스의 특성(필드, 속성 및 메서드)을 상속합니다. 이를 통해 코드를 재사용하고 보다 일반적인 클래스를 기반으로 특수한 클래스를 만들 수 있습니다.
모듈성 및 재사용성: 클래스는 코드 모듈성과 재사용성을 촉진합니다. 클래스를 사용하면 여러 번 인스턴스화하여 코드베이스의 여러 부분에서 사용할 수 있는 재사용 가능한 컴포넌트를 정의할 수 있습니다.
정적 멤버: 클래스에는 정적 필드, 속성, 메서드와 같은 정적 멤버도 포함할 수 있습니다. 이러한 멤버는 클래스의 인스턴스가 아닌 클래스 자체에 속합니다. 클래스의 인스턴스를 만들지 않고도 액세스할 수 있으며 클래스의 모든 인스턴스 간에 공유됩니다.
3. 클래스의 예시
다음은 C# 클래스 정의의 예입니다
class Car {
public string Name { get; set; }
public int Year { get; set; }
public void Drive() {
Console.WriteLine("The car is driving");
}
}
이 클래스는 두 개의 속성(Name 및 Year)과 메서드(Drive)를 정의합니다. 이 클래스에서 생성되는 모든 객체는 이러한 프로퍼티와 메서드를 갖게 됩니다.
클래스에서 개체를 만들려면 "new" 키워드를 사용합니다. 예를 들어 다음 코드는 새 Car 객체를 만듭니다.
Car myCar = new Car();
그런 다음 객체의 속성을 설정하고 해당 메서드를 호출할 수 있습니다. 예를 들어 다음 코드는 myCar의 Name 속성을 "내 자동차"로 설정하고 Drive 메서드를 호출합니다.
myCar.Name = "My Car";
myCar.Drive();
그러면 콘솔에 다음과 같은 출력이 인쇄됩니다.
The car is driving
클래스는 C#에서 코드와 데이터를 구성하는 강력한 방법입니다. 클래스를 사용하면 복잡한 애플리케이션을 빌드하는 데 사용할 수 있는 재사용 가능한 구성 요소를 만들 수 있습니다.
4. 클래스의 장점
재사용 가능성: 클래스는 여러 애플리케이션에서 재사용할 수 있습니다. 동일한 코드를 반복해서 작성할 필요가 없으므로 시간과 노력을 절약할 수 있습니다.
데이터 캡슐화: 클래스는 데이터를 캡슐화할 수 있으므로 데이터가 외부에서 보이지 않습니다. 따라서 코드의 보안이 강화되고 유지 관리가 쉬워집니다.
다형성: 클래스는 다형성을 구현하는 데 사용할 수 있으며, 이는 서로 다른 유형의 객체를 동일한 방식으로 처리할 수 있음을 의미합니다. 이를 통해 코드를 더 유연하고 쉽게 확장할 수 있습니다.
1. 결론
구조체를 사용할지 클래스를 사용할지 결정하는 것은 애플리케이션의 특정 요구 사항과 표현해야 하는 데이터의 특성에 따라 달라진다는 점에 유의해야 합니다. C#에서 구조체와 클래스 중 하나를 선택할 때는 데이터의 크기와 복잡성, 메모리 사용량, 성능, 원하는 의미론 등의 요소를 고려하세요.
'공부 > C#' 카테고리의 다른 글
C#으로 작성된 디자인 패턴 (0) | 2023.06.18 |
---|---|
리플렉션(Reflection)이란? (0) | 2023.06.10 |
람다식(Lambda)이란? (0) | 2023.06.10 |
C#에서 클래스(Class)와 구조체(Struct)의 차이점 (0) | 2023.04.07 |
평면과 구의 충돌을 어떻게 판단하는가? (0) | 2023.03.17 |