2011년 5월 1일 일요일

자바의 다차원 배열(Multidimensional Arrays)


오늘 이 시간에는 an array of arrays 자바에서 다차원 배열([ ]이 2개 이상)이라고 부르는 2차원 배열([ ][ ]) 이상의 배열에 대해서 공부해 보기로 하겠다. 3차원 배열([ ][ ][ ]), 4차원 배열([ ][ ][ ][ ]), 5차원 배열([ ][ ][ ][ ][ ]등등 다차원 배열([ ][ ]......[ ])을 여러분이 원하는데로 수없이 만들수 있지만 쓰는 빈도수가 2차원 배열까지가 태반이므로 솔직히 프로그래밍하는데 큰 무리는 없을 것이다. 그런 까닭에 대부분 1차원 배열과 2차원 배열만 집중적으로 하다보니 3차원 배열부터는 그냥 막연히 array를 표시하는 괄호가 3개라는건 알겠는데 막상 쓰려고 하면 쓰지 못하는 이가 태반일 것이다. 이유는 자바의 배열에 대한 개념이 확실하게 잡혀있지 않은 상태에서 막연히 기계적으로 대입하고 공식화해서 사용하려고 하니 막다른 길에 들어서서 막히게 되는 것이다.

자바의 배열은 알겠는데 이게 2차나 3차로 갈수록 뭐가뭔지 알던것도 헤깔리는 이가 있다면 오늘 이 강좌가 여러분의 오아시스(?)와 같은 역활을 해내리라 믿어의심치 않는다. 특히 3차원 배열을 소홀히 하는 경우가 많다. 그러나 필자의 경험에 비추어보면 비록 쓰임은 적으나 3차원 배열까지는 최소한 어떻게 쓰는지 확실히 알고 넘어가야 4차원 배열이나 그 이상의 배열로 나아갈수 있는 기초가 완성될 것이다. 그 이유는 오늘 공부하면서 여러분이 그것을 자연스럽게 느끼게 되리라 본다. 본 강좌는 2차원 배열과 3차원 배열의 예제를 통해 다차원 배열을 집중적으로 파고들 것이다. 필자가 굳이 3차원 배열까지 강좌리스트에 넣은 이유는 이미 언급한바와 같이 그 이상의 고차원 배열은 3차원 배열을 제대로 모르고선 더이상 행군할수 없는 절벽과 맞딱드리는거랑 같기 때문이다. 필자가 서론(?)을 너무 길게 쓰니 겁먹는 이가 벌써부터 있을지 모르지만 2차원 배열과 3차원 배열에 대한 예제를 보기만해도 이해가 가능하도록 그 누구도 함부로 펼칠수 없다는 절대신공(?)을 자바코드에 불어넣어놨으니 여러분이 배우고자하는 의지가 있다면 큰 무리없이 이 신공을 여러분의 것으로 습득할수 있을 것이다.

저번 시간에 1차원 배열에 대해서 공부하였으니 복습을 철저히 했으리라 믿고 2차원 배열을 본격적으로 시작하겠다. 믿어도 되겄징? ㅎㅎ 2차원 배열은 말 그대로 1차원 배열의 요소 하나하나가 각자 1차원 배열 형태를 또 가지고 있는 것이라 생각하면 된다. 예제에서는 둘다 객체 배열(String)을 보여주기로 결정하였다. 어차피 일반 자료형 배열은 여러분이 손쉽게 만들고 고칠수 있으니까 말이다. 정말? ㅎㅎ 혹시나 모르니까 워밍업도 할겸 자료형 배열부터 차례차례 해보기로 하겠다. 대신 열심히 하자궁~^^

그럼 2차원 배열을 만드는 공식부터 보기로 하자. 1차원 배열과 다를바 없다.

배열타입[ ][ ] 배열명=new 배열타입[반드시기입][안써도 된다]

예제를 보면 이해가 쉬울 것이니 아래를 보면서 2차원 배열을 어떤 식으로 만드는지 살펴보기로 하자.


필자가 계속해서 강조하고 있지만 2차원 배열은 말그대로 1차원 배열의 1차원 배열이다. 즉 배열의 배열인 것이다. 주차공간을 생각하면 쉬울지 모르겠다. 자동차 3대를 주차할수 있는 주차장이 있는데 자리별로 a[0]로 표기된 주차공간, a[1] 주차공간, a[2] 주차공간이 차례대로 있다고 하자. 어느날 확장공사를 해서 각 공간에 자동차 3대씩을 주차할수 있도록 만들었다. 기존의 거주자들을 위해 알기쉽게 원래 표기명을 고수하면서 불편함이 없도록 주차공간마다 새로 표시하였다. a[0] 주차공간에서 a[0][0], a[0][1], a[0][2]로 구간표시를 새로하고, 마찬가지로 a[1] 주차공간도 a[1][0], a[1][1], a[1][2]로 구간표시를 새로하고, 마지막으로 a[2] 주차공간도 a[2][0], a[2][1], a[2][2]로 구간표시를 새로 하였다. 예전에 있던 표기명을 고수하였더니 거주자들이 복잡하다고 항의를 하는 바람에 기존에 일하고 있던 주차요원이 짤리고 새로운 주차요원이 고민에 고민을 거듭하다가 a[0][0]부터 a[2][2]까지 차례대로 숫자 1부터 표시하고 세군데의 주차공간을 각각 차례대로 배정하였더니 모두가 불평(?)이 없더라하는 이야기가 바로 위의 예제다. 실행을 하면 다음과 같은 결과가 나온다.

123
456
789

주석을 자세하게 붙여놓았으니 어떻게 하면 자바의 2차원 배열을 효율적으로 쓸수 있는지 금방 이해가 될 것이다. 워밍업은 이 정도로 하고 이제 String 객체를 이용한 2차원 배열을 공부해 보도록 하자.

String[ ][ ] 배열명=new String[반드시기입][안써도 된다]

String[ ][ ] a=new String[3][ ];
a[0]=new String[3];
a[1]=new String[3];
a[2]=new String[3];

배열타입에 String을 넣을뿐 만드는 방법은 똑같다. 오늘도 여러분의 호응도와 특히 집중력을 최대치로 끌어올리기 위해서 무려 세군데나 되는 국내 최대 소속사들의 아이돌 그룹들을 오늘 자바의 다차원 배열을 설명하기 위해 일거에 초청해서 그 화려한 예제(?)를 선보일까 한다.ㅎㅎ 이렇게 어려운 자리를 마련했는데도 이에 아랑곳하지 않고 잠드는 이는 없기를 빈다.^^


예제는 String 객체를 이용한 2차원 배열인데 { }를 이용해 저렇게 해당요소들을 넣으면 배열 사이즈를 자동적으로 맞춰준다. 이미 앞에서 공부한바 있으니 이 부분은 더이상 설명하지 않겠다. 혹시나 하는 마음에 복습도 할겸 대한민국 빅3 소속사를 1차원 배열로 만들었다. 2차원 배열은 보는바와 같이 각 소속사별로 속해있는 가수3명을 배열의 형태로 집어넣은 것이다. 그리고 반복문 for를 통해서 소속사별 가수들을 차례대로 출력하는 예제이다. 알기 쉽도록 주석을 달아놓았으니 코드를 이해하는데 큰 어려움은 없으리라 생각한다. 예제에 대한 결과는 아래와 같다.

대한민국 빅3 소속사와 소속 가수들

YG패밀리: 2ne1 빅뱅 세븐
SM타운: 샤이니 보아 소녀시대
JYP사단: 원더걸스 미쓰에이 2PM

빅뱅
보아
미쓰에이

예제에서 여러분이 집중해서 관찰해야될 부분은 2차원 배열명인 singer(가수)다. singer위의 company(소속사)를 보면 1차원 배열임을 알수 있을 것이다. 그런데 company에서 봤던 이런 1차원 배열이 singer에서는 하나가 아니라 여러개다. 이게 바로 2차원 배열인 것이다. 여러분이 눈으로 보는 그대로 이해하면 된다. 다른거 없다. 1차원 배열을 각각 하나씩 묶어서 또 배열을 만든 2차원 배열에서 괄호가 어떻게 들어가야되는지 유심히 보고 ,콤마를 넣어야할 자리인지 아닌지를 구분하여 익히도록 하자.

배열타입[ ][ ][ ] 배열명=new 배열타입[반드시기입][안써도 된다][안써도 된다]

String[ ][ ][ ] b=new String[3][ ][ ];
b[0][0]=new String[3];
b[0][1]=new String[3];
b[0][2]=new String[3];
b[1][0]=new String[3];
b[1][1]=new String[3];
b[1][2]=new String[3];
b[2][0]=new String[3];
b[2][1]=new String[3];
b[2][2]=new String[3];

2차원 배열에 이어서 3차원 배열로 들어가겠다. 조금 다르게 느낄지 모르겠지만 시작할때 array에 3이란 크기를 준것처럼 세개를 하나씩 묶어 생각하면 그리 다를건 없다. 위와 같은 방식으로 진행을 하면 일일이 각 요소값을 하나하나 집어넣어야 하는데 우리는 이미 이 단계를 넘어선 고수(?) 아니더냐? ㅎㅎ 예제처럼 바로바로 집어넣고 배열크기는 자바의 자동시스템(?)에 맡기도록 하자.^^ 2차원 배열에서 각 요소에 배열을 하나 더 얹이는 것 뿐이다. 그런데 개념을 제대로 이해하지 못하면 프로그램을 만들때 괄호랑 콤마 넣는게 무지 헤깔릴 것이다. 왜냐면 위에서 1차원 배열을 한묶음씩 묶어서 또 배열을 만든 것처럼 3차원 배열도 마찬가지로 2차원 배열을 한묶음씩 묶어서 또 배열을 만든 것이 바로 3차원 배열이기 때문이다. 필자가 방금 얘기한 설명을 이해했다면 예제만 봐도 술술 귀에 저절로 들어올 것이다. 물론 그렇지 않더라도 예제보면 그냥 이해되도록 모든 내공(?)을 예제에 쏟아부었다.^^

아까 2차원 배열에서 소속사별 가수들을 출력했다면 이번 3차원 배열에서는 소속사별 가수들이 발표한 노래들을 각각 출력하는 예제이다. 이번엔 예제를 보여주기에 앞서 결과부터 보여줄테니 이를 보고 한번 자바소스를 만들어 보도록 하자. 맨밑에 두단락은 배열의 각 지점에 대한 생각을 한번 해보라고 출력한 것이니 제외하고 그외의 사항들을 3차원 배열을 통해 어떻게 출력할수 있을지 연구해서 코드를 직접 짜보기 바란다. 정답을 기대한다기 보다는 틀리더라도 여러분이 한번쯤 생각해보고 시도해보는데 그 의의가 크다. 여러분이 되던 안되던 해보고 정답을 보는거랑 그냥 정답을 보는거랑은 천지차이다. 필자가 이 정도(?) 강조했으면 얼마나 중요한지 몸소 느끼고 실천에 옮길것이라 믿겠다.^^

대한민국 빅3 소속사와 소속 가수들

YG패밀리
2ne1: 박수쳐, Go away, 아파
빅뱅: 마지막 인사, 거짓말, 바보
세븐: 와줘, 아쉬운 이별, 너이길 바래

SM타운
샤이니: 루시퍼, 샤방샤방, 조조
보아: 사라, 걸스온탑, 마이네임
소녀시대: 훗, Gee, 소원을 말해봐

JYP사단
원더걸스: 텔미, 노바디, 쏘핫
미쓰에이: 배드걸 굿걸, Breathe, 러브어게인
2PM: I'll be back, Heartbeat, Without you

singer[0][1],singer[1][1],singer[2][1]를 출력합니다.
빅뱅
보아
미쓰에이

song[0][2][2],song[1][2][2],song[2][2][2]를 출력합니다.
너이길 바래
소원을 말해봐
Without you

괄호랑 콤마가 많아 여러분이 코드를 보고 치는데도 각고의 노력이 필요할듯 하여 관련 자료를 링크하니 여기를 클릭하고 예제를 다운받아서 본인이 만든 코드와 비교분석하기 바란다. 본 예제는 1차원 배열(소속사), 2차원 배열(가수), 3차원 배열(노래)까지를 총망라하여 전체 내용을 복습하기 좋게 만들었다. 더불어 예제의 3차원 배열명인 song에서 각 묶음별로 빈줄을 삽입해 내용을 바로 파악하도록 정성(?)을 들여놨으니 3차원 배열에서는 2차원 배열을 어떻게 한묶음씩 묶는지 잘 살펴보고 터득하면 4차원 이상의 배열도 문제가 없을 것이다. 덧붙이자면 3차원 배열이니 index 즉 각 지점별로 array 세자리 [ ][ ][ ]를 표시해야하니 for문을 세개 만든것이고  안에 if문은 노래 사이에 ,콤마 찍어서 보기 좋으라고 만든 것일뿐 특별한 의미는 없다. 차근차근 코드를 보다보면 큰 어려움은 없을 것이다. 이로서 오늘 배운 자바의 다차원 배열에 대해서 끝낼까 한다. 여러분이 저번 시간과 이번 시간을 소홀히 보내지 않았다면 자바의 배열에 대해서는 어느 정도 자신감(?)에 충만해졌으리라 생각한다. 자바에서 배열은 자료를 효율적으로 관리하는데 매우 유용하게 쓰이는 방식이다. 시간을 좀더 투자해서라도 부족한 부분이 있다면 확실하게 이해하고 다음 강좌로 넘어가기 바란다. 수고많았다.^^

댓글 9개:

  1. 댓글이 없네요;;
    좋은 정보 감사합니다~

    답글삭제
  2. 예제가 너무 잘되있네요. 배열때문에 헤메고 다니는중이 었는데.. 감사합니다.

    답글삭제
  3. 이게 이해가 된다고??????? 와....디져야겠네.....ㅜ

    답글삭제
  4. 뭔가 신기한 설명법이지만ㅋㅋ 잘봤습니다

    답글삭제
  5. Hey there, You've done a great job. I'll definitely digg it and
    personally recommend to my friends. I'm sure they will be benefited from this web site.

    Here is my blog post - laser cellulite treatment

    답글삭제
  6. glow skin care

    Here is my blog post :: private label skin care companies ()

    답글삭제
  7. 정말 너무 잘 설명해주셔서 감사합니다. 막연히 3차원 배열에는 두려움이 있었는데 이걸 보니 너무 쉽군요...

    잘 보고 갑니다~

    답글삭제
  8. 감사합니다.초보라 잘 모르지만 대충 감이 왔어요

    답글삭제
  9. 예제가 참신하고 이해하기 쉽게 설명해 주셔서 감사합니다

    답글삭제