자바에서 'this'라는 키워드는 '객체 자기자신'을 의미한다. 주로 3가지 패턴으로 사용된다.
1. 생성자 혹은 메소드의 인자(parameter)와 객체의 속성이 같은 경우
다음 자바 코드를 보자.
public class Person {
private int age;
void setAge(int age) {
this.age = age;
}
}
Person 클래스에 setAge()라는 메소드를 정의하는 코드다. setAge() 메소드의 인자 이름이 'age'인데 이는 Person 클래스의 멤버 변수인 age와 동일하다. 이 경우 어떤 것이 멤버 변수이고 어떤것이 인자인지 구별하기 위해 this 키워드를 앞에 붙여준다.
this는 현재 객체를 의미하고, this.age는 현재 객체의 멤버 변수를 의미한다. 여기서 this는 멤버 변수와 메소드의 인자를 구별하기 위해 사용하는 예다.
2. 오버로딩 된 다른 생성자 호출
하나의 클래스에 여러개의 생성자가 정의되어 있을 수 있다.
public class Fruit {
private String name;
private String color;
int weight;
pubic Fruit(String name, String color) {
this(name, coloar, 0);
}
public Fruit(String name, String color, int weight) {
this.name = name;
this.color = color;
this.weight = weight;
}
}
name과 color 값만 인자로 받는 생성자와 weight 까지 인자로 받는 생성자 두개가 정의되어 있다. 이름과 색상만 인자로 받는 생성자는 'this()'를 이용해서 또 다른 생성자를 호출한다. weight 값을 입력하지 않은 생성자를 호출하면 기본값인 0이 설정되도록 만들어 둔 코드다.
3. 객체 자신의 참조값을 전달
객체를 생성할 때, 빌더 패턴을 사용하는 경우가 있다. 빌더 패턴의 대표적인 케이스로 StringBuilder가 있다.
StringBuilder builder = new StringBuilder();
builder.append("ABC").append("BCD").append("CCC");
System.out.println(builder.toString());
예제 코드를 보면 append() 메소드를 연이어서 사용하는 부분이 눈에 들어온다. StringBuilder 클래스의 append() 메소드는 다음과 같이 정의되어 있다.
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
상위 클래스의 append() 메소드를 호출하고 this 키워드로 StringBuilder 객체 자신을 리턴한다. 덕분에 append() 메소드를 호출하고 연이어서 append() 메소드를 붙여서 사용할 수 있다. 이렇게 붙여나가면 코드가 간결해져서 가독성이 좋아진다.
댓글