this
this는 자바의 중요한 키워드로서 단어가 의미하는 데로 객체 자신을 가리킨다. (this는 객체 자신을 참조하는 키워드)
1. this의 기초 개념
자바에서 this는 현재 실행되는 메소드가 속한 객체에 대한 레퍼런스이다. this는 컴파일러에 의해 자동으로 생성되며 개발자는 별도로 this를 선언할 필요 없이 사용하기만 하면 된다. 다음 소스는 this를 사용하는 전형적인 예이다.
i.e.
class Samp {
int id;
public Samp(int x) {
this.id = x;
}
public void set (int id) {
this.id = id;
}
public int get() {
return id;
}
}
이 소스에서 this는 현재 객체에 대한 레퍼런스이므로, this로 Samp 클래스의 멤버를 접근할 수 있다. this.id는 Samp 타입의 객체의 멤버 id를 의미한다.
또한, this로 해당 객체가 가지고 있는 메소드를 this.메소드명() 과 같은 형태의 구문을 이용해서 실행 시킬 수도 있다.
참고로, static 메소드 내에서는 this의 사용이 불가능하다. 그 이유는 this가 객체를 나타내는 키워드인데에 반해서, static 멤버는 단일 객체가 아닌 클래스 자체에 종속 되기 때문이다.
2. this의 필요성
앞의 Samp 클래스의 예에서 메소드 get()내에서 멤버 변수에 접근할 때에는 this 키워드를 사용하지 않았다. 클래스 내에서 멤버 변수에 접근할 때 굳이 this 키워드를 사용할 필요가 없기 때문이다. 왜냐하면, 컴파일러가 이를 알아서 해석해 주기 때문이다. 그렇다면 this가 꼭 필요한가?
this 키워드를 사용하는 가장 큰 이유는 다음 예시에서 찾을 수 있다.
public void set(int id) {
id = id;
}
만일 위의 예제에서 set 메소드를 위의 형태처럼 this를 사용하지 않는다면 어떻게 될까? 많은 초보 개발자들이 이에 대해서 틀린 답을 내 놓는다. 정답은, "위의 새로 쓴 set 메소드의 경우 "id=id;"라는 문장의 두 id 모두 매개 변수 id로 인식이 되어서 자기 자신에게 자기 자신의 값을 주는 쓸데 없는 짓을 한다" 이다.
이렇게, 매개 변수의 이름과 멤버 변수의 이름이 같을 경우에, 멤버 변수를 나타내기 위해서 this 키워드를 사용한다.
그렇다면, 매개 변수의 이름을 다르게 만들면 될 텐데, 왜 굳이 이런 번잡스러운 일을 만드는 걸까?
그 이유는, 그 이름을 사용하고 싶기 때문이다. 프로그래밍을 하다보면 오랜 기간에 걸쳐서 개발을 하면서 본인이 썼던 코드가 어떤 형태였는지 온전히 기억을 못하는 사람도 있고, 팀을 이루어서 코딩을 하다보면 다른 사람의 코드를 읽고 잘 이해해야 더 나은 결과물을 만들 수 있다. 그렇기에, 가독성을 높이기 위해서 변수의 이름이나 메소드의 이름, 그리고 클래스의 이름을 매우 신중하게 정해야만 한다. 아무 의미 없이 이름을 정하다 보면 가독성이 떨어져서 나중에 다른 사람이 읽을 때에 코드를 이해하는데에 더 많은 시간과 노력을 들여야 하는 문제가 발생하기 때문이다. 그렇게 이름을 신중하게 정하고 보니, 똑같은 이름을 두번 쓰는 경우가 발생하게 되었다. 그래서 그 문제를 해결하기 위해서 this 키워드를 사용하게 된 것이다.
또, 메소드가 객체 자신의 레퍼런스를 리턴해야 하는 경우가 있다. 이 경우에 this를 리턴한다.
i.e. return this;