본문 바로가기

JAVA/자바의정석

자바(JAVA) : 배열(array) (1)

728x90
반응형

배열(array)

 

1.1 배열이란?

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라고 한다.

 

배열의 선언과 생성

원하는 타입의 변수를 선언하고 변수 또는 타입에 배열을 의미하는 대괄호[]를 붙이면 된다. 

 

1.2 배열의 선언방법

타입[ ] 변수이름; int[] score;
String[] name;
타입 변수이름[ ]; int score[];
String name[];

배열의 생성

타입[] 변수이름;
변수이름 = new 타입[길이];

위처럼 선언과 생성을 해주면 되지만 보통 선언과 생성을 동시에 한줄로 간략하게 한다.

타입[] 변수이름 = new 타입[길이]
int[] score = new int[5];

1.3 배열의 길이와 인덱스

생성된 배열의 각 저장공간을 '배열의 요소'라고 하며, '배열이름[인텍스]'의 형식으로 배열의 요소에 접근한다.

인덱스의 범위는 0부터 배열길이-1 까지이다.

 

배열의 길이가 5인 배열에서 인덱스는 다음과 같다

 

index : 0 index : 1 index : 2 index : 3 index : 4

 

배열의 길이

배열을 생성할 때 괄호[ ]안에 배열의 길이를 적어줘야하는데 배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수이다.

배열의 길이는 양의 정수이어야 하며 최대값은 int타입의 최대값, 약 20억이다. 다만 길이가 0인 배열도 생성이 가능하다.

 

배열이름.length

자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며, '배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다.

int[] arr = new int[5];

int num = arr.length;

위처럼 배열의 길이를 5로 정해놓고 arr.length를 통해 num변수에 저장하게되면 당연하겠지만 num은 5가 나온다.

 

배열의 길이 변경하기

배열은 한번 선언되고 나면 길이를 변경할 수 없다.

그렇다면 배열에 저장공간이 부족한 경우 어떻게 해야할까? 이때는 더 큰 길이의 새로운 배열을 생성한 다음, 기존의 배열에 저장된 값들을 새로운 배열에 복사하면 된다.

즉,
1. 더 큰 배열을 새로 생성한다.
2. 기존 배열의 내용을 새로운 배열에 복사한다.

 

1.4 배열의 초기화

배열은 생성과 동시에 자동으로 기본값으로 초기화되지만, 원하는 값을 저장하려면 각 요소마다 값을 지정해 줘야한다.

int[] score = new int[5];
score[0] = 50;
score[1] = 40;
score[2] = 30;
score[3] = 20;
score[4] = 10;

배열의 길이가 큰 경우는 요소 하나하나에 값을 지정하기 보다는 for문을 사용하여 배열에 넣는다.(이경우 반드시 일정한 규칙이 필요하다.)

 

배열의 생성과 초기화 방법

int[] score = new int[]{50,40,30,20,10};	//배열의 생성과 초기화를 동시에

int[] score = {50,40,30,20,10};		//new int[]는 생략가능

 

또 다른 예로, int배열을 받는 add메서드가 정의되어 있다. 허나 이 메서드를 호출해야할 경우 new 타입[]을 생략할 수 없다.

int add(int[] arr) { ... };

int[] result = add(new int[]{100,90,80,70,60});

 

배열의 출력

배열의 저장된 값을 확인 할 때는 for문을 사용하면된다.

더 간단한 방법은 Arrays.toString(배열이름) 메서드를 사용하면 된다.

 

1.5 배열의 복사

배열은 한번 생성하면 길이를 변경할 수없다. 그 때문에 더 많은 저장공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 내용을 복사해야한다.

배열을 복사하는 방법은 두가지가 있다.

1. for문을 이용해서 배열을 복사하기

int[] arr = new int[5];
	...
int[] tmp = new int[arr.length*2]; // 기존 배열보다 길이가 2배인 배열 생성

for(int i=0; i < arr.length; i++){
	tmp[i] = arr[i];	//arr의 값을 tmp 에 저장
   
arr = tmp; // 참조변수 arr이 새로운 배열을 가리키게 한다.

이러한 작업들은 꽤나 비용이 많이 들어 처음부터 배열의 길이를 넉넉하게 잡는것이 좋다.

마지막에 arr = tmp; 로 같은배열을 가리키게 되는데 배열 arr과 배열 tmp는 크기만 다를뿐 동일한 배열이 되고 , 그전에 arr이 가리키던 배열은 더이상 사용할 수 없게된다.

 

2. System.arraycopy()를 이용한 배열의 복사

for문 대신 System클래스의 arraycopy()를 사용하면 보다 간단하고 빠르게 배열을 복사 할 수 있다.

for문은 배열의 요소 하나하나에 접근해 복사하지만, arraycopy()는 지정된 범위의 값들을 한꺼번에 통째로 복사한다.

System.arraycopy(num, 0, newNum, 0, num.length);
//num[0]에서 newNum[0]으로 num.length개의 데이터를 복사한다.
public static void main(String[] args){
	char[] abc = {'a','b','c','d'};
    char[] num = {'0','1','2','3','4','5','6','7','8','9'};
    System.out.println(abc);
    System.out.println(num);
    //출력결과
    //ABCD
    //0123456789
    
    // 배열 abc와 num을 붙여 하나의 배열(result)로 만든다.
    char[] result = new char[abc.length + num.length];
    System.arraycopy(abc, 0, result, 0, abc.length};
    System.arraycopy(num, 0, result, abc.length, num.length};
    System.out.println(result);
    // 출력결과
    // ABCD0123456789
}

 

728x90
반응형