배열(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
}
'JAVA > 자바의정석' 카테고리의 다른 글
JAVA(자바) : 조건문과 반복문 (0) | 2022.03.08 |
---|---|
자바(JAVA) - 컬렉션 프레임워크(Collection Framework) : ArrayList, LinkedList (0) | 2022.02.01 |
자바(JAVA) - java.lang 패키지 (4) : 유용한클래스 (0) | 2022.01.19 |
자바(JAVA) - java.lang 패키지 (3) : Math클래스 (0) | 2022.01.18 |
자바(JAVA) - java.lang 패키지 (2) : String 클래스 (0) | 2022.01.17 |