(Java) 자바의 정석 3판 006일차 - 배열
배열
Java에서는 길이가 0인 배열의 선언도 가능하다.
또한 길이는 int 범위의 양의 정수이다.
1 | import java.util.Arrays; |
배열을 복사하는 방법
하드코딩(비효율적)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import java.util.Arrays;
public class test2 {
public static void main(String[] args) {
// 배열의 길이를 늘리고 싶다고 생각하면 아래와 같이 복사해야한다.
int arrNum[] = {1, 2, 3, 4, 5};
int arrNumLen = arrNum.length;
// 배열의 길이가 너무 길어지면 메모리에 부담이 되므로 x2 정도가 적당하다.
int tmp[] = new int[arrNumLen*2];
// for 문을 돌리는 부분에서도 상당한 비용을 소모한다.
for(int i=0; i<arrNumLen; i++) {
tmp[i] = arrNum[i];
}
arrNum = tmp;
// 원본 배열과의 참조 관계가 끊겼다는 걸 알 수 있다.
// 즉 원본 배열 [1, 2, 3, 4, 5]는 가비지 컬렉팅 대상이 된다.
System.out.println(arrNum.length); // 10
System.out.println(Arrays.toString(arrNum)); // [1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
}
}내장된 API 사용(효율적)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import java.util.Arrays;
public class test2 {
public static void main(String[] args) {
// 배열의 길이를 늘리고 싶다고 생각하면 아래와 같이 복사해야한다.
int arrNum[] = {1, 2, 3, 4, 5};
int arrNumLen = arrNum.length;
// 배열의 길이가 너무 길어지면 메모리에 부담이 되므로 x2 정도가 적당하다.
int tmp[] = new int[arrNumLen*2];
// for 문은 요소 하나하나마다 접근하지만
// 배열은 연속된 메모리 공간이라는 점을 활용하여
// arraycopy 메소드는 하나의 값으로 취급하여 접근한다고 한다.
System.arraycopy(arrNum, 0, tmp, 0, arrNumLen);
arrNum = tmp;
// 원본 배열과의 참조 관계가 끊겼다는 걸 알 수 있다.
// 즉 원본 배열 [1, 2, 3, 4, 5]는 가비지 컬렉팅 대상이 된다.
System.out.println(arrNum.length); // 10
System.out.println(Arrays.toString(arrNum)); // [1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
}
}
String 클래스의 배열
1 | public class test2 { |
String 클래스는 char 배열에 기능을 추가하여 확장한 것.
객체 지향 이전의 절차 지향의 C언어의 경우에는
데이터와 기능을 따로 다루었지만(그래서 char 배열로 문자열을 표현),
객체 지향 개념인 Java에서는 데이터와 그와 관련된 기능을 하나의 클래스로 묶음.
기능 = 함수 = 메소드라고 보면 된다.
하지만 char 배열과 달리 String 클래스는 내용의 변경이 불가능하다.
변경 가능한 String 클래스는 StringBuffer라는 클래스가 따로 있다.
1 | public class test2 { |
String 클래스와 char 배열의 변환은 아래와 같다.
1 | public class test2 { |
향상된 for문
1 | public class test2 { |
다차원 배열
1 | public class test2 { |
가변 배열 문제만 보고 있다보니 드럽게 재미없다.
좀 쉬다가 다른 공부나 해야지…
+ 내용 추가(170125)
연습문제 오답 정리
- 배열의 잘못된 선언 및 초기화
b. int[] arr = {1,2,3,}; // 마지막의 쉼표는 있어도 상관없음.
d. int[] arr = new int[5]{1,2,3,4,5}; // 두 번째 대괄호[]에 숫자 넣으면 안됨.
e. int arr[5]; // 배열을 선언만 할 때는 배열의 크기를 지정할 수 없음.