17편. 배열과 메서드, 다차원 배열

배열과 메서드
배열을 매개변수로 받는 메서드
이번에는 배열을 매개변수로 받는 메서드를 살펴보도록 하겠습니다. 배열을 매개변수로 받기 위해선 매개변수의 타입을 '요소타입[]'으로 둬야합니다.
class ArrayExamples { public static void main(String[] args) { int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; System.out.println(sum(nums)); // 55 } static int sum(int[] array) { int total = 0; for (int i = 0; i < array.length; i++) { total += array[i]; } return total; } }
위의 코드를 살펴보시면 sum() 메서드는 배열의 참조를 넘겨받아 배열의 각 요소에 접근하는 것을 볼 수 있습니다. 이를 그림으로 확인하면 아래와 같을 것입니다.

객체와 클래스 편의 '객체 참조를 메서드로 전달하기'에서 봤던 것처럼, 배열의 참조가 복사되는 거라면 참조형 변수 array를 이용해서 가리키고 있는 배열의 값을 수정할 수 있지 않을까요?
class ArrayExamples { public static void main(String[] args) { int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; add(nums, 10); for (int num : nums) { System.out.println(num); } } static void add(int[] array, int element) { for (int i = 0; i < array.length; i++) { array[i] += element; } } }
결과를 살펴보면 우리의 예상대로 배열 nums의 값이 바뀐 것을 볼 수 있습니다. 이해가 되시나요?
배열을 반환하는 메서드
배열을 반환하는 메서드를 만드려면 반환형을 '요소타입[]'으로 두면 됩니다.
class ArrayExamples { public static void main(String[] args) { int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int[] b = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; int[] c = add(a, b); for (int num : c) System.out.println(num); } static int[] add(int[] array1, int[] array2) { int[] array3 = new int[array1.length]; for (int i = 0; i < array1.length; i++) { array3[i] += array1[i] + array2[i]; } return array3; } }
이를 그림으로 확인하면 아래와 같을 것입니다. add() 메서드에서 새로운 배열을 생성하여 그 배열에 대한 참조를 반환하도록 했습니다. 여기서 참조형 변수 c가 그 배열의 참조를 담고 있습니다.

다차원 배열
2차원 배열
말 그대로 2차원 이상의 배열을 다차원 배열이라고 합니다. 여기서는 2차원 배열 위주로 살펴보도록 하겠습니다. 2차원 배열만 알아도 다른 차원의 배열도 무리없이 다루실 수 있을 겁니다. 2차원 배열은 아래와 같이 만듭니다.
int[][] array = new int[행][열];
예를 들면 아래와 같이 쓸 수 있습니다.
int[][] array = new int[3][4];
이를 그림에서 확인하면 다음과 같습니다. 아래 배열은 3행 4열인 2차원 배열이라고 말할 수 있습니다.

2차원 배열을 배열 이니셜라이저를 통해서 초기화하려면 아래와 같이 작성할 수 있습니다.
요소타입[][] 참조변수명 = new 요소타입[][] { {값00, 값01, 값02, ...}, {값10, 값11, 값12, ...}, ...};
예를 들면 아래와 같이 쓸 수 있습니다.
int[][] array = new int[][] { { 1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
이를 그림에서 확인하면 다음과 같습니다. 아래 배열은 3행 3열인 2차원 배열이라고 말할 수 있습니다.

이해를 돕기 위해서 가정을 하나 들겠습니다. 우리는 학생의 성적을 모두 더해서 각 학생의 평균 점수를 구하려고 합니다. 이를 코드로 옮기면 아래와 같이 작성할 수 있을 것입니다.
class ArrayExamples { public static void main(String[] args) { int[][] scores = { {79, 80, 81}, {83, 65, 90}, {80, 92, 100}, {100, 92, 98} }; int[] avgs = getAverages(scores); for (int i = 0; i < avgs.length; i++) { System.out.println((i + 1) + "번째 학생의 평균: " + avgs[i]); } } static int[] getAverages(int[][] scores) { int[] avgs = new int[scores.length]; for (int i = 0; i < scores.length; i++) { avgs[i] = (scores[i][0] + scores[i][1] + scores[i][2]) / 3; } return avgs; } }
코드에서 11~18행을 집중적으로 살펴보면 각 학생의 평균 점수를 저장할 avgs란 배열을 만들고, 그 이후에는 i번째 학생의 점수를 모두 더해서 평균 점수를 avgs[i]에 저장하는 것을 볼 수 있습니다. 마지막으로 평균 점수가 저장된 배열의 참조를 반환하는 걸 볼 수 있습니다. 이해가 되시나요?
3차원 배열
3차원 배열을 잠깐 살펴보면 3차원 배열은 아래와 같이 만들 수 있습니다.
요소타입[][][] 참조변수명 = new 요소타입[높이][세로][가로];
예를 들면 아래와 같이 쓸 수 있습니다.
int[][][] array = new int[3][3][4];
이를 그림에서 확인하면 다음과 같습니다.

배열 이니셜라이저로 3차원 배열을 초기화하면 다음과 같습니다. 가독성을 위해서 펼쳐 놓았습니다.
int[][][] array = new int[][][] { { {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} }, { {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} }, { {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} } };
가변 배열
2차원 배열을 아래와 같이 '배열의 배열'으로 바라볼 수 있습니다. 2차원 배열 array가 있다고 하면 array의 각 요소의 크기를 서로 달리할 수도 있지 않을까요?

가변 배열은 이름 그대로 요소의 크기가 서로 다른 배열을 말합니다. 자바에서 가변 배열은 아래와 같은 방법으로 만들 수 있습니다.
요소타입[][] 참조변수명 = new 요소타입[행][];
예를 들면 아래와 같이 쓸 수 있습니다.
class ArrayExamples { public static void main(String[] args) { int[][] array = new int[2][]; array[0] = new int[2]; array[1] = new int[3]; array[0][0] = 1; array[0][1] = 2; array[1][0] = 3; array[1][1] = 4; array[1][2] = 5; for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { System.out.print(array[i][j] + " "); } System.out.println(); // 다음 줄로 넘어간다 } } }
물론 3~12행을 아래와 같이 고쳐쓸 수도 있습니다.
int[][] array = new int[2][]; array[0] = new int[] { 1, 2 }; array[1] = new int[] { 3, 4, 5 };
또, 배열 이니셜라이저를 통해서 아래와 같이 고쳐쓸 수도 있습니다. 간단하죠?
int[][] array = new int[][] { { 1, 2 }, { 3, 4, 5 } };
'프로그래밍 관련 > 자바' 카테고리의 다른 글
19편. 제어자(Modifiers) (15) | 2012.08.19 |
---|---|
18편. 상속(Inheritance) (22) | 2012.08.16 |
16편. 배열(Array) (19) | 2012.08.12 |
15편. 생성자(Constructor) (14) | 2012.08.11 |
13편. 객체와 클래스(Objects and Classes) (57) | 2012.08.10 |
댓글을 사용할 수 없습니다.