Java의 this

zihooy·2023년 5월 4일
0

Java Programming

목록 보기
9/21
post-thumbnail

Java에서 사용되는 this의 여러가지 사용법에 대해 알아보자

🏹 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();
	}
}

🏹 this의 두번째 사용법: chaining

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(); 와 같은 연쇄적인 코드를 사용할 수 있다.

이러한 연쇄적인 코드의 특징은, 중간에 코드를 삽입할 수 없다는 것이다.

🏹 this의 세번째 사용법: 자신의 정보를 전달

사람이 결혼을 할 때는, 서로의 정보를 알아야 한다.
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의 네번째 사용법: 생성자에서 다른 생성자를 호출하고 싶을 때

생성자에서도 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 이 순서대로 나오게 된다.

profile
thisIsZihooLog

0개의 댓글