배열과 메서드

배열을 매개변수로 받는 메서드

이번에는 배열을 매개변수로 받는 메서드를 살펴보도록 하겠습니다. 배열을 매개변수로 받기 위해선 매개변수의 타입을 '요소타입[]'으로 둬야합니다.

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