Java 2차원 배열 입력 - Java 2chawon baeyeol iblyeog

이제 2차원 배열의 구조와 선언 방법에 대해서 알아봤으니

2차원 배열을 실제로 사용하는 방법에 대해서 알아보도록 하자.

여기에서는 다른 방식으로 선언하는 방법과

2차원 배열에 값을 저장하고 출력하는 방법에 대해서 알아보려고 한다.

목표 : 2차원 배열에 값을 저장하고 출력하는 방법을 이해하고 사용할 수 있다.

1. 2차원 배열에 값을 저장

2차원 배열을 선언도 해봤고 구조도 어떻게 되어 있는지 알아봤으니

이제 값을 저장하고 가져오는 방법에 대해서 알아보도록 하자.

먼저 저장하는 방법이다.

예시를 위해 2차원 배열을 만들어보자.

예시1)

char[][] charArr = new char[4][2];

이번에는 char타입의 2차원 배열을 선언해 보았다.

구조는 앞에서 살펴봤던 2차원 배열의 구조와 거의 흡사하니 이 전의 글을 참고하길 바란다.

이제 선언을 했으니 이 배열에 값을 저장해보자.

1차원 배열에서도 알아봤지만

배열에 값을 저장하기 위해선 인덱스가 필요하다.

방 번호가 필요하다는 것이다.

그런데 1차원 배열과 조금 다른 점이 있다면

2차원 배열은 인덱스가 2개가 필요하다.

코드부터 살펴보자

예시2)

charArr[0][0] = 'c';

charArr[1][2] = 'd';

charArr[3][0] = 65;

이러한 형태로 2차원 배열에 값을 저장할 수 있다.

물론

charArr[0] = 'c';

이나

charArr = 'e';

와 같이는 사용할 수 없다.

이는 주소를 저장하고 있는 장소이기 때문에 실제 값을 저장할 수는 없다.

1차원 배열과 마찬가지로 [ ] 안에 인덱스 번호를 적는데

2차원 배열은 [ ]가 하나 더 늘어났을 뿐이다.

그런데 이런식으로 하나하나 입력해도 되지만 여기에서 반복문을 사용해서

값을 저장할 수 있고 또 그렇게 하는 것이 편리하다.

그런데 2차원 배열에서는 일반 반복문이 아니라 중첩 반복문을 사용해야한다.

즉, 배열이 늘어날 수록 반복문도 그만큼 중첩해서 사용해야 한다는 뜻이다.

반복문을 사용해서 값을 저장하는 예시를 살펴보자.

예시3)

int ascii = 65; 			//아스키코드 65 => 'A'로 자동캐스팅
char[][] charArr = new char[4][2];	//4행 2열의 2차원 배열 생성
for(int i = 0; i < 4; i++) {		//4행만큼 반복
	for(int j = 0; j < 2; j++) {	//2열만큼 반복
    	charArr[i][j] = ascii++;	//'A'부터 시작해 B, C, D,... 순서로 저장
    }
}

위의 코드는 중첩 반복문을 사용해서 2차원 배열에 값을 저장하는 방법이다.

그런데 1차원 배열에서도 살펴봤듯이 반복하는 횟수를 수정해보자.

예시3_수정)

int ascii = 65;
char[][] charArr = new char[4][2];
for(int i = 0; i < charArr.length; i++) {
	for(int j = 0; j < charArr[i].length; j++) {
    	charArr[i][j] = ascii++;
    }
}

이렇게 charArr.length와 charArr[i].length를 이용해서

배열의 인덱스만큼 반복할 수 있도록 작성했다.

물론 꼭 이렇게 작성하지 않고 임의의 숫자로 작성하거나 반복 횟수의 순서를 바꿔서

값이 저장되는 순서를 바꿀 수도 있다.

그 것은 본인의 자유지만 여기에서는 그렇게 복잡한 내용보다는

일단 기본적인 내용을 알아가도록 하자.

이렇게 저장된 배열을 행렬인 표로 그려보자면 다음과 같이 그릴 수 있다.

