Java 프로그래밍, 자바 배열(Array)
자바 언어에서 배열(Arrays)은 특정 자료형의 데이터를 다수개 저장할 수 있는 데이터 구조(객체, Object)이다.
저장공간의 크기는 배열을 생성할 때 지정할 수 있고 일단 생성되면 크기는 고정되어 변경할 수 없다.
이미 생성된 배열의 크기를 변경할 수는 없으므로 크기가 다른 배열이 필요하다면 새로운 배열을 생성해야 한다
예를 들면, 원소(Elements)의 갯수가 10개인 정수 배열은 다음 그림과 같이 각 원소를 저장하기 위해 인접한 메모리 주소에 메모리가 할당된다.
배열의 각 원소에 접근하여 그 값을 할당하거나 읽어오기 위해서는 각 원소에 붙여진 색인(Index)을 이용하면 된다
package tutorials; import java.util.Arrays; import java.util.Random; public class Tutorials { public static void main(String[] args) { // 배열변수의 선언 int[] num; // int num[] -> 가능하지만 관례가 아님 // 메모리 할당(정수 5개x4=20바이트) num = new int[5]; // 색인(Index)번호는 각 원소에 0~4까지 설정됨 // 원소 초기화(Initialization) num[0] = 1; num[1] = 2; num[2] = 3; num[3] = 4; num[4] = 5; // 배열의 사용 int sum = num[0]+num[1]+num[2]+num[3]+num[4]; System.out.printf("배열 원소 %d개의 합계=%d %n", num.length, sum); // 배열의 생성과 초기화를 동시에 하는 예 (원소의 수에 따라 색인번호가 0부터 설정됨) String[] member = {"홍길동", "박정애", "박근화", "김연아", "박찬호"}; System.out.printf("member[%d]=%s %n", 3, member[3]); // 배열을 초기화할 때 {}사용한다면 반드시 배열변수와 동일한 행에서 초기화를 시작해야 한다 //member = {"최인철", "김판규", "김동권" }; // 오류 ? 왜? // 배열 변수가 선언된 행 아래에서 {}를 사용하여 배열을 초기화할 경우에는 다음과 같이 할 수 있다 member = new String[] {"최인철", "김판규", "김동권" }; // OK System.out.printf("member[%d]=%s %n", 1, member[1]); // 다차원 배열(Multi Dimensional Arrays) // 다차원의 배열은 배열의 배열이다(한개의 배열이 다른 배열의 원소가 되는 구조) int [][]point; // 2차원 배열변수 선언 point = new int[2][3]; // 2차원 배열변수 메모리 할당 // 2차원배열 내의 첫번째 배열 원소 초기화 point[0][0] = 92; point[0][1] = 90; point[0][2] = 88; // 2차원배열 내의 두번째 배열 원소 초기화 point[1][0] = 87; point[1][1] = 96; point[1][2] = 90; // 2차원배열의 사용 sum = point[0][0] + point[0][1] + point[0][2]; System.out.printf("2차원배열의 첫번째 원소배열의 합=%d %n", sum); // 다차원배열은 배열의 배열이므로 배열의 원소에 다른 배열이 저장되는 방식이다 // 위의 초기화는 다음과 같이 할 수도 있다 point[0] = new int[]{92,90,88}; point[1] = new int[]{87,96,90}; sum = point[0][0] + point[0][1] + point[0][2]; System.out.printf("2차원배열의 첫번째 원소배열의 합=%d %n", sum); // 다차원배열을 선언과 동시에 초기화하는 예 double[][] position = { {1.2, 2.1, 2.0}, {2.5, 2.1, 2.9}, {1.8, 2.3, 1.9} }; System.out.printf("position[%d][%d]=%f %n", 1,1, position[1][1]); // 배열원소의 복사 //public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) int[] dest = new int[3]; System.arraycopy(num, 2, dest, 0, 3); System.out.printf("dest[0]=%d, dest[1]=%d, dest[2]=%d %n", dest[0],dest[1],dest[2]); // Arrays.copyOfRange(int[] src, int from, int to)을 이용한 배열의 복사 // src : 소스배열, from(복사해올 시작 index, inclusive), to(복사해올 끝 index, exclusive) int[] toArr = Arrays.copyOfRange(num, 1, 4); // src배열의 1~3 까지 복사해옴 System.out.printf("복사한 원소수=%d %n", toArr.length); System.out.printf("toArr[0]=%d, toArr[1]=%d, toArr[2]=%d %n", toArr[0], toArr[1], toArr[2]); // 배열 원소의 정렬 // 임의의 수(난수)를 추출하는 방법: Random.nextInt(10): 0~9사이의 임의의 수 한개 추출 int[] rdNum = new int[10]; Random rd = new Random(); rdNum[0] = rd.nextInt(10)+1; rdNum[1] = rd.nextInt(10)+1; rdNum[2] = rd.nextInt(10)+1; rdNum[3] = rd.nextInt(10)+1; rdNum[4] = rd.nextInt(10)+1; rdNum[5] = rd.nextInt(10)+1; rdNum[6] = rd.nextInt(10)+1; rdNum[7] = rd.nextInt(10)+1; rdNum[8] = rd.nextInt(10)+1; rdNum[9] = rd.nextInt(10)+1; System.out.printf("정렬 전, rdNum=%s %n", Arrays.toString(rdNum)); Arrays.sort(rdNum); System.out.printf("정렬 후, rdNum=%s %n", Arrays.toString(rdNum)); // 배열의 원소에서 3을 찾아서 인덱스를 리턴함, 없으면 음수 리턴 int idx = Arrays.binarySearch(rdNum, 3); System.out.printf("배열 내의 %d의 위치=%d %n", 3, idx); } }