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 키워드를 사용한다.
- 다른 생성자를 호출할 때에는 생성자 첫 줄에 넣어서 사용해야 한다.


예제 코드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)를 구별할 때 사용
(다른 때 도 많이 사용하지만 일단 이렇게 알고있자. 제일 많이 쓰이는 것중에 하나이기때문에)

⇒ 왼쪽 코드에서는 매개변수와 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
볼빵빵오춘기