1. 배열(Array)


프로그래밍을 하시면서 배열(array)이라는 말을 들어보셨나요? 이미 알고있는 분들도 있고 그렇지 않은 분들도 있을 것입니다. 타 프로그래밍 언어에서도 자바에서도 배열은 어디에서나 쓰이는 중요한 녀석입니다. 이해를 돕기 위해서 가정을 하나 들겠습니다. 20개의 사과 박스에 각각 20~40개의 사과가 들어있다고 칩시다. 사과 박스안의 사과들이 총 몇개인지 세기 위하여 한 박스씩 사과의 갯수를 새로 총 사과의 갯수를 구하려고 합니다. 이것을 코드로 나타내봅시다.


...

int apple1 = 20;

int apple2 = 27;

int apple3 = 24;

int apple4 = 26;

int apple5 = 32;

int apple6 = 40;

int apple7 = 39;

int apple8 = 27;

int apple9 = 28;

int apple10 = 23;

int apple11 = 31;

int apple12 = 34;

int apple13 = 33;

int apple14 = 37;

int apple15 = 38;

int apple16 = 37;

int apple17 = 36;

int apple18 = 35;

int apple19 = 34;

int apple20 = 33;

...


코드 작성을 넘어서 진정한 문서 타이핑이 아닐 수 없습니다. 불필요하게 공간을 많이 차지하고 이 20개의 변수에 각각 접근하려면 어떻게 해야 될까요. 문제가 이만저만이 아닙니다. 사과박스가 20개여서 다행이지 만약에 90개, 100개라면 어떻게 코드로 옮길 수 있을까요? 우리가 오늘 배우게될 '배열(array)'이 위의 문제를 모두 해결할 수 있습니다. 많은 수의 변수를 선언하게 될때 배열을 사용하면 간단히 표현할 수 있습니다. 위의 코드를 배열로 바꿔보도록 하겠습니다.


class AppleBox {

public static void main(String[] args) {

int[] apple = {20, 27, 24, 26, 32, 40, 39, 27, 28, 23, 31, 34, 33, 37, 38, 37, 36, 35, 34, 33};

int total = 0;


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

System.out.println(i + 1 + "번째 사과박스에 들어있는 사과의 갯수: " + apple[i] + "개");

total += apple[i]; // total = total + apple[i]

}


System.out.println("총 사과의 갯수: " + total + "개");

}

}


결과:

1번째 사과박스에 들어있는 사과의 갯수: 20개

2번째 사과박스에 들어있는 사과의 갯수: 27개

3번째 사과박스에 들어있는 사과의 갯수: 24개

4번째 사과박스에 들어있는 사과의 갯수: 26개

5번째 사과박스에 들어있는 사과의 갯수: 32개

6번째 사과박스에 들어있는 사과의 갯수: 40개

7번째 사과박스에 들어있는 사과의 갯수: 39개

8번째 사과박스에 들어있는 사과의 갯수: 27개

9번째 사과박스에 들어있는 사과의 갯수: 28개

10번째 사과박스에 들어있는 사과의 갯수: 23개

11번째 사과박스에 들어있는 사과의 갯수: 31개

12번째 사과박스에 들어있는 사과의 갯수: 34개

13번째 사과박스에 들어있는 사과의 갯수: 33개

14번째 사과박스에 들어있는 사과의 갯수: 37개

15번째 사과박스에 들어있는 사과의 갯수: 38개

16번째 사과박스에 들어있는 사과의 갯수: 37개

17번째 사과박스에 들어있는 사과의 갯수: 36개

18번째 사과박스에 들어있는 사과의 갯수: 35개

19번째 사과박스에 들어있는 사과의 갯수: 34개

20번째 사과박스에 들어있는 사과의 갯수: 33개

총 사과의 갯수: 634개


이제 코드 해석을 해봅시다. 3행을 보시면 정수형 배열이 선언되었습니다. 배열 선언과 함께 그 값을 초기화 시켜주고 있습니다. 상당히 간단하죠? 그런데 여기서 조심하셔야 할게 있습니다.


int[] apple, int apple[]는 서로 하는 역할이 같습니다. apple라는 배열을 만들어 주는 것이죠. 그런데 여러개의 배열을 선언하게 될때는 또 어떨까요? int[] apple, apple1는 apple과 apple1 모두가 배열이라는 의미입니다. 그런데 반대로 int apple, apple1[]은 apple는 정수형 변수고 apple1은 배열이라는 의미죠.


