배열의 생성
자바에서 배열을 만드는 방법을 알아봅시다. 아래는 numbers1이라는 변수에 4개의 int 데이터 타입을 담을 수 있는 배열을 만드는 방법입니다. 자바에서는 배열도 객체이기 때문에 new를 이용해서 배열을 생성해야 합니다.
1 | int [] numbers1 = new int [ 4 ]; |
만약 문자열 엘리먼트를 사용한다면 아래와 같이 해야겠죠.
1 | String[] strings = new String[ 4 ]; |
배열에 값을 저장할 때는 아래와 같이 합니다.
1 2 3 | numbers1[ 0 ]= 10 ; numbers1[ 1 ]= 20 ; numbers1[ 2 ]= 30 ; |
배열 numbers1[0]에서 숫자 0은 배열의 인덱스를 가리킵니다. 즉 numbers1[0] = 10;은 인덱스 0번째 엘리먼트가 10이라는 의미입니다.
배열의 생성과 값을 설정하는 것을 한 번에 하고 싶다면 아래와 같이 하시면 됩니다.
1 2 | int [] numbers2 = { 10 , 20 , 30 , 40 }; int [] numbers3 = new int []{ 10 , 20 , 30 , 40 }; |
예제코드 : http://ideone.com/EdJkGx
값 가져오기
값을 가져올 때는 아래와 같이 하면 됩니다.
1 | numbers1[ 0 ] |
물론 위의 코드는 동작하지 않습니다. 가져온 값을 가지고 아무것도 하지 않고 있기 때문이죠. 화면에 출력해보겠습니다.
1 | System.out.println(numbers1[ 0 ]); |
결과는 10입니다. 인덱스는 0부터 시작한다는 것 잊지 않으셨죠?
만약 아직 값을 지정하지 않은 엘리먼트를 조회하면 어떻게 될까요?
1 | System.out.println(string1[ 3 ]); |
결과는 0이 됩니다. 숫자 형식의 배열에는 값이 지정되지 않은 엘리먼트의 값은 0 입니다. 만약 배열의 데이터 타입이 문자열과 같은 객체라면 null이 됩니다.
예제코드 : http://ideone.com/XVm8bS
배열의 크기
배열의 크기를 알고 싶으면 length 메소드를 사용하시면 됩니다.
1 | System.out.println(numbers1.length); |
이상 합니다. 우리가 만든 배열에는 총 3개의 값이 설정되었습니다. 그런데 결과는 4입니다. 4는 배열을 생성할 때 지정한 크기와 같습니다. 만약 값이 지정된 배열의 개수를 알고 싶다면 어떻게 해야 할까요? 자바의 배열에서는 이런 기능이 기본적으로 제공되지 않습니다. 만약 이걸 알고 싶다면 데이터를 넣거나 제거할 때 어딘가에 기록해두어야 합니다.
바로 이런 이유에서 자바에서는 ArrayList나 LinkedList와 같은 리스트를 사용합니다. 리스트는 자동으로 엘리먼트를 수용할 수 있는 크기가 조정되고 또 리스트 내의 엘리먼트의 실제 개수를 알려줍니다. 리스트는 다음 시간에 배우게 됩니다.
예제코드 : http://ideone.com/wAv8oq
배열과 반복
모든 데이터 스트럭쳐는 반복과 밀접한 관계를 가지고 있습니다. 데이터 스트럭쳐는 복수의 데이터를 저장하는 일종의 저장소이고 복수의 데이터를 일괄적으로 처리하려면 반복작업이 필수적이기 때문입니다. 반복문을 이용해서 배열의 데이터를 처리해보겠습니다.
1 2 3 4 5 | int i= 0 ; while (numbers1.length > i){ System.out.println(numbers1[i]); i++; } |
변수 i는 반복 몇 번 반복했는지를 적어두기 위한 용도입니다. 반복 실행을 할 때마다 이 값을 1씩 증가시킵니다. 이 값이 배열의 크기 보다 작은 동안 반복실행을 계속하는 것이지요. 위의 코드는 그런 내용입니다.
조금 다른 방법도 있습니다. for문을 사용하는 것입니다. for문은 while문의 이런 패턴을 문법적으로 지원하는 기능이라고 할 수 있습니다.
1 2 3 | for (i= 0 ; numbers1.length>i; i++){ System.out.println(numbers1[i]); } |
위의 코드는 이전의 while문과 정확하게 동일한 코드입니다. 하지만 변수 i의 초깃값을 지정하고, 값을 증가시키고, 조건을 확인하는 코드가 문법적으로 정의되어 있습니다. 코드의 가독성이 좋아졌습니다. 반복횟수가 확정적일 때는 for문을 사용하는 것이 좋습니다.
예제코드 : http://ideone.com/L2Hjw1
배열의 한계
자바의 배열은 기능적으로 한계가 많습니다. 배열의 크기를 배열을 생성할 때 지정하는 것이나, 배열의 크기를 변경할 수 없는 것은 몹시 불편한 일입니다. 또 배열에서 설정된 엘리먼트의 개수를 알아낼 수 없는 것도 불편합니다. 그렇다고 배열이 쓸모가 없는 것은 아닙니다. 데이터의 크기가 확정적일 때 배열을 사용하는 것이 메모리나 처리속도 면에서 좋습니다. 또한 배열은 다른 데이터 스트럭쳐의 부품이 되기도 합니다. 기능이 최소한일수록 좋은 부품이 될 수 있습니다. 기능이 많으면 사용하기는 좋아도 그것을 사용할 수 있는 용도가 제한되기 때문입니다.
그럼 배열의 이런 한계를 극복하려면 어떻게 해야할까요? 조금 더 개선된 기능의 데이터 스트럭쳐를 고안할 필요가 있습니다. 그런 데이터 스트럭쳐가 바로 list입니다. 다음 시간에는 list에 대해서 알아봅시다.
전체코드
예제의 전체코드는 아래와 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | package list.array.api; public class Main { public static void main(String[] args) { int [] numbers1 = new int [ 4 ]; String[] strings = new String[ 4 ]; numbers1[ 0 ]= 10 ; numbers1[ 1 ]= 20 ; numbers1[ 2 ]= 30 ; int [] numbers2 = { 10 , 20 , 30 , 40 }; int [] numbers3 = new int []{ 10 , 20 , 30 , 40 }; System.out.println( "System.out.println(numbers1[0]);" ); System.out.println(numbers1[ 0 ]); System.out.println( "System.out.println(numbers1[3]);" ); System.out.println(numbers1[ 3 ]); System.out.println( "System.out.println(numbers1.length);" ); System.out.println(numbers1.length); System.out.println( "while" ); int i= 0 ; while (numbers1.length > i){ System.out.println(numbers1[i]); i++; } System.out.println( "for" ); for (i= 0 ; numbers1.length>i; i++){ System.out.println(numbers1[i]); } } } |