Java : Object Array(객체 배열)

2023. 3. 20. 15:28java


class SimpleA {
    // 필드
    String name;
    int data;
   
    // 생성자
    // 기본 생성자
    SimpleA() {
        this(null, 0);
    }
    // 이름만 초기화하는 생성자
    SimpleA(String name) {
        this(name, 0);
    }
    // 이름과 데이터를 초기화하는 생성자
    SimpleA(String name, int data) {
       
        // 필드의 유효성을 검사하는 코드를 추가해야한다면
        // 해당 생성자에서만 추가를 해도 된다.
        if(name == null || name.length() <= 2)
            name = "Unknwon";
       
        // 필드의 이름과 매개변수의 이름이 동일하기 때문에
        // 필드에 접근하기 위해서는 this 레퍼런스를 이용
        this.name = name;
        this.data = data;
    }
   
    // 같은 타입의 객체를 받아서 같은 필드로 초기화하기 위한 생성자
    // 즉, 필드를 복사할 객체만 전달 받아 초기화
    SimpleA(SimpleA other) {    // 복사 생성자
        this.name = other.name;
        this.data = other.data;
    }
   
    // 자신의 복사 복사본을 반환하는 메서드
    SimpleA copy() {            // 복사 팩토리
//      SimpleA copyObject = new Simple(name, data);
//      return copyObject;
       
        // 복사 생성자가 있는 경우
        return new SimpleA(this);
    }
   
    void print() {
        System.out.println(name + " : " + data);
    }
   
}


public class File01_ObjectArray {
    public static void main(String[] args) {
        SimpleA s1 = new SimpleA("DataA", 100);
        s1.print();
       
        // 얕은 복사(Shallow copy)와 깊은 복사(Deep copy)
        //  얕은 복사 : 주소 값을 복사 = 같은 메모리를 공유
        //  깊은 복사 : 실제 값을 새로운 메모리 공간에 복사
       
        // 얕은 복사
        SimpleA s2 = s1;
        // 참조 변수 s1 에 저장된 객체의 주소가 s2 에 복사
        // 즉, 같은 객체를 참조
        s2.print();
       
        s1.name = "-";
        s1.data = 300;  // 참조 변수 s1 을 통해 data 를 수정
       
        s2.print();     // 참조 변수 s2 를 통해 data 를 출력할 때
                        // 수정된 data 가 출력
       
        // 깊은 복사
       
        // 만약 필드의 값만 같은 별도의 객체를 생성하려면
        // 객체를 따로 생성하고 필드를 같은 값으로 초기화
        SimpleA s3 = new SimpleA(s1.name, s1.data);
       
        SimpleA s4 = new SimpleA(s1);
        SimpleA s5 = s1.copy();
        s3.print();
        s4.print();
        s5.print();
        //---------------------------------------------------------------
        // 객체 배열(Object Array)
        //  - 배열(Array)
        //      같은 타입의 저장 공간들의 집합
        //  - 객체 배열
        //      같은 타입 또는 상위 타입의 객체들의 주소의 집합
        //      즉, 다수의 객체들의 주소를 배열로 관리
       
        // SimpleA 객체 5개를 다루기 위한 배열
        SimpleA[] simples = new SimpleA[5];
        // SimpleA 객체 5개를 참조할 저장 공간을
        // 동적 할당으로 생성
        //  = 참조 변수 5개를 생성
       
        // 빈 참조변수이기 때문에 아무런 객체가 없다.
        System.out.println(simples[0]);
        // 인덱스 0 번 참조변수에 객체를 생성 및 참조
        simples[0] = new SimpleA("Simple0", 100);
        System.out.println(simples[0]);
        simples[0].print();
       
        // 모든 원소에 SimpleA 객체를 생성 및 참조
        for(int i = 0; i < simples.length;i++) {
            simples[i] = new SimpleA("simple"+(i+1), 100*i);
        }
       
        // 모든 원소가 참조하는 객체에 접근
        for(int i = 0; i < simples.length;i++) {
            simples[i].print();
        }
       
    }
}

'java' 카테고리의 다른 글

Java : Static  (0) 2023.03.20
Java : Modifier(제어자)  (0) 2023.03.20
Java : This  (0) 2023.03.20
Java : Constructor(생성자) 1  (0) 2023.03.20
Java : Class(클래스) 1  (0) 2023.03.17