Java에서 this는 현재 실행되는 메소드가 속한 객체에 대한 레퍼런스
this는 컴파일러에 의해 자동으로 생성되며 개발자는 별도로 this를 선언할 필요 없이 사용하기만 하면됩니다.
public class Person {
public int age;
public Person(int age) {
this.age = age;
}
}
현재 위에는 인자의 변수와 멤버 변수의 이름이 동일합니다.
이는 인자의 목적을 그대로 표현하기 위해 이름을 동일하게 사용한 경우입니다.
하지만 이런 경우에는 어느 소속의 age 변수인지 확인할 수 있어야 하기 때문에 this 키워드를 사용.
실제 실무에서는 생성자를 작성할 때 다음과 같이 만들어 주는 것이 관례입니다.
public class Shape {
private char type;
private int width;
private int height;
public Shape(char type, int width, int height) {
this.type = type;
this.width = width;
this.height = height;
}
}
굳이 이렇게 번잡한 작업을 하는 이유는 사실 가독성 때문입니다.
parameter와 인스턴스 변수명을 다르게 사용한다면 this 키워드를 사용할 필요가 없겠지만
파라미터가 많아지다보면 객체 안에서 어떻게 사용되지 알 수 없는 일이 발생하기 때문에
파라미터를 아예 데이터의 이름과 통일 시켜 버리는 겁니다.
(성능관점에서는 위의 방식이 성능에 저해되는 요소가 될 수 있지만 성능보다는 가독성 선택한 경우)
this vs this()
this와 비슷한 형태로 this()를 사용하기도 합니다.
this()는 한 클래스 내에서 한 생성자에서 다른 생성자를 호출할 때 사용합니다.
매개변수가 존재하는 생성자가 기본 생성자를 호출하는 case
public class Person {
public int age;
public Person() {
System.out.println("기본 생성자...");
};
public Person(int age) {
this();
}
public static void main(String[] args) {
Person p = new Person();
}
}
예제
public class Person {
public int age;
public Person() {
this(20);
System.out.println("기본 생성자...");
};
public Person(int age) {
System.out.println("매개변수 생성자...");
this.age = age;
}
public static void main(String[] args) {
Person p1 = new Person();
System.out.println("===");
Person p2 = new Person(10);
}
}
이를 통해 기본생성자든 매개변수 생성자로 호출하든 age라는 멤버변수를 강제할 수 있게 되었다.
여기서 한가지 주의할점은 this()는 해당 메소드의 body 영역에서 첫부분에 위치해야 된다는 것이다.
[예제]
public class FoodPrice {
private int menuPrice;
private int quantity;
public FoodPrice(int menuPrice) {
this(menuPrice, 1);
// 아래 두 줄이 필요없다!
// this.menuPrice = menuPrice;
// this.quantity = 1;
}
public FoodPrice(int menuPrice, int quantity) {
this.menuPrice = menuPrice;
this.quantity = quantity;
}
public static void main(String[] args) {
FoodPrice food1 = new FoodPrice(1000);
FoodPrice food2 = new FoodPrice(1000, 3);
}
}
중복적인 코드를 최소화할 수 있습니다.
위의 코드는 객체를 생성하는 옵션이 두 가지라는 것을 의미합니다.
- 하나는 그냥 메뉴의 가격만을 넣는 것.
- 또 하나는 메뉴의 가격과 수량을 같이 지정하는 것.
다만, 메뉴의 가격만을 넣으면 자동으로 메뉴의 수량은 1이 되도록 작성됨
요약
- this()는 생성자 코드에서만 사용
생성자가 아닌 일반 메소드에서 this()를 사용할 수 없다.
(왜냐하면 생성자 자체는 처음 객체를 생성할 때만 사용된다.)
- this()는 동일한 클래스내의 다른 생성자를 호출할 때 사용
- this()는 반드시 생성자의 첫 번째 위치에서 사용되어야 한다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 형 변환 (0) | 2021.03.07 |
---|---|
[Java] Class와 Instance (객체 형태) (0) | 2021.03.07 |
[Java] Java 언어 특징 및 실행과정 (0) | 2021.03.04 |
[Java] Setter vs 생성자 (0) | 2021.03.04 |
[Java] 유효범위 (0) | 2021.03.04 |
댓글