본문 바로가기
Language/Java

[Java] this 키워드의 개념과 사용 방법 세 가지

by 드럼치는 코린이 2021. 9. 8.
728x90
반응형

this 키워드란?

  • 개념

- this는 인스턴스의 자기자신을 의미한다.
- 인스턴스화 되었을 때 자기자신의 메모리 주소를 담고있는 키워드이다.

  • this 키워드의 세 가지 역할

① 자기 자신의 메모리를 가르킨다.
② 생성자에서 다른 생성자를 호출할 경우 사용한다.
③ 인스턴스 자신의 주소를 반환할 때 사용한다.


this 키워드의 세 가지 역할

① 자기 자신의 메모리를 가르킨다.

main 함수에서 EX1_Fruit 객체를 하나 생성한 후 과일 고유번호, 과일 이름을 Setter를 통해 값을 입력했다고 가정한다.

public class FruitTest {
	public static void main(String[] args) {
		EX1_Fruit getFruit = new EX1_Fruit();
		
		getFruit.setFruitNo(1001);
		getFruit.setFruitName("사과");
		
		System.out.println(getFruit.fruitNo);
		System.out.println(getFruit.fruitName);
	}
}


과일의 정보를 저장하는 EX1_Fruit 클래스에서 멤버 변수를 선언한 이후 Setter를 설정할 때 this.변수명 = 매개 변수 명으로 지정한다. 이때 this 키워드는 자기 자신의 메모리를 가르키기 때문에 멤버변수의 fruitNo랑 동일한 의미가 된다.

class EX1_Fruit {
	public int fruitNo; // 과일 고유번호
	public String fruitName; // 과일 이름

	public void setFruitNo(int fruitNo) {
		this.fruitNo = fruitNo;
	}
	
	public void setFruitName(String fruitName) {
		this.fruitName = fruitName;
	}
}

 

출력 결과

 

💡 여기서 잠깐! this를 사용하지 않으면 어떻게 되나요?

매개변수 이름과 대입하는 이름이 똑같기 때문에 구분할 수 없어서 제대로 값이 입력되지 않는다.
매개변수의 이름을 멤버 변수와 다른 이름으로 설정한다면 this 키워드를 쓰지 않아도 된다.
하지만 가독성을 위해 매개 변수 명과 멤버 변수를 동일하게 쓰는것을 권장하고 있다.

 

class EX1_Fruit {
	public int fruitNo; // 과일 고유번호
	public String fruitName; // 과일 이름
	
	// this를 사용하지 않으면?
	public void setFruitNo(int fruitNo) {
		fruitNo = fruitNo;
	}
	
	public void setFruitName(String fruitName) {
		fruitName = fruitName;
	}
}

출력 결과


② 생성자에서 다른 생성자를 호출할 경우 사용한다.

과일의 정보를 저장하는 EX2_Fruit 클래스에서 매개 변수가 없는 생성자, 매개 변수가 있는 생성자 2개를 생성한 후 매개 변수가 없는 생성자에 this 키워드를 이용하여 값을 넣을 경우 매개 변수가 있는 생성자를 참조하여 메인 함수에서 생성자를 호출할 때 해당 값이 자동으로 대입된다.

class EX2_Fruit {
	public int fruitNo; // 과일 고유번호
	public String fruitName; // 과일 이름
	
	public EX2_Fruit() {
		this(1002, "오렌지");
	}

	public EX2_Fruit(int fruitNo, String fruitName) {
		this.fruitNo = fruitNo;
		this.fruitName = fruitName;
	}
	
	public void showInfo() {
		System.out.println("과일 고유번호 : " + fruitNo);
		System.out.println("과일 이름 : " + fruitName);
	}
}


1) 메인 함수에서 객체를 생성하고 값을 대입하지 않고 출력할 경우 자동으로 생성자에서 대입 된 값이 출력되는것을 확인할 수 있다.

public class FruitTest {
	public static void main(String[] args) {
		EX2_Fruit getFruit = new EX2_Fruit();
		getFruit.showInfo();
	}
}

출력 결과

2) 생성자를 호출할 때 값을 대입하면 대입된 값으로 출력된것을 확인할 수 있다.

public class FruitTest {
	public static void main(String[] args) {
		EX2_Fruit getFruit = new EX2_Fruit();
		getFruit.showInfo();
        
      	  	EX2_Fruit getFruit_2_1 = new EX2_Fruit(1003, "귤");
		getFruit_2_1.showInfo();
	}
}

출력 결과

3) 매개 변수가 없는 생성자에서 this를 사용하여 다른 생성자를 호출할 경우 해당 구문이 첫번째 구문이 되어야 한다.
this 키워드 위에 다른 구문을 작성할 경우 에러가 발생한다.

class EX2_Fruit {
	public int fruitNo; // 과일 고유번호
	public String fruitName; // 과일 이름
	
	public EX2_Fruit() {
		fruitNo = 1003;
		this(1004, "낑깡"); // 첫번째 구문이여야 함!
	}

	public EX2_Fruit(int fruitNo, String fruitName) {
		this.fruitNo = fruitNo;
		this.fruitName = fruitName;
	}
	
	public void showInfo() {
		System.out.println("과일 고유번호 : " + fruitNo);
		System.out.println("과일 이름 : " + fruitName);
	}
}

출력 결과 (에러)

③ 인스턴스 자신의 주소를 반환할 때 사용한다.

EX3_Fruit 클래스에서 반환 타입을 EX3_Fruit로 설정한 getSelf 메서드에서 반환 시 this를 반환한다.

class EX3_Fruit {
	public int fruitNo; // 과일 고유번호
	public String fruitName; // 과일 이름
	
	public EX3_Fruit(int fruitNo, String fruitName) {
		this.fruitNo = fruitNo;
		this.fruitName = fruitName;
	}
	
	public EX3_Fruit getSelf() {
		return this;
	}
}


메인 함수에서 EX3_Fruit 객체를 생성하고 해당 객체 정보 출력 및 test 객체를 하나 더 만들어서 해당 객체에 이전에 생성한 객체의 this 반환 값을 대입한다.

public class FruitTest {
	public static void main(String[] args) {
		
		EX3_Fruit getFruit_3 = new EX3_Fruit(1005, "수박");
		System.out.println(getFruit_3);
		
		EX3_Fruit test = getFruit_3.getSelf();
		System.out.println(test);
		
	}
}


출력할 경우 같은 값이 출력되는것을 확인할 수 있다.
this가 가르치는 위치와 생성된 객체가 가르치는 위치가 같은 것을 확인할 수 있다.

출력 결과


[ Reference ]

https://peemangit.tistory.com/395

728x90
반응형

댓글