용어 정리
- iv(instance variable): 인스턴스 변수
- lv(local variable): 로컬 변수
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;
}
}
위와 같이 Car 클래스가 있을 때, 기본 생성자 Car()과 Car(String c, String g, int d) 메소드는 중복되는 부분이 있다.
이런 경우 나쁜 코드라고 볼 수 있다.
이 때 this()
메소드를 사용해서 생성자에서 다른 생성자를 호출하여 코드 중복을 제거하고 좋은 코드로 만들 수 있다.
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() 와는 연관이 없으니 헷갈리면 안된다.
class MyMath2 {
long a, b //this.a this.b
//변수명이 같으니 this 키워드로 구분
MyMath2(int a, int b) {
this.a = a;
this.b = b;
}
//구분하지 않아도 될 때에는 this 생략 가능
long add() {
return a + b; //return this.a + this.b;
}
static long add(long a, long b) {
return a + b;
}
}
iv인 a와 b의 진짜 이름은 this.a 와 this.b이다.
굳이 붙이지 않아도 iv와 lv를 구분할 수 있을 때에는 생략이 가능하여 생략하지만
변수명이 동일하여 iv와 lv를 구분할 수 없을 때에는 this 키워드를 사용하여 구분한다.
Car(String c, String g, int d){
//color는 iv, c는 lv
color = c;
gearType = g;
door = d;
}
위와 같은 생성자가 있을 때, 변수명이 다르므로 구분이 된다.
이 경우 같은 클래스 안에서 this는 생략될 수 있다.
Car(String color, String gearType, int door){
//this.color는 iv, color는 lv
this.color = color;
this.gearType = gearType;
this.door = door;
}
하지만 위와 같이 iv와 lv와 동일한 변수명을 가지는 경우 모든 변수가 lv처럼 취급되므로
iv와 lv를 구분하기 위해서 this 키워드를 붙여준다.
이렇게 인스턴스 변수와 지역 변수를 구분하기 위해 this 키워드를 붙여준다.