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는 인스턴스를 가르켜야하기 때문에 인스턴스가 필요하기 때문이다.
'👩🏻💻 About 프로그래밍 > Java' 카테고리의 다른 글
Java 상속(Inheritance) (0) | 2023.11.29 |
---|---|
Java 변수의 초기화, 멤버변수의 초기화 (0) | 2023.11.29 |
Java 기본 생성자, 매개변수가 있는 생성자 (1) | 2023.11.29 |
Java 생성자(constructor) (0) | 2023.11.28 |
Java 오버로딩(overloading), 성립조건, 장점, 단점 (0) | 2023.11.28 |
블로그의 정보
Hello 춘기's world
볼빵빵오춘기