자바 한계단

자바 객체배열 복습

juneMiller 2021. 10. 1. 18:16

우선 배열(Array)은 같은 자료형을 연속해서 사용하는 시스템입니다. 

그런데 자바는 객체지향 프로그램으로 모든 프로그램을 객체 중심으로 작성합니다. 

객체 역시 하나의 자료형 입니다. 

 

그렇다면 궁금증이 객체도 배열로 만들 수 있는가? 입니다. 정답은 만들 수 있습니다. 

 

자바에는 기본 자료형과 참조 자료형이 있습니다. 

이 두 자료형의 차이점을 이해하는 것이 

일반 배열(Array)  와 객체 배열(Array of Objects) 의 차이를 입니다. 

 

클래스를 통해 알아보면 다음과 같습니다. 

public class Main {
    public static void main(String[] args) {
        myObject[] arrayObj = new myObject[3];

        for (int i = 0; i < arrayObj.length; i++) {
            System.out.println("arrayObj["+i+"] = " + arrayObj[i]);
        }
    }
}
class myObject{
    int id;
    String description;
    myObject(){
    }
}
[실행값]
arrayObj[0] = null
arrayObj[1] = null
arrayObj[2] = null

배열은 length 를 사용하여 사이즈를 측정할 수 있는데 객체도 마찬가지입니다.

length를 이용하여 for 루프를 돌려보면 3개의 배열 공간이 생성되었고

null 로 초기화 된 것을 볼 수 있습니다.

 

여기까지 보면 객체 배열이 만들어진 것 처럼 보입니다.

그러면 객체의 멤버변수에 값을 할당해보겠습니다.

 

        arrayObj[0].id = 10;
[실행값]
Exception in thread "main" java.lang.NullPointerException: Cannot assign field "id" because "arrayObj[0]" is null
    at com.kay.Main.main(Main.java:7)

오류 메시시가 발생했습니다.

NullPointerException 포인터가 없습니다.

왜냐하면 arrayObj[0] 은 현재 null 값을 가리키고 있습니다.

field인 id에 . 도트 연산자를 걸어서 사용하려고 했었죠?

이때 . 도트 연산자의 의미는 참조변수가 실제 객체를 찾아가서

객체의 멤버변수 값을 가져오는 것 입니다.

 

 

그런데 참조변수가 null 이니 일단 실제 객체(인스턴스)를 찾을 수 없습니다.

당연히 . 도트연산자도 먹히지 않습니다.

 

new 키워드로 생성한 것은 객체를 담을 배열이었던 것 입니다.

실제 객체의 인스턴스를 생성하는 일은 별개의 메모리에서 이루어집니다.

 

이 부분이 객체 배열을 이해하는 핵심입니다.

처음에 배열을 동적할당 한 후 각 객체 인스턴스도 동적 메모리 할당을 합니다.

new 키워드는 객체를 힙메모리에 할당합니다.

 

public class Main {
    public static void main(String[] args) {
        myObject[] arrayObj = new myObject[3];

//        사용할 수 없다
//        arrayObj[0].id = 10;

        arrayObj[0] = new myObject(101, "first  array, John");
        arrayObj[1] = new myObject(102, "second array, Mary");
        arrayObj[2] = new myObject(103, "third  array, Smith");

        for (int i = 0; i < arrayObj.length; i++) {
            System.out.println("arrayObj["+i+"] = " + arrayObj[i]);
        }
        
        arrayObj[0].showInfo();
        arrayObj[1].showInfo();
        arrayObj[2].showInfo();
    }
}
class myObject{
    int id;
    String description;

    myObject(){
    }
    public myObject(int id, String description) {
        this.id = id;
        this.description = description;
    }
    public void showInfo(){
        System.out.println("(id) : " + id);
        System.out.println("(description) : " + description);
    }
}
[실행값]
arrayObj[0] = com.kay.myObject@12edcd21
arrayObj[1] = com.kay.myObject@34c45dca
arrayObj[2] = com.kay.myObject@52cc8049
(id) : 101
(description) : first  array, John
(id) : 102
(description) : second array, Mary
(id) : 103
(description) : third  array, Smith

실행을 하면 객체 배열에 각 객체의 해시값이 할당된 것을 볼 수 있습니다.

이는 참조변수로 이제 . 도트연산자를 사용하여 멤버 변수를 찾아 갈 수 있습니다.

 

 

 

원본 -https://smoothiecoding.kr/%EC%9E%90%EB%B0%94-%EA%B0%9D%EC%B2%B4-%EB%B0%B0%EC%97%B4/