Java에서 사용되는 this의 여러가지 사용법에 대해 알아보자
class의 생성자는, 내부의 멤버 변수를 초기화 하기 위해 쓰여진다.
이 과정에서 class의 멤버 변수와 전달된 인수의 이름이 같다면 이를 구분하기 위해 this를 활용한다. 다음의 에시를 살펴보자.
class Tiger {
int num;
Tiger(int num) {
this.num = num;
//this.num: 멤버 변수, num: 전달된 인수
//구분하기 위해 this 사용
}
void showMember() {
this.f1();
System.out.println(num);
}
void f1() {}
}
public class hello {
public static void main(String[] args) {
Tiger t = new Tiger(600);
t.showMember();
}
}
chaining이란, 말 그대로 체인처럼 연쇄적으로 이어진 것을 뜻한다.
this는 자기 자신을 가리키므로, 계속해서 자신 내부의 메소드를 호출하며 체인처럼 만들 수 있다.
class는 객체 자신을 return할 수 있는데, 이는 모든 class가 스스로 객체를 생성할 수 있기 때문이다.
다음의 예시를 살펴보자.
class Tiger {
//Tiger this = t; //생략된 코드
Tiger f1() {
System.out.println(1);
return this; //생략된 코드 때문에 가능
}
Tiger f2() {
System.out.println(2);
return this;
}
void f3() {
System.out.println(3);
}
}
public class hello {
public static void main(String[] args) {
Tiger t = new Tiger();
System.out.println(t.hashCode());
Tiger t2 = t.f1();
System.out.println(t2.hashCode());
//다른 이름으로 동일한 메모리를 사용하고 있는 것을 알 수 있음
t.f1().f1(); // chaining: 연쇄적 호출 가능
System.out.println("--------------");
t.f1().
f2().
f1().
f1().
f3();
t.f1();
t.f2();
t.f1();
t.f1();
t.f3();
//차이점: 연쇄적인 코드는 중간에 코드를 삽입할 수 없음
}
}
위의 예시에서, 각 method에서 return this를 활용하면 t.f1().f2().f1().f1().f3();
와 같은 연쇄적인 코드를 사용할 수 있다.
이러한 연쇄적인 코드의 특징은, 중간에 코드를 삽입할 수 없다는 것이다.
사람이 결혼을 할 때는, 서로의 정보를 알아야 한다.
class A와 B가 있을 때 각각 남자, 여자라고 가정하고 다음의 예시를 살펴보자.
class A { //남자
int money = 100;
void ready() {
B b = new B();
b.marry(this); //B에게 A를 보내는
}
}
class B { //여자
void marry(A a) {
if(a.money<200) {
System.out.println("no");
} else {
System.out.println("yes");
}
}
}
public class hello {
public static void main(String[] args) {
A t = new A();
t.ready();
}
}
class B에서 A의 객체를 인수로 받을 수 있다면, A는 B에게 this를 활용하여 본인의 정보를 전달할 수 있다.
따라서 A의 정보를 가지고 B에서 판단하여 코드를 작성하는 것이 가능하다.
생성자에서도 this()를 활용하면 다른 생성자를 호출할 수 있다.
다음의 예시를 살펴보자.
main 함수에서 객체를 생성하고 인수가 2개인 생성자를 호출했으니,
Tiger(int num, String str) {
this(200);
System.out.println(1);
}
위 부분으로 가게 되며, 생성자에서 this(200);
을 호출했으므로,
Tiger(int num) {
this();
System.out.println(2);
}
위 부분으로 가게 된다. 그런데 여기서 또 this();
을 호출했으므로,
Tiger() {
System.out.println(3);
}
위 생성자가 실행된다.
class Tiger {
Tiger() {
System.out.println(3);
}
Tiger(int num) {
this();
System.out.println(2);
}
Tiger(int num, String str) {
this(200);
System.out.println(1);
}
}
public class hello {
public static void main(String[] args) {
Tiger t = new Tiger(100, "호랑이"); //결과 3 2 1
}
}
따라서 출력 값으로는 3 2 1 이 순서대로 나오게 된다.