Hello

Java 생성자 this(), 참조변수 this

by 볼빵빵오춘기

생성자 this()

  • 생성자에서 다른 생성자 호출할 때 사용
  • 다른 생성자 호출시 첫 줄에서만 사용가능하다.
class Car2{
	String color;
	String gearType;
	int door;
	
	Car2(){ 
		this("white","auto",4); // 코드1
	}
	
	Car2(String color){
		this(color,"auto",4); // 코드2
	}
	
	Car2(String color, String gearType, int door){
		this.color = color; // 코드3-1
		this.gearType = gearType; // 코드3-2
		this.door = door; // 코드3-3
	}
}

※ 코드1 생성자와 코드2 생성자는 코드 3 생성자를 호출하고 있다.

하지만 Car2 라고 표현하지않고 this를 이용해 생성자를 호출하고 있는데

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

 

더보기

why? 왜 이렇게 사용하나?

위에 코드에서 보면 iv 초기화로 같은 기능이다.

오버로딩할때 이름이 같은 메서드일때는 같은 기능으로 정의가 되어있다.

그래서 서로 호출하는 경우가 많다.

따라서 코드의 중복을 제거할려고 호출하는것이다.

 

생성자 사용규칙

  • 생성자에서 다른 생성자 호출할 때 this 키워드를 사용한다.
  • 다른 생성자를 호출할 때에는 생성자 첫 줄에 넣어서 사용해야 한다.

 

생성자 this 사용규칙1
생성자 this 사용규칙2

 

예제 코드1

예1 - 잘못된 예

Car2(String color){
	door = 5;
	Car2(color, "auto",4);
}

 

예2 - 잘못된 예

Car2(String color){
	Car2(color, "auto",4);
	door = 5;
}

 

예3 - 올바른 예

Car2(String color){
	this(color, "auto",4);
	door = 5;
}

 

예제 코드2

class Car2{
	String color;
	String gearType;
	int door;

	// 코드의 중복을 제거한 코드 start
	Car2(){ 
	//	Card2("white","auto",4);
		this("white","auto",4);
	}
	// 코드의 중복을 제거한 코드 end

/*	
	Car2(){
		color = "white";
		gearType = "auto";
		door = 4;
	}
*/
	// 코드3
	Car2(String color, String gearType, int door){
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}
}

 

⇒ this를 쓰지 않았다면 주석처리 해놓은 곳과 같이 기본값을 지정할 것이다.

하지만 this를 씀으로써 ‘코드의 중복을 제거한 코드’ 처럼 작성할 수 있다.

 

⇒ 즉 ‘코드3’과 주석처리코드는 같은 코드로 보인다.

이런 중복된 코드를 줄이기 위해 ‘중복을 제거한 코드’를 작성하였는데 이런 식으로 코드의 중복을 줄이려면 어느 한쪽에서 호출해서 사용하면 된다.


참조변수 this

  • 인스턴스 자신을 가리키는 참조변수
    (참조변수 this 와 생성자this()는 비슷하지만 연관이 없다!! 주의하자!)
  • 인스턴스 메서드(생성자 포함)에서 사용가능
  • 지역변수(lv)와 인스턴스변수(iv)를 구별할 때 사용
    (다른 때 도 많이 사용하지만 일단 이렇게 알고있자. 제일 많이 쓰이는 것중에 하나이기때문에)

참조변수 this

 

⇒ 왼쪽 코드에서는 매개변수와 iv의 변수 이름을 다르게 해놨기때문에 구분이 되지만 오른쪽 코드와 같은 경우 구분이 잘안간다.

(사실 왼쪽 코드에서도 color, gearType, door에서도 this를 붙여야하지만 같은 클래스 내에서 생략이 가능하다.)

 this를 붙여 구별한다.

 

참조변수 this와 생성자 this()

this

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

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

 

this(), this(매개변수)

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

 

※ this와 this()는 비슷하게 생겼을 뿐 완전히 다른 것이다.

 this는 ‘참조변수’이고, this()는 ‘생성자’이다.

 

예제코드3 

class MyMath2{
	long a, b; // this.a , this.b => 진짜 이
	
	MyMath2(int a, int b){ // 생성
		this.a = a; // this.a => iv, a => lv 
		this.b = b; // this.b => iv, b => lv
	}
	
	long add() { // 인스턴스 메서
		return a+b; // => return this.a+this.b; 여기서 this는 생략이 가
	}
	
	static long add(long a, long b) { // 클래스 메서드(static 메서드)
		return a+b;
	}
	
}

⇒ ‘클래스 메서드(static 메서드)’ 에서는 static이 붙었으므로 iv사용불가이다.

그러므로 this도 사용불가이다.

this는 인스턴스를 가르켜야하기 때문에 인스턴스가 필요하기 때문이다.

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기