struct
, class
, array
, list
는 C#에서 데이터 타입의 범주에 속하긴 하지만, 기본적인 데이터 타입(int
, double
, bool
등)과는 차이가 있습니다. 이들은 주로 데이터를 구조화하고 관리하는 더 복합적인 방식으로, 특정 상황에 적합하게 설계되었습니다. 각각의 특징과 용도를 하나씩 살펴보겠습니다.
1. struct (구조체)
struct
는 C#에서 값 타입을 기반으로 하는 사용자 정의 데이터 타입입니다. 주로 작은 데이터 집합을 표현할 때 사용됩니다. struct
는 메모리 상에서 스택에 저장되어 빠르게 접근할 수 있지만, 데이터를 직접 복사하기 때문에 대용량 데이터에는 적합하지 않습니다.
- 용도: 간단한 데이터를 그룹화하거나 작은 데이터 집합을 처리할 때 적합합니다.
- 특징:
- 값 타입 (Value Type)으로, 복사할 때 값 자체를 복사합니다.
- 상속을 지원하지 않지만 인터페이스 구현은 가능합니다.
new
키워드를 사용하지 않고도 기본 생성자 호출이 가능합니다.
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
public Point(int x, int y)
{
X = x;
Y = y;
}
}
class Program
{
static void Main()
{
Point point1 = new Point(10, 20);
Point point2 = point1; // 값 타입이라 데이터 복사됨
point2.X = 50;
Console.WriteLine($"Point1 X: {point1.X}"); // 10 (변경되지 않음)
Console.WriteLine($"Point2 X: {point2.X}"); // 50
}
}
2. class (클래스)
class
는 참조 타입(Reference Type)으로, 객체 지향 프로그래밍에서 가장 기본이 되는 데이터 구조입니다. 메모리 상에서 힙에 저장되고, 클래스 인스턴스를 복사할 때 주소값을 참조하므로 대용량 데이터에 적합합니다. 클래스는 상속을 통해 코드의 재사용성과 확장성을 높일 수 있습니다.
- 용도: 복잡한 데이터와 로직을 캡슐화하여 객체 지향적으로 관리할 때 사용됩니다.
- 특징:
- 참조 타입 (Reference Type)으로, 복사할 때 참조 주소를 복사합니다.
- 상속이 가능하여 다른 클래스로부터 기능을 확장할 수 있습니다.
- 생성자, 소멸자, 정적 메서드 및 정적 속성을 정의할 수 있습니다.
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
class Program
{
static void Main()
{
Person person1 = new Person("Alice", 30);
Person person2 = person1; // 참조 타입이라 주소값 참조됨
person2.Name = "Bob";
Console.WriteLine($"Person1 Name: {person1.Name}"); // Bob (변경됨)
Console.WriteLine($"Person2 Name: {person2.Name}"); // Bob
}
}
3. Array (배열)
배열(Array
)은 고정된 크기의 동일한 데이터 타입의 요소들을 저장하는 데이터 컬렉션입니다. 각 요소는 인덱스에 따라 접근할 수 있으며, 빠른 조회 성능을 제공합니다. 배열은 초기 선언 시 크기가 고정되기 때문에 크기를 변경할 수 없고, System.Array
클래스에서 제공하는 다양한 메서드를 사용할 수 있습니다.
- 용도: 정해진 크기와 동일한 타입의 데이터 집합을 관리할 때 사용됩니다.
- 특징:
- 고정 크기이며 크기를 변경할 수 없습니다.
- 인덱스를 통해 개별 요소에 접근할 수 있습니다.
- 데이터가 메모리상에서 연속적으로 배치됩니다.
int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
Console.WriteLine(numbers[0]); // 1
numbers[2] = 10;
Console.WriteLine(numbers[2]); // 10
foreach (int num in numbers)
{
Console.WriteLine(num); // 배열의 모든 요소 출력
}
4. List (리스트)
List<T>
는 배열과 유사하지만 동적 크기 조정이 가능한 데이터 컬렉션입니다. System.Collections.Generic
네임스페이스의 제네릭 클래스이며, 데이터 타입이 결정되므로 타입 안전성이 보장됩니다. 필요에 따라 요소를 추가, 삭제할 수 있어 배열보다 유연합니다.
- 용도: 크기가 가변적이고 요소 추가, 삭제가 빈번한 경우 사용됩니다.
- 특징:
- 동적 크기 조정이 가능하며 요소 추가, 삭제가 쉽습니다.
- 특정 데이터 타입만을 저장할 수 있는 타입 안전성을 보장합니다.
List<T>
클래스의 다양한 메서드를 사용할 수 있습니다.
List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");
Console.WriteLine(names[0]); // Alice
names.Remove("Alice");
foreach (string name in names)
{
Console.WriteLine(name); // 남은 요소 출력
}
요약
- struct: 값 타입으로, 메모리 효율이 좋고 단순 데이터 그룹화에 적합합니다.
- class: 참조 타입으로, 복잡한 데이터와 로직을 객체로 관리할 때 사용됩니다.
- array: 고정 크기의 동일한 타입 데이터를 연속적으로 저장할 수 있습니다.
- list: 동적 크기의 데이터 컬렉션으로, 요소 추가 및 삭제가 용이합니다.