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