C# 구조체(Struct) 이해하기: 값 타입 정의와 사용법
C#에서 구조체(Structure)는 값 타입(Value Type) 데이터 타입입니다. 서로 다른 데이터 타입의 관련 데이터를 하나의 변수에 담을 수 있게 해줍니다. struct 키워드로 생성합니다.
구조체는 레코드(Record)를 표현하는 데 사용됩니다. 예를 들어 도서관의 책 정보를 관리하려면 제목, 저자, 주제, 책 ID 등 다양한 타입의 속성을 하나의 단위로 묶어야 합니다.
구조체 정의
struct 문으로 정의하며, 프로그램에서 사용할 둘 이상의 멤버를 가진 새로운 데이터 타입을 정의합니다.
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
};
구조체 사용 예제
using System;
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
}
public class testStructure
{
public static void Main(string[] args)
{
Books Book1; // Book1 선언 (값 타입이므로 new 없이도 가능)
Books Book2;
// Book1 데이터 설정
Book1.title = "C Programming";
Book1.author = "Nuha Ali";
Book1.subject = "C Programming Tutorial";
Book1.book_id = 6495407;
// Book2 데이터 설정
Book2.title = "Telecom Billing";
Book2.author = "Zara Ali";
Book2.subject = "Telecom Billing Tutorial";
Book2.book_id = 6495700;
// 출력
Console.WriteLine("Book 1 title : {0}", Book1.title);
Console.WriteLine("Book 1 author : {0}", Book1.author);
Console.WriteLine("Book 1 subject : {0}", Book1.subject);
Console.WriteLine("Book 1 book_id : {0}", Book1.book_id);
Console.WriteLine("Book 2 title : {0}", Book2.title);
Console.WriteLine("Book 2 author : {0}", Book2.author);
Console.WriteLine("Book 2 subject : {0}", Book2.subject);
Console.WriteLine("Book 2 book_id : {0}", Book2.book_id);
Console.ReadKey();
}
}
C# 구조체의 특징
C# 구조체는 전통적인 C/C++ 구조체와 상당히 다릅니다. 주요 특징:
- 메서드, 필드, 인덱서, 프로퍼티, 연산자 메서드, 이벤트를 가질 수 있음
- 생성자 정의 가능하지만 소멸자(destructor)는 정의 불가. 기본 생성자는 자동 정의되며 변경 불가
- 클래스와 달리 다른 구조체나 클래스를 상속받을 수 없음
- 다른 구조체나 클래스의 기반(base)으로 사용 불가
- 하나 이상의 인터페이스 구현 가능
- 멤버를
abstract, virtual, protected로 지정 불가
new 연산자 사용 시 적절한 생성자 호출. new 없이도 인스턴스화 가능 (값 타입 특성)
new 없이 생성 시 필드는 미할당 상태. 모든 필드 초기화 전까지 객체 사용 불가
클래스 vs 구조체
| 비교 항목 | 클래스 (Class) | 구조체 (Struct) |
| 타입 분류 | 참조 타입 (Reference Type) | 값 타입 (Value Type) |
| 상속 지원 | O (단일 상속) | X (구조체/클래스 상속 불가) |
| 기본 생성자 | 사용자 정의 가능 | 자동 제공, 재정의 불가 |
| 메모리 할당 | 힙 (Heap) | 스택 (Stack) - 주로 |
| Null 허용 | O | 기본적으로 X (Nullable<T> 사용 시 O) |
| 소멸자 | O | X |
메서드를 포함한 구조체 예제 (캡슐화 적용)
using System;
struct Books
{
private string title;
private string author;
private string subject;
private int book_id;
// 생성자 (매개변수 있는 생성자만 가능)
public Books(string t, string a, string s, int id)
{
title = t; author = a; subject = s; book_id = id;
}
public void GetValues(string t, string a, string s, int id)
{
title = t; author = a; subject = s; book_id = id;
}
public void Display()
{
Console.WriteLine("Title : {0}", title);
Console.WriteLine("Author : {0}", author);
Console.WriteLine("Subject : {0}", subject);
Console.WriteLine("Book_id : {0}", book_id);
}
}
public class testStructure
{
public static void Main(string[] args)
{
// new 연산자 사용 (생성자 호출)
Books Book1 = new Books("C Programming", "Nuha Ali", "C Programming Tutorial", 6495407);
Books Book2 = new Books("Telecom Billing", "Zara Ali", "Telecom Billing Tutorial", 6495700);
Book1.Display();
Book2.Display();
Console.ReadKey();
}
}
언제 구조체를 쓸까? 작은 데이터 구조(16바이트 이하 권장), 불변(immutable) 객체, 값 의미론이 중요한 경우(예: 좌표 Point, 복소수, 날짜 범위 등)에 구조체를 사용하세요. 큰 데이터나 참조 의미론이 필요하면 클래스가 적절합니다.