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