Java SE Tutorials/Arrays

Arrays in Java

Soul-Learner 2016. 11. 28. 17:10

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);
	}
}