본문 바로가기

자료구조

동적 배열 (Dynamic Array)

더보기
using System;
using System.Collections.Generic;

namespace HelloWorld
{
    public class App
    {
        int[] arr;

        //생성자
        public App()
        {
            arr = new int[2];
            //arr[3] = 5;   indexOutOfRange
            Console.Write("배열arr의 요소: ");
            for (int i = 0; i < this.arr.Length; i++)
            {
                Console.Write("{0} ", arr[i]);
            }
            Console.WriteLine();

            AddItem(3);
            AddItem(5);
            AddItem(11);
        }

        void AddItem(int item)
        {
            int emptyIndex = -1; //빈방 인덱스 임시 저장공간 -1이면 못찾음

            //배열의 요소를 순회하며 빈공간 찾기
            //0 인덱스부터 배열의 길이 -1 (last index)까지
            //배열의 요소의 값을 확인한다 (값이 0인가?)
            //요소의 값이 0이라는 뜻은 비어있다 (약속)
            for (int i = 0; i < this.arr.Length; i++)
            {
                //Console.WriteLine(i);   //i값은 배열의 인덱스
                if (this.arr[i] == 0)
                {//빈방 찾았다
                    emptyIndex = i; //빈방 인덱스
                    break;
                }
            }
            //Console.WriteLine("emptyIndex: {0}", emptyIndex);

            if (emptyIndex == -1)
            {
                //full
                //기존배열의 길이보다 1개큰 임시 배열을 생성한다
                int[] temp = new int[this.arr.Length + 1];
                //기존 배열을 순회 하며 임시배열에 순서대로 넣어준다
                for (int i = 0; i < this.arr.Length; i++)
                {
                    temp[i] = this.arr[i];
                }
                //값복사 완료
                //기존 배열을 임시배열로 교체한다
                this.arr = temp;

                //배열의 끝에 요소의 값을 넣는다
                this.arr[this.arr.Length - 1] = item;
            }
            else
            {
                //인덱스에 요소를 할당한다
                this.arr[emptyIndex] = item;
            }

            Console.Write("추가: {0} : ", item);
            for (int i = 0; i < this.arr.Length; i++)
            {
                Console.Write("{0} ", this.arr[i]);
            }
            Console.WriteLine();
        }
    }
}