자료구조

이정은·2025년 7월 7일

C#

목록 보기
3/8
post-thumbnail

메모리 구조

  1. 코드 영역
  • 프로그램의 코드가 저장되는 공간
  • 컴파일 시 결정되며, 읽기 전용
  • 실행 중에는 변경되지 않으며, 크기 고정

  1. 데이터 영역
  • static, const, 전역 변수등이 저장
  • 프로그램 시작 시 메모리에 할당되며, 런타임 중 크기 변화 X

  1. 힙 영역 (런 타임에 크기 결정됨)
  • new 키워드로 생성되는 객체, 배열 등 참조형 데이터가 저장
  • 런타임 중 크기가 동적으로 변함
  • 메모리 관리는 GC(가비지 컬렉션)가 처리

  1. 스택영역 (컴파일 타임에 크기 결정됨)
  • 함수 호출 시 생성되는 지역 변수, 매개 변수, 호출 정보 등이 저장
  • 함수가 호출되면 쌓이고, 종료되면 자동으로 제거됨.
  • 매우 빠르게 접근되는 메모리 영역.



자료구조

  1. 단순구조
  • 프로그래밍에서 사용되는 기본적인 데이터 타입
  • 정수, 실수, 문자, 논리 등의 기본 타입

  1. 선형 구조
  • 데이터카 선형적으로 연결되어 있는 구조로써 데이터가 1:1 관계를 갖는 구조
  • 배열, 리스트, 스택, 큐 등

  1. 비선형 구조
  • 데이터가 1:다 또는 다:다 구조
  • 그래프, 트리 등

  1. 파일 구조
  • 레코드의 집합인 파일에 대한 자료구조
  • 순차파일, 색인파일, 직접파일 등



📌 선형구조


1. 배열


정적배열 (Static Array)

  • 메모리 공간을 미리 만들어두고 사용하는 자료구조
  • 빠르다.
public class StaticArray : MonoBehaviour
{
    //자료형 [] : 정적 배열
    int[] array1; // 배열 선언
    int[] array2 = {10, 20, 30, 40, 50}; // 배열 선언과 초기화
    int[] array3 = new int[5]; // 배열 선언 및 공간 할당
    int[] array4 = new int[5] { 10, 20, 30, 40, 50 }; // 배열 선언 및 공간 할당 + 초기화

    private void Start()
    {
        array1 = new int[5]; // array1 할당, 코드에서 할당하지 않아도 유니티 인스펙터 상에서 할당 가능
    }
}



다차원 배열 (Multidimensional Array)

  • 행과 열로 구성된 고정 메모리 자료구조
public class MultidimensionalArray : MonoBehaviour
{
    public int[,] array1 = new int[3, 3]; // 3 x 3 => 2차원 배열
    public int[,,] array2 = new int [3, 3, 3]; // 3차원 배열
}



가변 배열 (Jagged Array)

  • 배열 안에 배열을 가진 자료구조
public class JaggedArray : MonoBehaviour
{
    public int[] array1 = new int[3];
    public int[][] jaggedArray1 = new int[3][];

    private void Start()
    {
        array1[0] = 1;
        array1[1] = 2;
        array1[2] = 3;

        jaggedArray1[0] = new int[3] { 1, 2, 3 };
        jaggedArray1[1] = new int[2] { 4, 5 };
        jaggedArray1[2] = new int[5] { 6, 7, 8, 9, 10 };
    }
}



문자열(String)

  • 문자열로 이루어진 배열
public class String : MonoBehaviour
{
    public string str1 = " Hello World ";

    public string[] str2 = new string[] { "Hello", "Unity", "World" };

    private void Start()
    {
        Debug.Log(str1[0]); // H
        Debug.Log(str1[1]); // l

        Debug.Log(str2[0]); // Hello
        Debug.Log(str2[2]); // World

        Debug.Log(str1.Length); // 문자열 길이 : 13
        Debug.Log(str1.Trim()); // 앞뒤 공백 제거 : Hello World
        Debug.Log(str1.Trim('l')); // 문자 'l' 제거 : Heo Word

        Debug.Log(str1.Contains('H')); // 대문자 H가 있는지
        Debug.Log(str1.Contains('h')); // 소문자 h가 있는지

        Debug.Log(str1.Contains("Hello")); // Hello가 있는지

        Debug.Log(str1.ToUpper()); ; // 대문자 변환
        Debug.Log(str1.ToLower()); ; // 소문자 변환
        
        string text = "Apple,Banana,Orange,Melon,WaterMelon,Mango";
        string[] fruits = text.Split(','); // 특정 문자로 쪼개기

        foreach (var fruit in fruits)
            Debug.Log(fruit);
    }
}



2. 동적 배열(Dynamic Array) = 리스트

  • 크기에 따라 공간을 넉넉히 잡아서 자동 확장 가능한 자료구조
  • 크기 변화가 있기 때문에 정적 배열보다 느리다.
  • 언어별로 리스트의 개념이 다르지만 유니티 C#에선 리스트가 동적 배열을 의미한다.
public class DynamicArray : MonoBehaviour
{
    object[] array = new object[3];

