====== 배열 ====== ===== 배열(array)이란 ===== - 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 "배열"이라고 한다. - 많은 양의 데이터를 저장하기 위해서, 그 데이터의 숫자만큼 변수를 선언해야 한다면 매우 혼란스러울 것이다. \\ 이런 경우에 배열을 사용하면 하나의 변수로 많은 양의 데이터를 손쉽게 다룰 수 있다. - 서로 다른 타입의 데이터를 하나로 묶어서 다루려면, 클래스를 정의해서 사용하면 된다. ===== 배열의 선언 ===== - 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[]를 붙이면 된다. - 가능하면 **타입[] 변수이름;** 을 추천한다. === === ^ 선언방법 ^ 선언 예 ^ | 타입[] 변수이름; | int[] score; \\ String[] name; | | 타입 변수이름[]; | int score[]; \\ String name[]; | ===== 배열의 생성 ===== - 배열을 선언한 다음에는 배열을 생성해야한다. - 배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어지는 것 뿐이다. - 배열을 생성해야만 비로소 데이터를 저장할 수 있는 공간이 만들어지는 것이다. - 배열을 생성하기 위해서는 new연산자를 사용하고 배열의 타입과 크기를 지정해 주어야 한다. int[] score; // 배열을 선언한다.(생성된 배열을 다루는데 사용될 참조변수 선언) score = new int[5]; // 배열을 생성한다.(5개의 int값을 저장할 수 있는 공간생성) - 위의 두 문장은int[] score = new int[5];와 같이 한 문장으로 줄여 쓸 수 있다. - 배열도 객체이기 때문에 멤버변수와 메서드를 갖고 있으며, 이 중 멤버변수 length는 배열의 크기에 대한 정보를 담고 있다. \\ 위의 예제코드에서 score의 크기가 5이므로 score.length의 값은 5가 된다. - **배열은 한번 생성되면 크기를 변경할 수 없다. ** ===== 배열의 초기화 ===== - 배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화되므로 배열을 사용하기 전에 초기화를 해주지 않아도 되지만, \\ 원하는 값으로 초기화 하기 위해서 다음과 같이 한다. int[] score = new int[5]; // 크기가 5인 int형 배열을 생성한다. score[0] = 100; // 각 요소에 직접 값을 저장한다. score[1] = 90; score[2] = 80; score[3] = 70; score[4] = 60; {{:study:java:javachobo:p5_9.gif|}} ===== 배열의 활용 ===== - 배열의 각 저장공간에 값을 저장하고 또는 저장된 값을 읽어오기 위해서는 배열 참조변수와 인덱스를 이용한다. - 배열의 인덱스는 배열의 각 저장공간에 자동적으로 주어지는 일련 번호인데, 0부터 시작해서 1씩 증가하는 연속적인 값이다. - 크기가 5인 배열에서는 index의 범위가 0~4까지 모두 5개가 된다. - 배열의 값을 읽거나 저장하기 위해서는 다음과 같이 배열 참조변수와 배열의 인덱스를 사용하면 된다. score[3] = 100; // 배열 score의 4번째 요소에 100을 저장한다. int value = score[3]; // 배열 score의 4번째 요소에 저장된 값을 읽어서 value에 저장한다. - 배열을 다루는데 있어서 for문은 거의 필수적으로 사용된다. \\ 이 때 for문의 조건식으로 배열의 크기를 직접 적어주는 것보다 \\ 배열의 속성인 length를 사용하는 것이 더 견고한 코드를 만든다. int[] score = { 100, 90, 80, 70, 60, 50 }; for (int i=0; i < 6; i++) { System.out.println(score[i]); } \\ 위의 코드는 배열의 각 요소를 for문을 이용해서 출력하는 일을 한다. \\ 여기서 score배열의 크기는 6이며 인덱스의 범위는 0~5이다. \\ 이 때 코드를 다음과 같이 변경하여 배열에 저장될 값을 하나 줄인다면, \\ 배열의 크기가 5로 변경되었으므로 유효한 인덱스의 범위는 0~4가 된다. - length는 배열의 크기가 변경됨에 따라 자동적으로 변경된 배열의 크기를 갖기 때문에, \\ 배열의 처리에 사용되는 for문의 조건식을 일일이 변경해주지 않아도 된다. for(int i=0; i < score.length; i++) { System.out.println(score[i]); } ===== 다차원 배열 ===== - 자바에서는 1차원 배열 뿐만 아니라 2차원 이상의 다차원 배열도 허용한다. - 2차원 배열을 잘 이해하면 2차원 이상의 배열에 응용하는 것은 그리 어렵지 않다. - 3차원이상의 고차원 배열의 선언은 대괄호[]의 개수를 차원 수 만큼 추가해 주기만 하면 된다. - 2차원 배열은 주로 테이블 형태의 데이터를 담는데 사용되며, 만일 5행 3열의 데이터를 담기 위한 배열을 생성하려면 다음과 같이한다. int[][] score = new int[5][3]; // 5행 3열의 2차원 배열을 생성한다. 위 문장이 수행되면 score[0][0]부터 score[4][2]까지 15개의 저장공간이 마련된다. === === ^ 선언방법 ^ 선언예 ^ | 타입[][] 변수이름; | int[][] score; | | 타입 변수이름[][]; | int score[][]; | | 타입[] 변수이름[]; | int[] score[]; | ===== 가변 배열 ===== - 자바에서는 2차원 이상의 배열에 대해서 "배열의 배열"의 형태로 처리한다는 사실을 이용하면 보다 자유로운 형태의 배열을 구성할 수 있다. - 2차원 이상의 다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 크기를 지정하지 않고, \\ 추후에 각기 다른 크기의 배열을 생성함으로써 고정된 형태가 아닌 보다 유동적인 가변 배열을 구성할 수 있다. - 아래와 같이 2차원 배열을 생성하면 다음과 같이 각 열마다 다른 크기의 배열이 생성하는 것이 가능하다. int[][] score = new int[5][]; score[0] = new int[4]; score[1] = new int[3]; score[2] = new int[2]; score[3] = new int[2]; score[4] = new int[3]; - 가변배열 역시 중괄호{}를 이용해서 다음과 같이 생성과 초기화를 동시에 하는 것이 가능하다. int[][] score = { {100, 100, 100, 100}, {20, 20, 20}, {30, 30}, {40, 40}, {50, 50, 50} }; ===== 배열의 복사 ===== - 배열은 한번 생성하면 그 크기를 변경할 수 없기 때문에 더 많은 저장공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 내용을 복사해야한다. - 배열 간의 내용을 복사하려면 for문을 사용하거나 System클래스의 arraycopy메서드를 사용하면 된다. - 배열은 생성과 동시에 자동적으로 자신의 타입의 기본값으로 초기화 되므로 배열 요소들이 int의 기본값인 0으로 초기화 되었다는 것을 알 수 있다. ===== 커맨드라인을 통해 입력받기 ===== - 커맨드라인을 이용한 방법 : System.in.read()이외에 화면을 통해 사용자로부터 값을 입력받을 수 있는 간단한 방법이 있다. - 프로그램을 실행할 때 클래스이름 뒤에 공백문자로 구분하여 여러 개의 문자열을 프로그램에 전달 할 수 있다. - 실행할 프로그램의 main메서드가 담긴 클래스의 이름이 MainTest라고하면 아래와 같이 실행할 수 있을 것이다. c:\j2sdk1.4.1\work>java MainTest abc 123 - 커맨드라인을 통해 입력된 두 문자열은 String 배열에 담겨서 MainTest클래스의 main메서드의 매개변수(args)에 전달된다. \\ main메서드 내에서 args[0],args[1]과 같은 방식으로 커맨드라인으로 부터 전달받은 문자열에 접근할 수 있다. \\ args[0]는 "abc"이고 args[1]은 "123"이다. - 커맨드라인에 입력된 매개변수는 공백문자로 구분하기 때문에 입력될 매개변수값에 공백이 있는 경우 겹따옴표(")로 감싸 주어야 한다. - **커맨드라인에서 숫자를 입력해도 숫자가 아닌 문자열로 처리된다는 것에 주의해야한다.**