주인장의 프로그래밍 개발 공부방

[Chapter 5 배열] 4. 2차원 이상의 배열 (feat. String) 본문

프로그래밍 기본 지식/Chapter 5 배열

[Chapter 5 배열] 4. 2차원 이상의 배열 (feat. String)

거신 2019. 8. 27. 09:13

앞서 배열이 무엇인가와 배열의 구조에 대해서 알아봤고

대표적인 배열인 1차원 배열에 대해서 자세하게 알아봤다.

1차원이라는 말이 사용했다는 것은 2차원, 3차원도 있기 때문에

굳이 1차원을 언급했을 것이다.

그래서 이번 시간에는 2차원(이상) 배열에 대해서 알아보려고 한다.

 

목표 : 2차원(이상) 배열의 구조를 정확하게 이해하고 사용할 수 있다.

 

1. 다차원 배열

 

2차원 이상의 배열에 대해서 알아보기 전에

1차원 배열에 대해서 아주 간단하게 잠깐 복기하는 시간을 가져보자.

 

먼저 1차원 배열인덱스를 하나만 가지는 배열이 되겠다

형태는

int[] arr = new int[5];

와 같이 선언하고 사용할 수 있겠다.

 

여기에서 왜 1차원이라는 단어를 사용하는지에 대해서는

굳이 자세하게 설명하지는 않을 것이다.

그냥 지금은 이름이 1차원 배열, 2차원 배열이라는 식으로 되어 있다라고만 생각하자.

 

다시 본론으로 돌아와서 1차원 배열인덱스가 1개이다.

2차원 배열인덱스가 2개이다.

정말 간단하다.

3차원 배열인덱스를 3개를 가지고 있는 배열이 되겠다.

 

그렇다면 2차원(이상) 배열은 어떤 형태로 되어 있으면 어떻게 사용하는지에 대해서

자세하게 알아보도록 하자.

참고로 이번 글에서는 2차원 배열에 대해서만 자세하게 다룰 것이다.

3차원, 4차원 배열도 존재하지만 높은 수준의 경우가 아니라면

거의 사용할 일이 없기 때문에 여기에서는 굳이 언급하지 않고

2차원 배열을 기반으로 개념을 확장시킬 수 있을 정도로만 알아볼 예정이다.

그렇기 때문에 2차원 배열에 대해서 아주 자세하게 알아볼 것이다.

 

2. 2차원 배열의 선언

 

일단 배열의 타입에 대해서 먼저 알아볼 필요가 있어 보인다.

1차원 배열은 배열을 선언할 때 타입에 []를 붙여줬었다.

2차원 배열도 똑같다.

그러나 갯수가 다르다.

예시를 보도록 하자.

 

예시1)

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

 

이번에는 []가 하나가 더 등장했다.

굉장히 요상해 보이겠지만 2차원 배열은 이렇게 선언한다.

여기에서도 마찬가지로 int[][]배열의 타입이 되겠다.

그리고 앞에서도 잠깐 언급했듯이 2차원 배열인덱스를 2개를 가지고 있다.

그렇기 때문에 선언을 할 때도 [3][4]과 같이 인덱스를 2개를 선언해줘야 한다.

당연히 값이 저장되어 있는 배열의 방을 찾아갈 때도 인덱스를 2개를 지정해줘야 한다.

 

조금 쉽게 설명하자면

우리가 수학 시간에 배웠던 행렬이나 좌표를 생각하면 편할 것이다.

3x4 크기의 행렬이나 x축과 y축으로 이루어져 있는 그래프말이다.

실제로 2차원 배열은 행렬이나 좌표의 개념이 포함되어 있기 때문에

표기하는 방법도 비슷하다고 할 수 있겠다.

 

그렇다면 2차원 배열은 어떤 구조로 되어 있길래

행렬처럼 생각하면 되는 것인지 한 번 알아보도록하자.

 

3. 2차원 배열의 구조

 

거두절미하고 그림부터 먼저 살펴보자.

 

그림1)

위의 그림12차원 배열이 선언되었을 때의 메모리 상의 구조를 나타낸 것이다.

(물론 알아보기 쉽게 그린 것이지 실제로 메모리에는 다른 형태로 되어 있다.)

잘 살펴보면 1차원 배열에서 더 확장된 모습이라는 것을 알 수 있을 것이다.

1차원 배열에서 각 방에 새로운 방들이 각각 연결되어 있는 형태가 되겠다.

좀 더 확장하자면 3차원 배열2차원 배열에서

가장 말단에 있는 방에 새로운 방이 또 연결되는 형태를 지닌다는 것을

어느정도는 유추할 수 있을 것이라 생각한다.

이런 개념으로 3차원, 4차원....이 존재하는 것이다.

 

다시 앞으로 돌아가서 2차원 배열의 선언 코드를 살펴보자.

[3][4]와 같이 인덱스를 2개를 지정했는데

앞의 [3]은 우리가 알고 있는 1차원 배열의 방 개수를 나타내는 것이고

뒤에 붙는 [4]가 각 방에 새로 연결된 방의 개수를 나타내는 것이다.

 