    void Add(object o)
    {
        var temp = new object[array.Length + 1];

        for (int i = 0; i < array.Length; i++)
        {
            temp[i] = array[i];
        }

        array = temp;
        array[array.Length -1] = o;
    }
}
public class DynamicArray : MonoBehaviour
{
    public List<int> list1 = new List<int>();
    public List<int> list2 = new List<int>() { 1, 2, 3, 4 };
}
public class DynamicArray : MonoBehaviour
{
    public List<int> list1 = new List<int> ();

    private void Start()
    {
        for (int i = 1; i <= 10; i++)
        {
            list1.Add(i); // 뒤에 i를 추가
        }

        /*
        list1.Insert(5, 100); // 인덱스 5에 100을 삽입

        list1.Remove(5); // 값 5를 제거
        list1.RemoveAt(5); // 인덱스 5번에 있는 값을 제거
        list1.RemoveRange(1, 3); // 인덱스 1번에서 3까지 제거
        list1.Clear(); // 데이터를 모두 제거
        */
    }
}



3. 스택 (Stack)

  • 나중에 추가된 데이터가 가장 먼저 나오는 자료구조 -> LIFO ( Last In, First Out) = 후입선출
public class StudyStack : MonoBehaviour
{
    public Stack<int> stack = new Stack<int>();

    void Start()
    {
        for (int i = 1; i <= 10; i++)
        {
            stack.Push(i); // 1 ~ 10까지 값을 Stack에 추가
        }

        Debug.Log(stack.Pop()); // Last 값을 뽑음

        Debug.Log(stack.Peek()); // 그 다음에 뽑힐 대상을 확인
    }
}



4. 큐 (Queue)

  • 먼저 추가된 데이터가 가장 먼저 나오는 자료구조 -> FIFO (First In, First Out) = 선입선출
public class StudyQueue : MonoBehaviour
{
    public Queue<int> queue = new Queue<int>();

    void Start()
    {
        for (int i = 1; i <= 10; i++)
        {
            queue.Enqueue(i); // 1 ~ 10까지 추가
        }
        
        int output = queue.Dequeue(); // 값을 뽑음
        Debug.Log(output);

        Debug.Log(queue.Peek()); // 그 다음에 뽑을 값을 확인
        
        Debug.Log(queue.Contains(5)); // 값 5가 포함되어있는지 확인
        
        queue.Clear(); // 모든 값 삭제

        Debug.Log(queue.Count); // 개수 확인
    }
}



5. 딕셔너리 (Dictionary)

  • 키(Key)와 값(Value)로 이루어진 자료구조 -> Map 방식
public class StudyDictionary : MonoBehaviour
{
    public Dictionary<string, int> persons = new Dictionary<string, int>();

    void Start()
    {
        // Dictionary에 데이터 추가
        persons.Add("철수", 10);
        persons.Add("영희", 15);
        persons.Add("동수", 17);

        int age = persons["철수"]; // Key값으로 value를 출력
        Debug.Log($"철수의 나이는 {age}입니다.");

        foreach (var person in persons)
        {
            if (person.Value == 15)
                Debug.Log($"나이가 15인 사람의 이름은 {person.Key}입니다.");

            Debug.Log($"{person.Key}의 나이는 {person.Value}입니다.");
        }
    }
}







📌 비선형구조


1. 그래프

  • 정점과 간선으로 구성된 자료구조
  • 그래프는 순환 혹은 비순환 구조를 이룬다.
  • 그래프는 방향이 있는 그래프와 방향이 없는 그래프가 있다.
  • 루트 노드의 개념이 없다 / 부모-자식 관계라는 개념이 없다.
  • 2개 이상의 경로가 가능하다.(무방향, 방향, 양방향 가능)
  • 그래프는 네트워크 모델이다.

public class StudyGraph : MonoBehaviour
{
    private int[,] nodes = new int[6, 6]
    {
        //  0  1  2  3  4  5
        {  0, 1, 0, 1, 1, 0 }, // 0
        {  1, 0, 1, 0, 0, 0 }, // 1
        {  0, 1, 0, 1, 0, 0 }, // 2
        {  1, 0, 1, 0, 0, 0 }, // 3
        {  1, 0, 0, 0, 0, 1 }, // 4
        {  0, 0, 0, 0, 1, 0 }, // 5
    };
}
public class StudyGraph : MonoBehaviour
{
    private int[,] nodes = new int[6, 6]
    {
        //  0  1  2  3  4  5
        {  0, 9, 0, 2, 7, 0 }, // 0
        {  9, 0, 20, 0, 0, 0 }, // 1
        {  0, 20, 0, 16, 0, 0 }, // 2
        {  2, 0, 16, 0, 0, 0 }, // 3
        {  7, 0, 0, 0, 0, 10 }, // 4
        {  0, 0, 0, 0, 10, 0 }, // 5
    };
}



2. 트리 (Tree)

  • 정점과 간선으로 계층적 관계를 표현하는 자료구조
public class TreeNode<T>
{
    public T Data;
    public List<TreeNode<T>> Children;

    public TreeNode(T data)
    {
        Data = data;
        Children = new List<TreeNode<T>>();
    }
}



3. 이진트리 (Binary Tree)

  • 자식 노드 수가 2개 이하인 트리
  • 각 노드가 최대 2개의 자식을 가질 수 있는 트리
  • 자식 노드는 왼쪽과 오른쪽으로 구분
  • 일반적인 이진 트리는 자식 개수에 제한이 없으며, 불균형할 수도 있음.

+) 트리의 순회

0개의 댓글