본문 바로가기
프로그래밍 언어/JAVA

[Java] 객체 자신을 가리키는 this 키워드

by 티옌.liy 2022. 11. 13.

일상 생활에서 자신과 관련된 말이나 행동을 할 때

'나' 라는 단어를 말하는 것처럼

 

객체지향 언어에서 객체와 관련된 작업을 할때는

 this 키워드를 정말 자주 쓰게 되는데

 

특히, 객체를 생성할 때 초기 값 설정에 많이 사용하며

this 키워드를 사용 시, 고민하고 사용하는게 좋다.

 

현실에서 '나' 가 했다고 발언하면

그에대한 책임을 내가 담당하는 되는것처럼

 

this 키워드를 사용하면

값과 기능에 대한 책임은 해당 객체가 지게된다.


1. This 키워드

사전적 정의로는 객체, 자기 자신을 가리키는 키워드이다.
이를 정보통신기술 용어로 말하면, 함수가 호출되는 그 순간, 그 함수가 속해 있던 객체의 참조를 나타낸다.


this 키워드는 호출하는 장소나 호출하는 방법(문맥)에 따라 동작 내용이 바뀌는 변수인데, 크게 3가지 경우에 사용한다.

1. 클래스의 맴버 변수가 메서드, 생성자의 지역변수 이름과 동일한경우
2. 객체 자신의 주소 값을 전달하는 경우
3. 오버로딩한 생성자를 호출하는 경우

 

 

2. 클래스의 맴버 변수가 메서드, 생성자의 지역변수 이름과 같은 상황

가장 많은 빈도로 사용되는 경우인데 클래스의 맴버 변수를 사용할 때, this 키워드를 사용한다.

이 경우의 this 키워드는 객체 자신의 맴버 변수를 가리키는 것이다.

 

일반적으로, 생성자 또는 get,set 메서드의 매개 변수는 객체의 맴버 변수와 동일한 이름으로 정의하는데

객체 생성 시, this 키워드 없이 맴버 변수 값을 대입하면 아래와 같은 일이 벌어진다.

 

예시코드 - this 키워드 사용 전 객체 생성 결과
public class GameUser {
	private String userNickname;
	private int userLevel;
	private int userExp;
	
	public GameUser(String userNickname, int userLevel) {
		userNickname = userNickname;
		userLevel = userLevel;
		userExp = 0;
	}
	
	public void showUserInfo() {
		System.out.printf("%s, %d, %d", userNickname, userLevel, userExp);
	}
	
	public static void main(String[] args) {
		GameUser user1 = new GameUser("유저1", 1);
		user1.showUserInfo();
	}
}
실행 결과
null, 0, 0

 

객체 생성 시, 초기 값을 입력했으나, 객체의 속성 값을 확인하면 정상적으로 저장되지 않은 모습이다.

왜냐하면, 위 코드의 생성자는 지역 변수에 값을 할당한 형태이므로 생성자가 끝나면서 지역 변수 값도 소실되는 것이다.


즉, java가 GameUser의 맴버 변수임을 인지하지 못하고, 메서드의 지역변수로 인식하는 것이다.
때문에, GameUser 객체에 속성 값을 저장하고 싶다면 아래 코드처럼 this 키워드를 붙여주면 된다.

 

예시코드 - this 키워드 사용 후 객체 생성 결과
public class GameUser {
	private String userNickname;
	private int userLevel;
	private int userExp;
	
	public GameUser(String userNickname, int userLevel) {
		this.userNickname = userNickname;
		this.userLevel = userLevel;
		this.userExp = 0;
	}
	
	public void showUserInfo() {
		System.out.printf("%s, %d, %d", userNickname, userLevel, userExp);
	}
	
	public static void main(String[] args) {
		GameUser user1 = new GameUser("유저1", 1);
		user1.showUserInfo();
	}
}
실행 결과
유저1, 1, 0

위 실행 결과처럼 this 키워드를 사용한 경우, 객체 생성 시 입력한 값이 잘 적용된 모습을 확인할 수 있다.


3. 객체 자신의 주소 값을 전달하는 경우

객체 자체를 반환 값으로 전달하고 싶을 때, this 키워드를 return하면 된다.

 

예시코드 - this 키워드로 객체 주소값을 반환 및 출력
public class GameUser {
	private String userNickname;
	private int userLevel;
	private int userExp;
	

	public GameUser getGameUserObject() {
		return this;
	}
	
	public static void main(String[] args) {
		GameUser user1 = new GameUser();
		System.out.println(user1.getGameUserObject());
	}
}
실행 결과
testpackage@32d2fa64
[패키지 이름]@[Heap메모리 참조 값]

 

메서드의 반환 타입을 객체로 설정하고, return 값을 this로 설정하면 객체 참조 주소값을 반환한다.


4. 오버로딩한 생성자를 호출하는 경우

이 경우에는 주의사항이 있는데 생성자의 구현부에서 첫 번째로 사용되어야 한다.

왜냐하면, 생성자가 끝나기 전까지는 객체 생성이 완료되지 않은 것이다.

객체는 여러개의 생성자를 보유할 수 있는데, 중복 코드 방지와 가독성이 이점을 얻을 수 있다.

클래스 내에서 다른 생성자를 호출할 때는 this키워드를 맴버 변수처럼 사용하여 호출할 수 있다.

 

예제 코드 - this 키워드로 오버로딩된 생성자를 호출
public class GameUser {
	private String userNickname;
	private int userLevel;
	private int userExp;
	
	public GameUser() {
		this("GeustUser", 1);
	}
	
	public GameUser(String userNickname, int userLevel) {
		this.userNickname = userNickname;
		this.userLevel = userLevel;
		this.userExp = 0;
	}
	
	public void showUserInfo() {
		System.out.printf("%s, %d, %d", userNickname, userLevel, userExp);
	}
	
	public static void main(String[] args) {
		GameUser user1 = new GameUser();
		user1.showUserInfo();
	}
}
실행 결과
GeustUser, 1, 0

 

객체 생성 시, 아무런 값을 넣지 않았음에도, 기본 생성자에서 다른 생성자를 호출했다.

때문에, 객체에 설정 값이 적용된 모습을 확인할 수 있다.

댓글