JAVA/객체지향프로그래밍1

[JAVA] 생성자 this() / 참조변수 this

prize1209 2021. 6. 21. 17:46

생성자 this()

생성자, 같은 클래스의 다른 생성자를 호출할 때 사용

(같은 클래스 안에 있는 생성자를 호출할 때는 클래스 이름 대신 this 사용)

 

-다른 생성자 호출 시 첫 줄에서만 가능 

 

 

생성자에서 다른 생성자를 첫 줄에서만 호출 가능하도록 한 이유는 생성자 내에서 초기화 작업 도중에 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화할 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문이다.  

 

 

 

예25)

class Car1 {
	String color;
	String geartype;
	int door;

	Car1() {
		this("white", "auto", 4);
	}

	Car1(String color) {
		this(color, "auto", 4);
	}

	Car1(String color, String geartype, int door) {
		this.color = color;
		this.geartype = geartype;
		this.door = door;
	}
}

public class CarTest2 {
	public static void main(String[] args) {
		Car1 c1 = new Car1();
		Car1 c2 = new Car1("blue");
		System.out.println("c1의 color=" + c1.color + ", geartype=" + c1.geartype + ",door=" + c1.door);
		System.out.println();
	}
}

 

 

 

참조변수 this

-인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어있음

-인스턴스 메서드(생성자 포함)에서 사용 가능

-지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용

-모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재

 

 

 

 

 

 

 

 

정리

this 

인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어 있다. 

모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.

 

this( ), this(매개변수)

생성자. 같은 클래스의 다른 생성자를 호출할 때 사용한다. 

 

 

 

 

생성자를 이용한 인스턴스의 복사 

현재 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스를 하나 더 만들고자 할 때 생성자를 이용할 수 있다. 

두 인스턴스가 같은 상태라는 것은 두 인스턴스의 모든 인스턴스 변수(상태)가 동일한 값을 가진다는 것이다. 

 

하나의 클래스로부터 생성된 모든 인스턴스의 메서드와 클래스변수는 동일하기 때문에 인스턴스 간의 차이는

인스턴스마다 각기 다른 값을 가질 수 있는 인스턴스 변수 뿐이다. 

 

Car(Car c){

     color = c.color;

     geartype = c.geartype;

     door = c.door;

}

 

Car클래스의 참조변수를 매개변수로 선언한 생성자이다. 

매개변수로 넘겨진 참조변수가 가리키는 Car인스턴스의 인스턴스 변수인 color, geartype, door의 값을 인스턴스 자신으로 복사하는 것이다. 

 

어떤 인스턴스의 상태를 전혀 알지 못해도 똑같은 상태의 인스턴스를 추가로 생성할 수 있다. 

많은 JAVA API 의 클래스들이 인스턴스의 복사를 위한 생성자를 정의하고 있으니 참고하면 된다. 

 

 

 

예26)

//클래스 생성
class Car3{
	String color;
	String geartype;
	int door;

//생성자 생성
Car3(){
	this("white", "auto",4);
}
Car3(Car3 c){ //인스턴스의 복사를 위한 생성자
	color = c.color;
	geartype = c.geartype; 
	door = c.door;
}
Car3(String color, String geartype, int door){
	this.color=color;
	this.geartype=geartype;
	this.door=door;
}
}

public class CarTest3 {
	public static void main(String[] args) {
		//객체 생성
		Car3 c1 = new Car3();
		Car3 c2 = new Car3();
		
		
	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=100;
	System.out.println("c1.door=100 수행 후");
	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);
	
	}
}

 

인스턴스 c2는 c1을 복사하여 생성된 것이므로 서로 같은 상태를 갖지만,

서로 독립적으로 메모리 공간에 존재하는 별도의 인스턴스이므로 c1의 값들이 변경되어도 c2는 영향을 받지 않는다.

 

생성자 Car3(Car3 c)는 아래와 같이 다른 생성자인 'Car3(String color, String geartype, int door)를 호출하는 것이 바람직하다. 

 

 

 

 

인스턴스를 생성할 때 2가지 사항 결정

1. 클래스- 어떤 클래스의 인스턴스를 생성할 것인가?

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