Java 에서의 this 는 생성자 this() 와 참조변수 this 두 가지가 존재합니다.
각각은 완전히 다른 this 이고 이에 대해 알아보도록 합니다.
1. 생성자 this()
Car 클래스를 정의하고 인스턴스 변수 초기화를 위해 생성자 두 개를 오버로딩 하였습니다.
class Car {
String color;
String gearType;
int door;
Car() {
color = "white";
gearType = "auto";
door = 4;
}
Car(String c, String g, int d) {
color = c;
gearType = g;
door = d;
}
}
첫 번째 생성자는 매개변수가 없을 때 기본값을 세팅해주고 두 번째 생성자는 매개변수로 인스턴스 변수 초기화를 합니다. 이때 두 번째 생성자를 이용하여 코드를 줄여보도록 합니다.
class Car {
String color;
String gearType;
int door;
Car() {
this("white", "auto", 4);
}
Car(String c, String g, int d) {
color = c;
gearType = g;
door = d;
}
}
생성자 안에서 다른 생성자를 호출할 때 this() 가 사용됩니다.
this() 를 쓰는 이유는 코드를 간결하게 만들기 위함인데 확실히 첫 번째 코드보다 두 번째에서 코드가 간결해진 것을 확인할 수 있었습니다.
2. 참조변수 this
인스턴스 자신을 가르키는 참조변수 this에 대해 예시를 통해 알아보도록 하겠습니다.
class Car {
String color;
String gearType;
int door;
Car(String c, String g, int d) {
color = c; // this.color
gearType = g; // this.gearType
door = d; // this.door
}
}
원래 인스턴스 변수를 정확히 쓰면 this.인스턴스변수 입니다. 예시에서는 this.color, this.gearType, this.door 이라고 써야하지만 this를 써야될 필요가 없어 생략되었습니다.
그렇다면 this를 써야하는 경우는 어떤 경우일까요? 다시 예시를 보도록 하겠습니다.
class Car {
String color;
String gearType;
int door;
// 1. 잘못된 코드
Car(String color, String gearType, int door) {
color = color;
gearType = gearType;
door = door;
}
// 2. 고친 코드
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
첫 번째 잘못된 코드 먼저 보겠습니다. color = color 라고 했는데 각각이 인스턴스 변수 color인지, 매개변수 color인지 구별이 안됩니다. 이전에는 인스턴스 변수와 매개변수가 이름이 달랐기 때문에 상관없지만 같으니 이제 구별을 못하여 에러가 납니다!
그래서 this 참조변수가 등장합니다. this.color은 인스턴스 변수 color를 특정하여 매개변수와 구별되게 해주는 역할을 합니다.
정리
생성자 this()
생성자 안에서 사용되며 다른 생성자를 호출할 때 사용합니다.
참조변수 this
매개 변수명과 인스턴스 변수명이 같아 구별이 안될 때 this를 사용하여 구별해줍니다.
'📗Java' 카테고리의 다른 글
[Java] 예시와 함께 알아보는 추상화 - 추상클래스와 인터페이스 (0) | 2023.07.20 |
---|---|
[Java] Chained Exception (0) | 2023.07.20 |
[Java] default 메소드는 왜 생겼는가? (0) | 2023.07.19 |
[Java] 생성자 super() 와 참조변수 super (0) | 2023.07.14 |
[Java] JVM 메모리 관리 (2) | 2023.07.13 |