» C# 데이터 구조

C# 데이터 구조

by DUBUKIMCH

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: 동적 크기의 데이터 컬렉션으로, 요소 추가 및 삭제가 용이합니다.

You may also like

Leave a Comment

error: Content is protected !!