본문 바로가기

언어 기초/JAVA

[자바의정석 | Chapter 06 객체지향 프로그래밍1] 인스턴스의 복사

1. 학습목표

인스턴스의 복사를 통해 생성자의 사용을 이해할 수 있다.

2.필요 개념 문장정리

  • 현재 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스를 하나 더 만들고자 할 때 생성자를 사용할 수 있다.
  • 두 인스턴스가 같은 상태를 갖는다는 것은 두 인스턴스의 모든 인스턴스 변수가 동일한 값을 갖고 있다는 것을 뜻한다.

  • Car클래스의 참조변수를 매개변수로 선언한 생성자이다. 매개변수로 넘겨진 참조변수가 가리키는 Car인스턴스의 인스턴스변수인 color, gearType, door의 값을 인스턴스 자신으로 복사하는 것이다.
  • 어떤 인스턴스의 상태를 전혀 알지 못해도 똑같은 상태의 인스턴스를 추가로 생성할 수 있다.

 3. 코드작성

class Car {
	String color;
	String gearType;
	int door;
	
    Car() {
     this("white", "auto", 4);
    }
    
    Car(Car c) {
   		color = c.color;
        gearType = c.gearType;
        door = c.door;
    }
    Car(String color, String gearType, int door) {
    	this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

class CarTest3 {
	public static void Main(String[] args) {
    	Car c1 = new Car();
        Car c2 = new Car(c1); // c1의 복사본 c2를 생성한다.
        System.out.println("c1의 color=" + c1.color + ", gearType=" + c1.gearType + ", door=" + c1.door);
        System.out.println("c1의 color=" + c2.color + ", gearType=" + c2.gearType + ", door=" + c2.door);
        
        c1.door = 100; // c1의 인스턴스변수 door의 값을 변경한다. 
 		System.out.println("c1.door=100; 수행 후 ")
        System.out.println("c1의 color=" + c1.color + ", gearType=" + c1.gearType + ", door=" + c1.door);
        System.out.println("c1의 color=" + c2.color + ", gearType=" + c2.gearType + ", door=" + c2.door);   
    }
}
    

실행결과
1의 color=white, gearType=auto, door=4
c2의 color=blue, gearType=auto, door=4
c1.door=100; 수행 후 
1의 color=white, gearType=auto, door=100
c2의 color=blue, gearType=auto, door=4

인스턴스 c2는 c1을 복사하여 생성된 것이므로 서로 같은 상태를 갖지만 서로 독립적으로 메모리공간에 존재하는 별고의 인스턴스이므로 c1의 값들이 변경되어도 c2는 영향을 받지 않는다

 

인스턴스를 생성할 때는 2가지 사항을 결정해야 한다.

  1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
  2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?

4. 마무리

개념적으로는 이해하지만 개발을 하면서 기능을 구현하는 과정에서 구체적으로 이해하고 있어야한다는 생각이 들었다. 프로젝트를 지속적으로 수행하면서 개념에 대해 확신을 가져야겠다.