본문 바로가기
자바 한계단

자바 객체배열 복습

by juneMiller 2021. 10. 1.

우선 배열(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/

'자바 한계단' 카테고리의 다른 글

다형성 ploymorphism  (0) 2021.10.17
상속 Inherit  (0) 2021.10.17
자바 MVC 패턴  (0) 2021.10.01
자바 오버로딩, this, this()  (0) 2021.10.01
자바 구성멤버 [메소드]  (0) 2021.09.27