프로그래밍 C#언어

배열 (Array)

게임첫걸음 2024. 8. 29. 15:12
class Program
{
    static void Main()
    {
        //1차원 배열(Array)
        int[] arr = { 1, 2, 3 }; //C#의 배열 문법 구성, C#은 무조건 동적할당을 해야하기 때문에 기본 자료형 [ ]안에 크기 안들어감. ex)[2],[3] 오류

        int[] arrAlloc = new int[3]; //이처럼 동적할당을 자료형에서 미리 하면 가능. 3의 크기   //공간만 만들기 버전
        arr[0] = 10; //arr의 0번째 요소 10

        Console.WriteLine("int Size: " + sizeof(int)+ " byte");    //일반 자료형은 sizeof가 가능
        //Console.WriteLine("arr Size: " + sizeof(arr) + " byte"); //프로그래머가 직접 만든 배열, 클래스는 sizeof가 안됨

        for (int i = 0; i < arr.Length; ++i)
            Console.Write($"[ {arr[i]} ] - ");  //[10] - [2] - [3] - 출력
        Console.WriteLine($"( {arr.Length} ) ");//(3) 출력

        // 범위기반 반복문(Range Based Loop)
        foreach (int data in arr)    //위의 for문과 같은 기능으로 int data in arr는 arr안에 들어있는 data를 의미함.
        {
            Console.Write(string.Format("[ {0} ] - ", data));	//[10] - [2] - [3] -
        }
        Console.WriteLine(string.Format("( {0} )", arr.Length));//(3) 출력

        //////////////////////////////////////////////////////////////////////////////////
        Console.WriteLine();

        //2차원 배열(2linked-Array)
        int[,] arr2d =
        {
            { 11, 12, 13 },
            { 21, 22, 23 }  //C언어는 초기값 안넣으면 0이었지만 C#은 무조건 값을 넣어줘야함. ex) { 21 }, { 21, 22 } 다 오류걸림
        };    		//똑같이 동적배열이 강제되기 때문에 [ , ]안에 크기값 못 넣음. 
        int[,] arr2dAlloc = new int[2, 3];  //공간만 우선 만들어주는 버전 x = 2, y = 3 크기, 위와 크기는 같음, 이건 0으로 초기화됨.
        Console.WriteLine("arr2d[0][0]: " + arr2d[0, 0]);
        Console.WriteLine("arr2dAlloc[0][0]: " + arr2dAlloc[0, 0]);
        Console.WriteLine("arr2dAlloc Length: {0}", arr2dAlloc.Length); //6 출력


        //////////////////////////////////////////////////////////////////////////////////
        Console.WriteLine();

        //Jagged Array  jagged array는 각 줄마다 x값을 바꿀 수 있음. 
        int[][] jaggedArr = new int[2][];
        int[][] jaggedArrAlloc = new int[2][]
        {
            new int[3], //[][][]
            new int[4]  //[][][][] 즉, jaggedArrAlloc은 7의 크기를 가진 배열이 됨.
        };

        foreach (int[] jarr in jaggedArrAlloc)
            foreach (int data in jarr)
                Console.Write("[ {0} ] - ", data);  //[0] - [0] - [0] - [0] - [0] - [0] - [0] - 
        Console.WriteLine("( {0} )", jaggedArrAlloc.Length);    // (2)

        int[,,,,] multi;    //다차원배열 옆은 5차원배열
    }
}

 

<배열> (Array)

 C언어에서 많이 다뤘던 배열이 C#에서는 어떤 식으로 문법이 바뀌는지 알아보겠습니다. 주석으로 방식 별로 설명했지만, 추가로 적어보겠습니다.

1차원 배열(Array)
int[] arr = { 1, 2, 3 }; //C#의 배열 문법 구성, C#은 무조건 동적할당을 해야하기 때문에 
			//기본 자료형 [ ]안에 크기 안들어감. ex)[2],[3] 오류

int[] arrAlloc = new int[3]; //이처럼 동적할당을 자료형에서 미리 하면 가능. 3의 크기   //공간만 만들기 버전
arr[0] = 10; 		//arr의 0번째 요소 10

Console.WriteLine("int Size: " + sizeof(int)+ " byte");	//일반 자료형은 sizeof가 가능
//Console.WriteLine("arr Size: " + sizeof(arr) + " byte"); //프로그래머가 직접 만든 배열, 클래스는 sizeof가 안됨

for (int i = 0; i < arr.Length; ++i)
	Console.Write($"[ {arr[i]} ] - ");  //[10] - [2] - [3] - 출력
Console.WriteLine($"( {arr.Length} ) ");//(3) 출력

범위기반 반복문(Range Based Loop)
foreach (int data in arr)    //위의 for문과 같은 기능으로 int data in arr는 arr안에 들어있는 data를 의미함.
{
	Console.Write(string.Format("[ {0} ] - ", data));	//[10] - [2] - [3] -
}
Console.WriteLine(string.Format("( {0} )", arr.Length));//(3) 출력

 