그리고 여기에서 눈여겨봐야 할 부분이 있는데

바로 1차원 배열의 방에 저장되는 값이 되겠다.

우리가 알고 있는 지식이라면 보통 값 그 자체가 저장이 되어야 하는데

여기에서는 값이 아닌 주소가 저장되어 있다는 것을 눈치채야 한다.

즉, 2차원 배열에서는 가장 말단에 있는 방에 그 값이 저장되는 것이고

이전의 방에는 연결되는 방의 주소가 저장된다.

그렇기 때문에 실제 값을 찾아가려면 방 번호가 2개가 필요한 것은 당연하다.

 

4. 2차원 배열에서 값이 저장된 방 찾아가기

 

그렇다면 이제 방을 생성했으니 방을 찾아가는 방법에 대해서 알아보자.

일단 예시12차원 배열을 다시 들고오자.

 

예시1)

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

 

2차원 배열에서는 방이 2가지로 존재하기 때문에

어떤 방을 찾아가느냐에 따라서 방법도 다르고 값도 다르게 나타난다.

일단 먼저 알아볼 것은 실제 값이 저장된 방을 찾아가는 방법이다.

2차원 배열에서는 앞서 언급했지만 인덱스가 2개가 필요하다.

바로 이런 식으로 적으면 되겠다.

 

int num = arr[2][3];

 

이 코드는 예시12차원 배열에서 가장 끝에 있는 방의 값을 가져온 것이다.

앞서 2차원 배열은 행렬과도 관련이 있다고 했는데

여기에서 바로 행렬의 개념을 사용하면 굉장히 편리하다.

위의 코드는 다시 말해, (2, 3)의 위치에 있는 값을 가져왔다는 뜻이 된다.

예시12차원 배열3x4크기의 행렬로 구성되어 있고

(2, 3) 위치의 값을 가져온 것이다.

그림으로 살펴보자.

 

그림2)

 

(배열의 인덱스는 0부터 시작한다는 것을 잊지 말자.)

이렇게 arr[2][3], arr[0][0] 등과 같이 적어서 값을 가져올 수 있는 것이다.

그렇다면 2차원 배열에서 1차원 배열처럼 쓰면 어떻게 될까?

만약 arr[2]라고만 쓴다면?

일단 이렇게는 사용할 수가 없다.

 

int num = arr[2];

 

와 같이 말이다.

에러가 뜰 것인데 arr[2]의 타입이 맞지 않다고 출력이 될 것이다.

위의 그림1에서도 알 수 있겠지만

arr[2][3]int타입의 값을 가지고 있지만

arr[2]는 실제 값이 아닌 주소를 저장하고 있기 때문에 타입이 매칭이 되지 않는 것이다.

 

System.out.println(arr[2]);

 

라고 작성하고 출력하면 좀 어려운 값이 출력될 것이다.

이 것이 바로 arr[2][3] 방의 메모리 주소가 되겠다.

따라서 실제 값을 가져오겠다면 당연히 [2][3]과 같이 인덱스를 2개를 사용해줘야 한다.

 

5. String[] strArr = new String[] {};

 

2차원 배열을 잘 배우고 있는데 뜬금없이 1차원 배열을 언급하냐고 의문이 들겠지만

정말 우습게도 이 녀석은 1차원 배열의 탈을 쓰고 있는 2차원 배열이다.

도당체 무슨 소리인가 의문이 들겠지만 이 녀석의 구조는 2차원 배열과 똑같다.

그렇기 때문에 2차원 배열이라고 하는 것이 맞겠지만

더 정확히는 객체 배열이라고 한다.

 

그림 3)

정리하자면 소스 코드에서 사용하는 형태는 1차원 배열의 형태로 사용하지만

그 안을 자세히 들여다보면 2차원 배열과 동일한 형태를 취하고 있는

굉장히 신기한 녀석이 되겠다.

이는 객체지향이라는 개념이 포함된 프로그래밍 언어에서 볼 수 있는

신기한 녀석이라고 할 수 있겠다.

객체 배열은 이 다음에 더 자세하게 다룰테니 그 때 제대로 공부하도록 하자.

 

6. 마무리

 

2차원 배열1차원 배열에서 인덱스가 하나 더 늘어난 형태가 되겠다.

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

와 같이 선언한다.

여기서도 당연히 int[][]배열의 타입이 되겠다.

2차원 배열의 구조는 1차원 배열의 형태에서 각각의 방에

새로운 방들이 연결되는 형태를 지니고 있는데

앞의 [3]이 1차원 배열의 방 개수, 뒤의 [4]가 각각의 방의 새로운 방 개수가 되겠다.

2차원 배열은 행렬과 매우 흡사한데

2차원 배열에서 실제 값이 저장된 방을 찾아가기 위해선

행렬에서 (2, 3)과 같이

arr[2][3]으로 인덱스를 2개를 사용해서 찾아갈 수 있다.

만약 arr[2]와 같이 인덱스를 하나만 적는다면 값이 아닌 arr[2][3]이라는 방의 주소를 가져오게 된다.

Comments