기본적으로 선언은 다음의 세 가지 형식이다.
① int[] arr = new int[3];
② int[] arr = ;
③ int[] arr = new int[] ;
②, ③의 경우 배열의 길이는 자동으로 5로 정해진다.
주의할 점은 배열도 객체라는 것. 때문에 다음 코드는 NullPointerException을 발생시킨다.
int[] arr;
arr[3] = 5;
배열 객체를 참조할 변수( arr )만 생성했을 뿐, 실제로 배열 객체를 참조하고 있지는 않다.
따라서 arr[3] 과 같이 배열의 요소에 접근한다는 것은 당연히 불가능하다.
그리고 sizeof 연산자를 통해 sizeof(ARRAY) / sizeof(TYPE) 로 배열의 길이를 계산하는 C언어와 달리 Java는 배열이 객체고, 객체 안에 배열의 길이를 나타내는 length 라는 필드가 있다. length 는 다음과 같이 쓰인다.
for(int i = 0; i < arr.length; i++) {
arr[i] = i;
}
C언어와 또 한 가지 다른 점은 다음과 같이 배열 길이로 변수를 줄 수 있다는 것이다. 물론 C언어에서도 가능하지만, 그렇지 않은 컴파일러가 더 많다.
int[] arr = new int[n];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import java.util.Scanner;
public class Example {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n;
int[] arr;
System.out.print("Input length of array: ");
n = scanner.nextInt();
arr = new int[n];
System.out.println("length of array: " + arr.length);
scanner.close();
}
}
|
cs |
Java에서는 Arrays 클래스를 통해 배열의 정렬 메소드와 초기화 메소드를 제공한다.
Modifier and Type |
method |
Description |
static void |
sort(XXX[] a) |
배열 전체를 오름차순으로 정렬 |
static void |
sort(XXX[] a, int fromIndex, int toIndex) |
fromIndex부터 toIndex 전까지만 오름차순 정렬 |
static void |
fill(Object array, XXX value) |
array 전체를 value로 초기화 |
static void |
fill(Object array, int fromIndex, int toIndex, XXX value) |
fromIndex부터 toIndex 전까지만 value로 초기화 |
여기서 XXX는 기본 타입(byte, short, char, int, float, long, double)이다.
< sort() >
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import java.util.Arrays;
public class Example {
public static void printArray(int[] arr) {
System.out.print("[ " + arr[0]);
for(int i = 1; i < arr.length; i++) {
System.out.print(", " + arr[i]);
} System.out.println(" ]");
}
public static void main(String[] args) {
int[] arr = new int[10];
for(int i = 0; i < arr.length; i++) {
arr[i] = arr.length - i;
}
System.out.print("Before call sort(arr): "); printArray(arr);
Arrays.sort(arr);
System.out.print("After call sort(arr): "); printArray(arr);
for(int i = 0; i < arr.length; i++) {
arr[i] = arr.length - i;
}
System.out.print("\nBefore call sort(arr, 3, 6): "); printArray(arr);
Arrays.sort(arr, 3, 6);
System.out.print("After call sort(arr, 3, 6): "); printArray(arr);
}
}
|
cs |
< fill() >
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import java.util.Arrays;
public class Example {
public static void printArray(int[] arr) {
System.out.print("[ " + arr[0]);
for(int i = 1; i < arr.length; i++) {
System.out.print(", " + arr[i]);
} System.out.println(" ]");
}
public static void main(String[] args) {
int[] arr = new int[10];
for(int i = 0; i < arr.length; i++) {
arr[i] = i;
}
System.out.print("Before call fill(arr, 3): "); printArray(arr);
Arrays.fill(arr, 3);
System.out.print("After call fill(arr, 3): "); printArray(arr);
for(int i = 0; i < arr.length; i++) {
arr[i] = i;
}
System.out.print("\nBefore call fill(arr, 3, 7, 0): "); printArray(arr);
Arrays.fill(arr, 3, 7, 0);
System.out.print("After call fill(arr, 3, 7, 0): "); printArray(arr);
}
}
|
cs |
기본 타입 배열 뿐만 아니라 객체 배열도 선언할 수 있다.
이 때 기본 타입 배열과 달리 객체 자체가 배열의 요소가 되는 게 아니라, 각 배열의 요소가 객체를 참조하는 구조다. 그림으로 나타내면 다음과 같다.
<Member>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public class Member {
private int number;
private String name;
private int age;
public Member(int number, String name, int age) {
this.number = number;
this.name = name;
this.age = age;
}
public int getNumber() { return number; }
public void setNumber(int number) { this.number = number; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
|
cs |
<실행 클래스>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class Example {
public static void main(String[] args) {
Member[] members = {
new Member(1, "Aram", 13),
new Member(2, "Beethoven", 37),
new Member(3, "Chopin", 22),
new Member(4, "Dmitri", 34),
new Member(5, "Edvard", 46)
};
for(int i = 0; i < members.length; i++) {
System.out.printf(
"%d. %s: %d\n",
members[i].getNumber(), members[i].getName(), members[i].getAge()
);
}
}
}
|
cs |
객체 배열에서 특히 주의할 것은 NullPointerException이다.
1
2
3
4
5
6
7
8
|
public class Example {
public static void main(String[] args) {
Member[] members = new Member[3];
members[0].setAge(10);
}
}
|
cs |
앞에서 본 바와 같이 객체 자체가 배열의 요소가 되는 게 아니라, 배열의 요소들이 객체를 참조하는 구조다.
따라서 new Member[3]; 로 배열을 생성하는 것은 Member 객체를 가리킬 수 있는 변수들의 배열을 선언하는 것이다. 다시 말해 각 요소는 현재 아무것도 참조하고 있지 않다.
그래서 6행과 같이 객체에 접근하면 NullPointerException 이 발생하는 것이다.
'Programming > Java' 카테고리의 다른 글
Managed code (0) | 2019.07.04 |
---|---|
IO 입출력 (0) | 2019.05.23 |
BigInteger 클래스 (0) | 2019.04.17 |
용어 정리 (0) | 2019.04.08 |
[과제] 호텔 예약 프로그램 (0) | 2019.04.08 |