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 |