본문 바로가기

개발일지/Java + Spring

211027 Java - 생성자를 통한 인스턴스 복사 (1)

생성자를 통한 인스턴스 복사

 

class Car2
{
	String color;
	String gearType;
	int door;
	
	Car2()
	{
		this("white", "auto", 4);
	}
	
	Car2(Car2 c) //인스턴스 복사 
	{
		color = c.color;
		gearType = c.gearType;
		door = c.door;
		//c를 갖고와서 내거에다가 대입
	}
	//나를 호출할 때 
	
	Car2(String color, String gearType, int door)
	{
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}
}

 

일단 클래스 부분만 본다.

패키지 안에 이미 Car 클래스가 있어서 Car2로 클래스를 만들었다.

 

생성자를 생성할 때는 클래스 이름과 동일하게 만들어야한다. 

인스턴스 변수를 선언하고, 메인에서 객체생성을 하면서 인자 값을 던져주면 생성자에서 받아 초기화 해주는 부분을 마지막에 만들었다. 그리고 매개변수가 들어있는 생성자가 있으니 빈공간이 있는 생성자도 만들어 주었다. 빈공간인 생성자 안에는 값이 세팅 돼 있는데 아무런 인자 값이 없을 때 이쪽으로 들어와서 세팅된 값으로 초기화가 된다는 뜻이다. 

 

Car2(Car2 c) 생성자의 인스턴스 복사

c를 갖고와서 내 거(생성자)에 대입을 했다.

 

 

	public static void main(String[] args) {
		//생성자를 통한 인스턴스 복사
		Car2 c1 = new Car2();
		//별도의 객체생성 됨 
		Car2 c2 = new Car2(c1);
		//인스턴스인 c1을 넘김
		//객체생성이 되면서 매개변수로 주소값을 넘김
		//집주소는 복사가 됐지만 각각 다른 방이다.
		
		System.out.println("c1 color : " + c1.color + ", gearType : " + c1.gearType +
				", door : " + c1.door);
		System.out.println("c2 color : " + c2.color + ", gearType : " + c2.gearType +
				", door : " + c2.door);
		//인스턴스명만 넘겼을 때 어떻게 되는지 
		//값은 같다 왜? 인스턴스를 복사했으니까
		
		c1.door = 2;
		System.out.println("\nc1.door 변경후");
		
		System.out.println("c1 color : " + c1.color + ", gearType : " + c1.gearType +
				", door : " + c1.door);
		System.out.println("c2 color : " + c2.color + ", gearType : " + c2.gearType +
				", door : " + c2.door);
		//생성자를 통한 복사는 내용을 복사한 것이다.
		//c1과 c2는 다른 집이다.
		//
	}

 

생성자를 통한 인스턴스 복사

 

c1 객체생성을 했다.

c2 객체생성을 했다.

c2의 객체생성이 되면서 매개변수로 c1의 주소값을 넘겼다. 

집 주소가 복사 되면서 같은 값을 바라보게 됐지만 각 다른 방에 있다.

 

클래스 부분에서 보면 생성자를 통해서 인스턴스 복사를 하고 이미 내 값으로 등록을 했기 때문임 이 이후로는 c1의 주소는 필요 없어진다. 그래서 처음 값은 같지만 c1.door 변경 후에는 서로 다른 값이 되는 것임

 

c1 color : white, gearType : auto, door : 4
c2 color : white, gearType : auto, door : 4

c1.door 변경후
c1 color : white, gearType : auto, door : 2
c2 color : white, gearType : auto, door : 4

 

전체 코드

public class Sample1027 {

	public static void main(String[] args) {
		//생성자를 통한 인스턴스 복사
		Car2 c1 = new Car2();
		//별도의 객체생성 됨 
		Car2 c2 = new Car2(c1);
		//인스턴스인 c1을 넘김
		//객체생성이 되면서 매개변수로 주소값을 넘김
		//집주소는 복사가 됐지만 각각 다른 방이다.
		
		System.out.println("c1 color : " + c1.color + ", gearType : " + c1.gearType +
				", door : " + c1.door);
		System.out.println("c2 color : " + c2.color + ", gearType : " + c2.gearType +
				", door : " + c2.door);
		//인스턴스명만 넘겼을 때 어떻게 되는지 
		//값은 같다 왜? 인스턴스를 복사했으니까
		
		c1.door = 2;
		System.out.println("\nc1.door 변경후");
		
		System.out.println("c1 color : " + c1.color + ", gearType : " + c1.gearType +
				", door : " + c1.door);
		System.out.println("c2 color : " + c2.color + ", gearType : " + c2.gearType +
				", door : " + c2.door);
		//생성자를 통한 복사는 내용을 복사한 것이다.
		//c1과 c2는 다른 집이다.
		//
	}
  }

class Car2
{
	String color;
	String gearType;
	int door;
	
	Car2()
	{
		this("white", "auto", 4);
	}
	
	Car2(Car2 c) //인스턴스 복사 
	{
		color = c.color;
		gearType = c.gearType;
		door = c.door;
		//c를 갖고와서 내거에다가 대입
	}
	//나를 호출할 때 
	
	Car2(String color, String gearType, int door)
	{
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}
}