그림1)

Java 2차원 배열 입력 - Java 2chawon baeyeol iblyeog

2차원 배열은 중첩 반복문을 사용하기 때문에 우리가 이전에 배웠던

중첩 반복문을 내 마음대로 주무를 수 있다면

2차원 배열에 값을 저장하거나 값을 가져올 때 임의의 순서대로 지정하는 것도 가능하다.

그런데 반복횟수를 지정하는데 charArr.length는 뭐고 charArr[i].length는 무엇을 의미하는 것일까?

2차원 배열은 1차원 배열에 또다른 1차원 배열을 연결한 모습을 띄고 있다는 것을

알고 있을 것이다.

그렇기 때문에 바깥쪽 반복문에 있는 charArr.length는

2차원 배열인 charArr의 앞에 있는 [ ]의 인덱스 길이를 의미하고

안쪽 반복문에 있는 charArr[i].length는

charArr의 뒤에 있는 [ ]의 인덱스 길이를 의미하는 것이다.

말로 풀어서 설명했기 때문에 조금은 헷갈릴지도 모르겠지만

가능하다면 제대로 이해하는 것이 중요하다.

2. 2차원 배열에서 값을 출력하는 방법

저장하는 방법을 알아봤으니 이제 저장한 값들을 가져와서

변수에 저장하거나 출력하는 방법에 대해서 살펴보자.

방법은 저장하는 것과 동일하다.

인덱스 2개를 지정해줘야하는 것은 물론이고

반복문을 사용한다면 중첩 반복문을 사용하는 것도 동일하다.

물론 인덱스를 사용하지 않거나 인덱스를 하나만 사용한다면

값이 아닌 주소가 출력되니 주의하도록 하자.

예시를 살펴보자.

예시4)

for(int i = 0; i < charArr.length; i++) {
	for(int j = 0; j < charArr[i].length; j++) {
    	char c = charArr[i][j];
        System.out.print(c + " ");
    }
    System.out.println();		//줄바꿈용
}

위의 예시3의 2차원 배열을 사용해서 값을 출력하는 코드를 작성했다.

역시 중첩 반복문을 사용해 인덱스 2개를 지정했고

[0][0]부터 시작해 [3][1]까지의 값을 출력했다.

물론 특정 위치의 값을 가져오겠다면

char c = charArr[2][2];

와 같이 값을 가져오면 된다.

개념차체는 1차원 배열과 크게 다를게 없기 때문에 이해하는데 어려움은 없을 것이라 생각한다.

다만 중첩 반복문에 익숙해지는게 어려울지도 모르겠다.

3. 2차원 배열을 선언하는 다양한 방법

앞서 2차원 배열에 값을 저장하는 방법과

저장한 값을 가져와 출력하는 방법에 대해서도 알아봤으니

이번에는 2차원 배열을 선언하고 초기화하는 방법에 대해서 알아보도록 하자.

1차원 배열과 비슷하긴 하지만 인덱스가 하나 더 늘어났기 때문에

좀 더 다양한 방법이 존재한다.

그 방법들에 대해서 하나씩 알아보도록 하자.

의외로 쓰이는 곳이 있으니 알아두는 것도 좋을 것이다.

1) 일반적인 2차원 배열 선언

우리가 가장 잘 알고 있는 방법이 되겠다.

double[][] dArr = new double[3][4];

과 같이 방크기까지 먼저 선언해두고

중첩 반복문이나 각각의 인덱스를 지정해서 값을 저장하거나 출력할 수 있다.

보통 가장 많이 사용하는 방법이고 가장 일반적인 방법이라고 할 수 있겠다.

2) 선언과 동시에 값으로 초기화

두 번째 방법은 배열을 선언함과 동시에 값을 저장하는 방법이 되겠다.

1차원 배열에서도 봤듯이 배열에 인덱스 크기를 따로 지정하지 않고

값을 직접 집어넣어서 배열을 선언하는 방법이 되겠다.

예시5)

int[][] intArr = new int[][] { {1, 2, 3, 4}, {5, 6, 7, 8} };

