열심히 스프링 기초 책을 읽고 있는데 자바의 기초 문법에서 헷갈려하는 나를 보고 충격받았다.(진심으로)
그래서 더 늦기 전에 기초를 회독하고자 자바의 정석을 학교 도서관에서 빌렸다.
배열
배열(array)이란?
int[] score = new int[5];
: 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것 (ex. 시험 성적)
서로 다른 타입의 변수들로 구성한 배열은 만들 수 없다.
여기서 중요한 것은 변수 score가 배열을 다루는데 필요한 참조변수일뿐 값을 저장하기 위한 공간이 아니라는 것이다.
배열의 선언과 생성
int[] score; // 배열을 다루기 위한 참조변수 선언
socre = new 타입[길이]; // 실제 저장공간을 생성
int[] score = new int[5]; // 물론 선언과 생성을 한 줄에 같이 할 수 있다.
- 타입[] 변수이름;
- 타임 변수이름[];
먼저 'new'에 의해서 메모리의 빈 공간에 5개의 int형 데이터를 저장할 수 있는 공간이 마련된다.
이때 배열의 각 요소는 자동적으로 int의 기본값인 0으로 초기화된다.
마지막으로 대입 연산자 '='에 의해 배열의 주소가 int형 배열 참조변수 score에 저장된다.
배열의 길이와 인덱스
배열의 인덱스는 0부터 '배열길이-1'까지이다.
0부터 시작되기 때문에 선언한 크기와 동일하다.
score[3] = 100; // score 배열의 4번째 요소에 100을 저장한다
int value = score[3]; // score 배열의 4번째 요소에 저장된 값을 value에 저장한다
만약 크기가 5인 score 배열에서 5번 인덱스(6번째 공간)를 호출하게 되면 유효하지 않은 값을 index로 사용했기 때문에 런타임 에러 ArrayIndexOutOfBoundsException이 발생할 것이다.
++ 배열의 길이는 0일 수도 있다.
때문에 배열의 길이는 int 범위의 양의 정수(0도 포함)이어야 한다.
int[] arr = new int[5]; // 길이가 5인 int 배열
int len = arr.length; // arr.length의 값은 5이고 len에 5가 저장된다
arr.length = 10; // 에러!!!!!!!!!!!!!!! 배열의 길이는 변경할 수 없다
코드를 보면 알 수 있듯이, 배열은 생성과 동시에 공간이 결정되기 때문에 뒤늦게 길이를 변경할 수 없다.
만약 배열의 길이를 변경하고 싶으면?
- 더 큰 배열을 새로 생성한다.
- 기존 배열의 내용을 새로운 배열에 복사한다.
하지만 배열의 길이를 변경하는 작업은 꽤나 비용이 많이 들기 때문에 처음부터 배열의 길이를 넉넉하게 잡는 것이 좋다. 그렇다고 너무 크게 잡으면 메모리를 낭비하게 되므로 기존의 2배 정도의 길이로 생성하는 것이 좋다.
배열의 초기화
int[] score = new int[] {50, 60, 70, 80, 90}
int[] score = {50, 60, 70, 80, 90}
자바는 반복문으로도 배열을 초기화할 수 있지만 위처럼 보다 더 간단한 방법을 제공한다. 배열의 크기는 중괄호 안에 있는 요소의 개수로 결정된다. 심지어 두 번째 줄 코드처럼 new int[]를 생략할 수 있다.
단!!!! 선언과 생성을 따로 하는 경우는 new int[]를 생략할 수 없다.
int add(int[] arr) { 내용 생략 }
int result = add(new int[] {100, 90, 80, 70, 60}) // OK
int result = add({100, 90, 80, 70, 60}) // 에러
또 다른 예로, 위와 같이 매개변수로 int배열을 받는 add메서드가 정의되어 있고, 이 메서드를 호출해야 할 경우 역시 'new 타입[]'을 생략할 수 없다.
int[] score = new int[0];
int[] score = new int[]{};
int[] score = {};
위의 세 문장은 모두 길이가 0인 배열을 생성한다.
배열의 복사
배열은 한 번 생성하면 그 길이를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 내용을 복사해야 한다.
for문을 사용한 복사
int[] arr = new int[5];
int[] tmp = new int[arr.length*2];
for int(i = 0; i<arr.length; i++) {
tmp[i] = arr[i];
}
arr = tmp; // 참조변수 arr이 새로운 배열을 가리키게 한다
- 배열 arr의 길이인 arr.length의 값이 5이므로 길이가 10인 int배열 tmp가 생성되고, 배열 tmp의 각 요소는 int의 기본 값인 0으로 초기화된다.
- for 문을 이용해서 배열 arr의 모든 요소에 저장된 값을 하나씩 배열 tmp에 복사한다.
- 참조변수 arr에 참조변수 tmp 값을 저장한다. arr의 값은 0x100에서 0x200으로 바뀌고, arr은 tmp을 가리키게 된다.
System.arraycopy()를 사용한 복사
for문 대신 System 클래스의 arraycopy()를 사용하면 보다 간단하고 빠르게 배열을 복사할 수 있다.
System.arraycopy(num, 0, newNum, 0, num.length);
// num[0]에서 newNum[0]으로 num.length개의 데이터를 복사
'Book > 자바의 정석' 카테고리의 다른 글
[자바의 정석] Chapter 7. 객체지향 프로그래밍 II - 추상메서드, 인터페이스 (0) | 2023.07.14 |
---|---|
[자바의 정석] Chapter 7. 객체지향 프로그래밍 II - 오버라이딩, 접근 제어자, 다형성 (0) | 2023.07.14 |
[자바의 정석] Chapter 6. 객체지향 프로그래밍 I - 오버로딩, 생성자 (0) | 2023.07.14 |
[자바의 정석] Chapter 6. 객체지향 프로그래밍 I - 클래스, 인스턴스, 메서드 (0) | 2023.07.14 |
[자바의 정석] Chapter 5. String 배열, 다차원 배열 (0) | 2023.07.14 |