RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
Study  2008. 5. 31. 15:32

6.2.6 객체 배열


지금까지는 기본 데이터 타입에 대한 배열만 언급했습니다. 클래스 또한 배열을 생성할 수 있습니다. 객체 배열이 기본 데이터 타입 배열과 다른 점이 있기 때문에 여기서 정확하게 짚고 넘어가도록 하겠습니다. 기본 데이터 타입으로 배열을 만들면 선언과 동시에 메모리가 생성됩니다. 하지만 객체 배열을 만들었을 때는 객체의 이름만 첨자 수만큼 생성됩니다. 실제 객체 내부의 메모리는 생성되지 않습니다. 

▣ 객체 배열
◈ 객체 배열을 선언했을 때 첨자의 수만큼 참조변수가 만들어진다.
◈ 각각의 참조변수에 대한 객체의 메모리는 생성되지 않는다.

다음과 같은 Dog 클래스가 있다고 가정하고 Dog형의 객체 배열을 생성해 보도록 하죠.

▣ Dog 클래스
◈ class Dog{
◈         //...클래스의 내용
◈ }

▣ Dog형의 배열생성
◈ Dog[] art = new Dog[10];

이 때 참조변수가 10개 생성됩니다. 하지만 10개의 참조변수에 대한 객체 자체의 메모리는 생성되지 않습니다. 즉 객체의 메모리는 따로 생성해 주어야 합니다. 위의 구문을 유심히 살펴보면 new를 사용했지만 생성자를 호출하지는 않았습니다. 그렇기 때문에 위의 구문은 art[0]부터 art[9]까지 참조변수만 10개가 만들어진 것입니다. 다음과 같이 각각의 참조변수에 대한 객체의 메모리를 생성하는 과정이 별도로 필요합니다.

▣ 각각의 참조변수에 대한 메모리 생성
◈ art[0] = new Dog();
◈ art[1] = new Dog();
◈ art[2] = new Dog();
◈ art[3] = new Dog();
◈ art[4] = new Dog();
◈ art[5] = new Dog();
◈ art[6] = new Dog();
◈ art[7] = new Dog();
◈ art[8] = new Dog();
◈ art[9] = new Dog();

기본 데이터 타입의 배열과 객체 배열의 차이는 메모리 생성에 있습니다. 기본 데이터 타입의 배열은 배열의 선언과 동시에 메모리가 생성됩니다. 하지만 객체 배열은 변수의 선언과 메모리 할당이 분리되어 있습니다. 객체 배열을 생성했다면 객체변수의 이름들만 첨자의 수만큼 생성될 뿐 객체의 메모리는 생성되지 않습니다. 

▣ 기본 데이터 타입 배열 vs 객체 배열
◈ 기본 데이터 타입 배열 : 배열 생성과 동시에 메모리가 생성된다. 
◈ 객체 배열 : 객체 배열을 생성했다면 객체변수(참조변수)의 이름들만 생성되고, 객체들의 실제 메모리는 생성되지 않는다.

배열의 선언과 동시에 메모리가 생성되면 기본 데이터 타입 배열이며, 배열을 생성한 후 따로 메모리를 생성과정이 필요하다면 객체 배열입니다. 객체 배열을 테스트하는 예를 작성해 보도록 하겠습니다.

『chap06\ObjectArrayMain.java』
ⓙ───────────────────────────────────────
/**
객체 배열을 테스트하는 예
**/
class Dog {
    private String name;
    private String kind;
    public Dog(String name, String kind) {
        this.name = name;
        this.kind = kind;
    }
    public String toString() {
        return kind + ":" + name;
    }
} //end of Dog class

public class ObjectArrayMain {
    public static void main(String[] args) {
        //1. 객체배열의 생성
        Dog[] dog = new Dog[5];
        for(int i=0; i<dog.length; i++)        
            System.out.println("Dog[" + i + "] : " + dog[i]);
        //2. 객체배열의 참조변수에 메모리할당
        dog[0] = new Dog("쫑쫑이","불독");
        dog[1] = new Dog("워리","똥개");
        dog[2] = new Dog("개똥이","진도개");
        dog[3] = new Dog("발리","푸들");
        dog[4] = new Dog("투덜이","잡종");        
        for(int i=0; i<dog.length; i++)        
            System.out.println("Dog[" + i + "] : " + dog[i]);
    } //end of main
} //end of ObjectArrayMain class
//㉶--------------------------------------------㉳
/***
C:\javasrc\chap06>javac ObjectArrayMain.java
C:\javasrc\chap06>java ObjectArrayMain
Dog[0] : null
Dog[1] : null
Dog[2] : null
Dog[3] : null
Dog[4] : null
Dog[0] : 불독:쫑쫑이
Dog[1] : 똥개:워리
Dog[2] : 진도개:개똥이
Dog[3] : 푸들:발리
Dog[4] : 잡종:투덜이
***/
───────────────────────────────────────ⓑ

위의 예에서 Dog 클래스형의 객체 배열을 만든 후 바로 출력하면 null로 표시됩니다. 이것은 객체 배열을 만들었을 때 객체의 메모리가 생성되지 않는다는 것을 의미합니다. 그렇기 때문에 배열 내의 각각의 객체에 대해 따로 메모리를 생성하는 모습을 볼 수 있습니다.
    
▣ 객체 배열의 생성
◈ Dog[] dog = new Dog[5];

▣ 객체 배열의 변수에 메모리 할당
◈ dog[0]=new Dog("쫑쫑이","불독");
◈ dog[1]=new Dog("워리","똥개");
◈ dog[2]=new Dog("개똥이","진돗개");
◈ dog[3]=new Dog("발리","푸들");
◈ dog[4]=new Dog("투덜이","잡종");
 
이와 같이 객체 배열의 경우에는 각각의 변수에 다시 객체의 메모리를 생성하는 과정을 거쳐야 완전한 객체가 됩니다. 객체 배열은 배열의 생성과 메모리의 할당이 분리되어 있다는 점을 유념하시기 바랍니다.
Trackback
Reply
bslime:
전체보기 (52)
목소리 (1)
영화 (0)
음악 (0)
Study (34)
Security (12)
Wargame (5)
«   2024/05   »
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 31