와 같이 인덱스를 지정하지 않고 { }안에 또다른 { }를 넣어서 값을 저장할 수 있다.

예시5처럼 선언하면 [2][4]의 크기를 갖는 2차원 배열이 된다.

이렇게 선언하면 값을 저장하는 코드도 따로 필요없고 굳이 인덱스 크기를 지정하지 않아도 되니

값이 적다면 이렇게 직접 초기화하는 방법도 좋은 방법이 되겠다.

여기에서는 가변배열이라고 해서

{ {1}, {2, 3}, {4, 5, 6} }

과 같이 인덱스를 다르게 지정할 수도 있는데

지금은 이런 것도 있구나라고만 알고 넘어가도록 하자.

3) 1차원 배열 선언 후 2차원 배열 선언

마지막으로 알아볼 것은 먼저 1차원 배열을 선언한 후에

각각의 인덱스에 2차원 배열을 붙여주는 방식이 되겠다.

무슨 뜻인가싶겠지만 코드를 보면 이해가 될 것이다.

예시6)

char[][] charArr = new char[3][];

charArr[0] = new char[3];

이러한 방법으로도 선언이 가능하다.

이게 가능한 이유는 인덱스가 2개이기 때문이다.

일단 설명을 덧붙이자면 2번의 과정으로 나눌 수 있는데

1번째 과정에서는 앞의 인덱스의 크기만 지정한다.

이렇게 지정하면 2차원 배열에서 1차원 배열이 먼저 선언된다.

우리가 흔히 알고 있는 그 모양으로

그러나 배열 타입이 char[]와 같이 1차원 배열이 아니라

char[][]와 같이 2차원 배열로 선언했기 때문에

뒤의 인덱스 크기를 지정하기 위해 1차원 배열을 또 붙여줘야 한다.

그 과정이 2번째 과정이 되겠다.

그렇기 때문에 이런 코드를 사용해서 크기를 지정할 수도 있다.

예시7)

char[][] charArr = new char[3][];		//여기서는 2차원 배열타입이지만 1차원만 선언한 셈
for(int i = 0; i < charArr.length; i++) {
	charArr[i] = new char[4];			//1차원만 선언된 배열에 새로운 1차원을 더 붙여줌
    for(int j = 0; j < charArr[i].length; j++) {
    	charArr[i][j] = 'A';			//배열의 인덱스 순서대로 값을 저장
    }
}

이렇게 선언하고 동시에 값도 저장할 수 있는 방법이 되겠다.

이런 방법도 사용할 수 있다는 것만 알고 있자.

특히 이 방법은 잠깐 언급했던 가변 배열로 사용할 때 유용하다고 볼 수 있겠다.

4) 배열 변수만 선언하고 초기화는 나중에 하는 방법

예시8)

char[][] charArr = null;

charArr = new char[1][2];

위의 예시8의 형태는 한 줄의 코드를 굳이 2줄로 나눠서 작성한 것이 되겠다.

이는 이전에도 한 번 언급했었지만 배열 변수를 선언만 해두고

그 이후에 초기화를 하는 경우도 있기 때문에 사용한다고 한 적이 있었다.

이런 경우도 있기 때문에 알아두면 편하다는 것 뿐이다.

4. 마무리

2차원 배열에서 가장 중요한 것은 인덱스를 2개를 사용해야 한다는 점이다.

값을 저장하고 가져오고 출력하기 위해선

인덱스 2개를 지정해줘야만 우리가 원하는 값을 얻을 수 있다.

그리고 인덱스가 2개이기 때문에 반복문을 사용할 때도

중첩 반복문을 사용하는 것이 가장 효율적인 방법이 되겠다.

2차원 배열도 1차원 배열과 마찬가지로 다양한 선언 방법이 존재하는데

대표적으로

int[][] intArr = new int[3][4];

또는

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

가 되겠다.

특별한 경우가 아니라면 일반적인 선언 방법을 사용하는 것이 좋다.

복잡하기도 하고 말이다.