자바에서 this 는 무엇인가...?
this is a pen (이것은 펜입니다) 할 때의 this 하고 관련이 있는 것인가?
this 는 사물을 가리킬 때 쓰는 지시대명사이다. 이것이 무엇을 가리키고 있는 것은 분명하다.
<예제 클래스: 알바 클래스>
this 에 대한 알바 클래스 이다.
this 키워드는 자기 클래스의 인스턴스를 가리키는 키워드이다.
인스턴스는 new 생성자 ( ) 를 사용해야 비로서 메모리에 생성된다.
. 점 연산자로 멤버 변수에 접근하는데 사용할 수 있다.
위의 예제 코드에서 멤버 변수 세개가 있다. (name, wage, type) 그리고 매개변수가 세개인 생성자를 보면 this.name, this.wage, this.type 세개의 this를 볼 수 있다. this. 를 사용한 변수가 바로 이 클래스의 인스턴스를 만들었을 때 존재하는 멤버 변수들인 것이다. 그런데 매개변수 세개와 이름이 같다. 상관없다. 매개변수 name 과 this.name 은 전혀 다르다. 매개변수는 main 함수에서 생성자 PartTimer 호출시 전달받는 값이고, this.name은 메모리에 생성된 인스턴스의 독립된 저장 공간이다.
main 메서드에서 10번 줄을 보면 , PartTimer 생성자에 매개변수를 3개 전달하고 있다. 그리고 PartTimer 클래스 변수 pt3에 참조를 넘겨준다. 생성자를 호출 할 때 아래처럼 할당된다.
this.name = "Mr.Kim";
this.wage = 9500;
this.type = "day shift";
이는 다음과 같은 말이다
pt3.name = "Mr.Kim";
pt3.wage = 9500;
pt3.type = "day shift";
인스턴스 pt3를 손가락으로 가리키듯이 this 라고 부르는 것이다.
this 키워드는 좀 특별하다. this.멤버변수로 사용가능하고 this ( ) 라는 형식으로도 사용가능하다.
바로 생성자 안에서 this( )를 사용한 오버로딩을 할 수 있다.
생성자 오버로딩에 대해서는 이전 포스트의 참고를 추천한다.
맨 아래처럼 가장 완전한 생성자를 만들고, 나머지는 this ( ) 키워드로 원하는 형태의 오버로딩을 만들 수 있다. 매개변수에 따라 나머지 초기값을 관리할 수 있게 해준다. 길었던 코드도 한눈에 들어오니 간결해진다. 주의할 점은 this 생성자를 호출하기 이전에 다른 코드를 넣으면 컴파일시 에러가 난다. this ( ) 가 바로 생성자이기 때문에 그 다음 줄에 넣어야 한다.
PartTimer (String name){
// 여기에 코드를 넣으면 에러가 난다. 아직 메모리에 생성이 안되었음.
this(name,0,null);
// 여기는 괜찮다. 메모리에 생성되었으므로 값을 조작할 수 있다.
this.wage = 9000;
}
main 메서드에서 3개의 생성자를 차례로 생성한다. 매개변수의 수가 1,2,3 으로 바뀐다. pt1과 pt2가 this ( ) 생성자를 거쳐서 메모리에 인스턴스를 생성시킨다. showInfo에서 내용을 보여준다.
매개변수가 없던 나머지 멤버변수들도 초기화가 되었다. null 은 객체의 초기화 값이다. (참조 할당이 아직 없음)
세번째 this는 자기 스스로의 참조를 리턴할 수 있다. 새로운 인스턴스를 만드는게 아니라 클래스의 주소를 반환하는 것이다. 클래스 메서드를 다음처럼 추가한다.
public PartTimer getInstance() {
return this;
}
다음처럼 사용한다.
PartTimer pt1 = new PartTimer("Ms.Sue");
PartTimer pt4 = pt1.getInstance();
pt4.showInfo();
this 의 반환은 자주 쓰는 것은 아니지만 this를 사용해서 자신의 주소를 알아낼 수 있다.
*PS - 자바 OOP를 이해하기 위해서는 잘 작성된 예제를 따라해보는 것이 중요하다.