4행은 total로 사과의 총 갯수가 들어갈 변수입니다. 6행을 보시면 for문이 사용되었습니다. 우선 i는 0부터, 그리고 apple.length는 배열의 길이를 의미합니다. apple의 길이는 20이므로 apple.length는 20이 되겠습니다. 그리고 아래를 보면 apple[i]가 보이는데, 배열은 첨자(index)값으로 접근할 수 있습니다. 이 첨자값은 0부터 시작하며, 말그대로 배열 첫번째 요소를 가리키려면 apple[0]을 써야하죠. apple[0]은 apple 배열의 첫번째 요소를 의미하므로 20이 됩니다. apple[1]은 두번째 요소를 의미하고 27이고, apple[2]는 세번째 요소를 의미하며 값은 24입니다.


그리고 그 아래행을 보면 total 변수에 apple[i]값을 더하고 있습니다. 그런 뒤에 루프를 돌다가 조건이 어긋나면 빠져나온뒤에 총 사과의 갯수를 출력하고 프로그램은 꺼져버립니다. 이 예제에서 알게된 배열의 특징을 정리해봅시다.


배열은 첨자(index, 인덱스)값으로 접근한다.

첨자값은 0부터 시작한다.


또 하나를 덧붙이자면, 배열은 객체(Object)입니다. 객체는 클래스를 공부할때 한번 배웠었죠? 그럼 다음이 무엇인지 예상해봅시다.


int[] apple = new int[20];


길이가 20인 apple 배열을 생성한 것과 같습니다. 즉, 정수형 변수가 20개가 만들어 진것과 동일한 기능을 합니다. C언어를 배우신 분들이라면 배열을 이미 사용해 보신 분들이 많습니다. 그런데 C언어 같은 경우는 배열을 선언하고 값을 초기화 시키지 않으면 출력시 에러가 납니다. 초기화 시키지 않았으니 쓰레기 값이 존재하기 때문이죠. 그런데 자바같은 경우는 우리가 따로 초기화를 시키지 않아도 알아서 0으로 초기화 시켜줍니다. 


위의 예제에서 배열이 선언된 행을 봅시다.

int[] apple = {20, 27, 24, 26, 32, 40, 39, 27, 28, 23, 31, 34, 33, 37, 38, 37, 36, 35, 34, 33};


위의 행은 아래와 같습니다.

int[] apple = new int[] {20, 27, 24, 26, 32, 40, 39, 27, 28, 23, 31, 34, 33, 37, 38, 37, 36, 35, 34, 33};


첫번째 방법이 개발자 사이에서 일반적으로 사용되는 방법입니다. 어느 방법을 사용하시든 상관이 없습니다. Int형이 아닌 String형으로 배열을 선언해봅시다. 아래의 예제를 보세요.


class StringArray {

public static void main(String[] args) {

String[] strArr = new String[3];

strArr[0] = "사과";

strArr[1] = "포도";

strArr[2] = "배";


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

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

}

}


결과:

strArr[0]: 사과

strArr[1]: 포도

strArr[2]: 배


3행을 보시면 String형으로 strArr라는 배열이 선언되었죠. new String[3]을 보아하니 길이가 3인, 즉 문자열 변수 세개가 생성됬다는 말과 같습니다. 4~6행을 보시면 참조값을 이용해 각 배열 요소에 접근을 하고 있구요. 첫번째 요소에는 사과가, 두번째 요소에는 포도가, 세번째 요소에는 배라는 문자열이 들어갔습니다.


그리고 8행을 봅시다. for문이 다시 등장했는데 아까의 예제와 똑같습니다. strArr.length는 배열 strArr의 길이를 구해주는 녀석입니다. 즉 strArr.length는 3과 같겠죠. 그리고 그 안에있는 문장은 각 배열 요소가 지니고 있는 값을 출력시켜주는 역할을 합니다. 결과를 보시면 올바르게 출력되었죠? 설명이 많이 길어진듯 하네요. 이번 강좌는 여기서 그만 마치겠습니다. 


수고하셨고, 다음 강좌에서는 배열을 매개변수로 받는 메소드, 다차원 배열을 배우도록 하겠습니다.