<1차원 배열>

  • C#에서 배열은 동적할당이 패시브로 들어갑니다. 그래서 배열 선언 때 [ ] 안에 크기를 지정할 수 없습니다.
  • int[ ] arr = { 1, 2, 3 }; : 1, 2, 3 구성요소를 가진 3 크기의 arr 배열을 만들어준 형태입니다.
  • int[ ] arrAlloc = new int[3]; : Alloc(ate)는 공간을 만들어준 케이스입니다. 동적 할당으로 공간을 우선 선언하는 것은 가능합니다. new를 붙이고 3의 크기를 가진 arrAlloc 배열을 만들어준 형태입니다.
  • arr[0] = 10; : arr 배열의 첫 번째 요소에 10을 대입해줍니다.

출력문

  • for문 출력: [10] - [2] - [3] - (3) // (Console.Write는 다음 줄 이동 Line이 없음. \n = Line)
  • foreach문 출력: [10] - [2] - [3] - (3)
  • // foreach문은 데이터 기반 반복문으로 특정 매개 변수의 데이터를 다루는 반복문입니다.
  • // (String.Format 메서드는 문자열을 특정 형식으로 포맷팅하는데 사용, arr.Length 값을 문자열로 변환 후, 이를 ( 값 ) 형식으로 출력.
int[,] arr2d =
{
	{ 11, 12, 13 },	//C언어는 초기값 안넣으면 0이었지만 C#은 무조건 값을 넣어줘야함.
	{ 21, 22, 23 }  //ex) { 21 }, { 21, 22 } 다 오류걸림
};    	//똑같이 동적배열이 강제되기 때문에 [ , ]안에 크기값 못 넣음. 
int[,] arr2dAlloc = new int[2, 3];  //공간만 우선 만들어주는 버전 x = 2, y = 3 크기, 위와 크기는 같음, 이건 0으로 초기화됨.
Console.WriteLine("arr2d[0][0]: " + arr2d[0, 0]);
Console.WriteLine("arr2dAlloc[0][0]: " + arr2dAlloc[0, 0]);
Console.WriteLine("arr2dAlloc Length: {0}", arr2dAlloc.Length); //6 출력

 

<다차원 배열> (2차원)

  • 1차원과 마찬가지로 배열 생성 단계에서 [ ] 안에 크기를 대입할 수 없습니다.
  • [ , ] 대괄호 안에 , 쉼표의 갯수에 따라 다차원 배열이 됩니다. ( [ , ] 2차원, [ , , ] 3차원 )
  • C언어는 배열에서 초기값을 설정하지않으면 그 요소들을 0으로 초기화했지만, C#은 그렇지 않다. 때문에 주석에 언급한대로 모든 요소에 초기화를 진행해줘야합니다.
  • new를 통한 배열 생성은 공간을 우선으로 만들어주는 방식입니다. arr2dAlloc 배열은 [2, 3]의 6 크기의 배열입니다.
  • 위의 방식대로면 C언어처럼 초기화하지않은 요소들을 모두 0으로 초기화해줍니다.

출력문

  • "arr2d[0][0]: " + arr2d[0, 0] : 11 // C언어 Ver: printf("arr2d[0][0]: %d\n", arr2d[0][0]); 이 됩니다.) + 대신 , 기능
  • "arr2dAlloc[0][0]: " + arr2dAlloc[0, 0]: 0 // arr2dAlloc배열은 new를 통해 공간만 우선 만들어줬기 때문에 0 출력)
  • "arr2dAlloc Length: {0}", arr2dAlloc.Length: 6 // [2, 3]의 Length값으로 6 출력)

 

//Jagged Array  jagged array는 각 줄마다 column값을 바꿀 수 있음. 
int[][] jaggedArr = new int[2][];
int[][] jaggedArrAlloc = new int[2][]
{
	new int[3], //[][][] 첫 번째 배열은 길이 3
	new int[4]  //[][][][] 두 번째 배열은 길이 4
};

foreach (int[] jarr in jaggedArrAlloc)
	foreach (int data in jarr)
		Console.Write("[ {0} ] - ", data);  //[0] - [0] - [0] - [0] - [0] - [0] - [0] - 
	Console.WriteLine("( {0} )", jaggedArrAlloc.Length);    // (2)

 

<Jagged Array> (특이한 배열 방식)

Jagged Array 구조 예시

  • Jagged Array는 각 줄마다 Column 값을 바꿀 수 있습니다. ( int[row][column] )
  • 위도 공간을 우선으로 생성하는 배열이기 때문에 모두 0으로 초기화됩니다.
  • Jagged Array는 column값을 마음대로 바꿀 수 있기 때문에 최상위 배열의 길이를 반환합니다. (new int[2][ ]) 여기선 2

출력문

  • "[ {0} ] - ", data : [0] - [0] - [0] - [0] - [0] - [0] - [0] - // 모두 0으로 초기화되어있기 때문에 7개 요소 모두 0으로 출력
  • "( {0} ) - ", jaggedArrAlloc.Length : (2) // Jagged Array는 최상위 배열만 Length로 반환하기 때문에 2가 출력

'프로그래밍 C#언어' 카테고리의 다른 글

상속 (Inheritance)  (0) 2024.08.30
String (문자열)  (0) 2024.08.30
구조체 (Structure)  (1) 2024.08.29
DataType(데이터 타입)  (3) 2024.08.28
C#의 시작, class와 DataTypes  (0) 2024.08.28