본문 바로가기

자바에서의 배열 선언 및 초기화

기본적으로 선언은 다음의 세 가지 형식이다.

 

① 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, 36);
        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, 370);
        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