1. 배열을 매개변수로 받는 메소드


전 강좌에서는 배열을 배워보았습니다. 이번 강좌에서는 배열을 매개변수로 받는 메소드와, 다차원(2, 3, 4~) 배열을 다뤄보도록 하겠습니다. StringArray 예제를 살짝 수정하여 아래에 기재해두었습니다.


class StringArray {

public static void ArrayPrint(String[] ar)

{

for(int i=0; i<ar.length; i++)

System.out.println("배열의 " + i + "번째 요소: " + ar[i]);

}


public static void main(String[] args) {

String[] strArr = new String[3];

strArr[0] = "사과";

strArr[1] = "포도";

strArr[2] = "배";


ArrayPrint(strArr);

}

}


결과:

배열의 0번째 요소: 사과

배열의 1번째 요소: 포도

배열의 2번째 요소: 배


2행을 보시면 바로 ArrayPrint라는 메소드가 정의되어 있는것과 14행에서 이 ArrayPrint 메소드를 호출한 것이 보이시죠? 매개변수를 살펴보면 문자열 배열을 받고 있음을 확인할 수 있고, 그 안에 보시면 ar를 통해 배열에 접근하고 있는것을 보실 수 있습니다. 5행을 보시면 배열의 요소를 하나하나씩 출력하고 있고 그 뒤에 모든 출력이 끝나면 ar는 소멸하고 끝납니다. 그러면 이번엔 배열을 매개변수로 받고 배열을 반환하는 예제를 보도록 합시다.


class StringArray {

public static int[] addNumArray(int[] ar)

{

for(int i=0; i<ar.length; i++)

ar[i] += 10;


return ar;

}


public static void main(String[] args) {

int[] numArr1 = {10, 20, 30, 40, 50};

int[] numArr2;


numArr2=addNumArray(numArr1);


for(int i=0; i<numArr2.length; i++)

System.out.println("numArr2[" + i + "]: " + numArr2[i]);

}

}


결과:

numArr2[0]: 20

numArr2[1]: 30

numArr2[2]: 40

numArr2[3]: 50

numArr2[4]: 60


바로 2행을 봅시다. 이번에는 정수형 배열을 매개변수로 받는 addNumArray라는 메소드가 정의되어 있습니다. 아까는 void가 있던 공간에 int[]가 들어섰죠? 이 부분엔 반환되는 값의 자료형에 따라 나뉜다고 했었습니다. 반환되는 값이 없다면 void, 만약 정수가 반환되면 int, 문자열이 반환되면 String 등으로 말이죠. 그럼 정수형 배열을 반환할때는 어떻게 해야할까요? 말 그대로 int[]를 넣어주시면 그것이 '이 메소드에선 정수형 배열을 반환한다'라는 의미가 됩니다. 5행은 각 배열 요소에다가 10씩 더하고있고, 그 아래의 7행은 ar 배열을 반환하고 있습니다.


14행에서, addNumArray에서 반환된 배열을 numArr2에 저장합니다. 그런뒤에 numArr2의 배열 요소를 출력시킨 후에 프로그램이 종료됩니다. 


이해가 덜 되신분들은 위의 예제를 수정하여 컴파일을 해보시거나, 직접 자기가 작성하여 컴파일을 해보시기 바랍니다. 왠만하면 후자를 권합니다!


2. 다차원 배열


다차원 배열! 말 그대로 2차원 배열의 이상을 다차원 배열이라고 합니다. 여기서는 3차원 배열 이상의 다차원 배열은  자주 사용되지 못하므로 2차원 배열만을 다루도록 하겠습니다. 2차원 배열을 이해하시면, 3차원 이상의 배열도 무리없이 다루실 수 있습니다.


아래 예제에서 2차원 배열이 등장합니다.


class TwoDimenArray {

public static void main(String[] args) {

int[][] grades = {{55, 60, 65}, {85, 90, 95}};

int high_test;


high_test = getHighest(grades, 2, 3);


System.out.println("가장 높은 점수는 " + high_test + "점 입니다.");

}


public static int getHighest(int[][] a, int row, int col)

{

int highest = a[0][0];


for(int i=0; i<row; i++)

for(int j=0; j<col; j++)

if (a[i][j]>highest)

highest = a[i][j];


return highest;

}

}


결과:

가장 높은 점수는 95점 입니다.


코드로 돌아가, 3행을 보시면 2차원 배열 grades가 선언되어 있음을 확인할 수 있습니다. 선언과 동시에 초기화를 하고있죠. 이 경우에는 행이 3, 열이 2인 2차원 배열이 만들어집니다. 그림으로 표현하자면,


<배열 grades>


즉 이렇게 각 배열의 요소들이 초기화 되었습니다. 6행을 보시면, getHighest라는 메소드가 호출되었죠. 매개변수로는 배열 grades, 그리고 열 2, 행 3을 넘겨주고 있습니다. 11행을 보시면 getHighest라는 메소드가 정의되어 있고 매개변수란에는 2차원 배열 a와 row, col의 값을 받습니다.


13행에서는 6명의 점수중 최고 점수를 가리기 위해서 제일 처음의 점수(a[0][0])를 highest에 넣습니다. a[0][0]이 제일 높다면 highest는 바뀌지 않겠죠. 우리가 1차원 배열을 사용했을때는 for문을 한번만 사용했었지만, 2차원 배열때는 15~16행 처럼 열과 행으로 나뉘므로 for문을 두번써야 합니다. 이렇게 해서 모든 배열 요소에 접근을 할 수 있게 되는거죠. 17행의 if문 안의 조건식을 보면, a[i][j]가 현재 최고점수(highest) 값보다 높을 경우에 점수 a[i][j]를 highest에 대입합니다. 그러면서 하나씩 하나씩 모두 비교를 거친 뒤에야 highest를 반환합니다. 여기서 가장 높은 점수는 95이므로 highest가 지니고 있는 값도 95이겠죠. 95가 6행의 high_test라는 변수에 들어간 뒤 8행에서 high_test가 지니고 있는 값을 출력합니다. 그리고 프로그램이 종료됩니다.


다시 3행으로 돌아갑시다. 3행의 코드는 아래의 코드와 동일한 코드입니다.

int[][] grades = new int[][] {{55, 60, 65}, {85, 90, 95}};


만약 초기화 하지 않고 우선 공간을 확보해야 하겠다면,

int[][] grades = new int[2][3]; // = new int[행][열]


이렇게 선언하시면 됩니다. 이미 위의 예제에서 알게된 분들도 있겠지만, 배열의 접근방법은..

a[0][0] = 55; a[0][1] = 60; a[0][2] = 65;

a[1][0] = 85; a[1][1] = 90; a[1][2] = 95; // a[행][열] = 값


만약에 2행 2열에 있는 값은 90, 1행 3열에 있는 값은 65입니다. 주의하실 점이 있다면 index는 0부터 시작한다는 사실을 잊지 마셔야 합니다. (2행 2열 = [1][1], 1행 3열 [0][2])


오늘은 여기에서 강좌를 마치도록 하겠습니다. 수고하셨고, 다음 강좌에서는 상속과 접근 제한자에 대해서 알아보도록 하겠습니다.