자바 this 키워드란?
자바(Java)로 코딩을 시작하면 메서드나 생성자 안에서 this 키워드가 사용되는 것을 자주 보게 됩니다. this는 메서드나 생성자 내부에서 현재 객체(current object)를 가리키는 참조 변수로, 자바에서 매우 폭넓게 활용됩니다.
이 글에서는 자바 this 키워드의 개념과 함께, 어떻게 그리고 왜 사용되는지 알아보겠습니다. 또한 여러 예제 코드를 통해 this 키워드가 실제로 어떻게 동작하는지 단계별로 살펴보겠습니다.
자바 메서드와 생성자의 기본
메서드와 생성자는 자바 프로그래밍의 두 가지 핵심 요소입니다.
객체 지향 프로그래밍에서 함수를 '메서드(method)'라고 부르며, 메서드는 특정 작업을 수행하는 코드 블록입니다. 예를 들어, 메서드가 실행되면 배열의 내용을 콘솔에 출력하거나, 프로그램에서 사용자 입력을 처리할 수 있습니다.
다음은 콘솔에 "It's Monday!"를 출력하는 자바 메서드 예제입니다:
public class PrintMessage {
public static void main(String[] args) {
System.out.println("It's Monday!");
}
}이 코드를 실행하면 콘솔에 다음과 같이 출력됩니다: It's Monday!
생성자(constructor)는 메서드와 비슷하지만, 프로그램에서 객체가 인스턴스화(생성)될 때 호출된다는 점이 다릅니다. 다음 예제는 Monday 클래스의 인스턴스가 생성될 때 인스턴스 변수 day의 값을 "Monday"로 설정하고, 콘솔에 "It's"와 요일을 출력하는 생성자입니다:
class Monday {
private String day;
private Monday() {
day = "Monday";
}
public static void main(String[] args) {
Monday day_of_the_week = new Monday();
System.out.println("It's " + day_of_the_week.day);
}
}이 코드의 실행 결과는 다음과 같습니다: It's Monday!
생성자에 대해 더 깊이 알고 싶다면 자바 생성자 관련 상세 가이드를 참고하는 것도 좋습니다. 이제 자바 메서드와 생성자의 기본을 살펴봤으니, 본격적으로 this 키워드의 개념과 활용 방법에 대해 알아보겠습니다.
자바 this 키워드의 의미
자바에서 this 키워드는 메서드나 생성자 내부에서 현재 객체를 가리킵니다.
이를 직접 확인하기 위해 앞서 살펴본 요일 출력 생성자 예제를 다시 사용해 보겠습니다. 아래 예제에서는 this의 값과 인스턴스화한 Monday() 객체의 값을 함께 출력합니다:
class Monday {
private String day;
private Monday() {
day = "Monday";
System.out.println(this);
}
public static void main(String[] args) {
Monday day_of_the_week = new Monday();
System.out.println("It's " + day_of_the_week.day);
System.out.println(day_of_the_week);
}
}실행 결과는 다음과 같습니다:
Main@d716361 It's Monday Main@d716361
출력의 첫 번째 줄은 this의 값으로, Monday() 객체가 인스턴스화될 때 콘솔에 출력됩니다. 두 번째 줄은 "It's"와 선언한 day_of_the_week 객체의 day 값을 출력한 결과입니다. 마지막 세 번째 줄은 day_of_the_week 객체 자체의 값입니다.
결과에서 볼 수 있듯이 this의 값과 day_of_the_week 객체의 값이 동일합니다. 즉, this 키워드는 메서드나 생성자 내부에서 현재 객체를 가리킨다는 것을 확인할 수 있습니다.
자바 this 키워드의 주요 활용 사례
this 키워드가 유용하게 사용되는 대표적인 상황은 크게 두 가지입니다.
- 변수 이름의 모호성 제거(disambiguation)
- this를 인자(argument)로 전달하기
또한 this 키워드의 변형인 this()는 생성자 오버로딩 시 사용되지만, 비교적 고급 기법에 해당하므로 이 글에서는 다루지 않겠습니다.
this로 변수 이름 모호성 제거하기
자바에서는 하나의 스코프(scope) 안에서 두 개 이상의 변수가 같은 이름을 가질 수 없습니다. 따라서 같은 이름의 변수를 선언하려고 하면 프로그램의 로직에 문제가 발생합니다.
하지만 this를 사용하면 이러한 제약을 우회할 수 있습니다. this를 활용하면 특정 변수를 객체의 필드에 할당할 수 있어, 객체의 필드 값과 매개변수 값을 구분하여 모두 다룰 수 있습니다.
예제를 통해 살펴보겠습니다. 5학년 반 명예의 전당(honor roll)에 추가되는 학생의 이름을 관리하는 프로그램을 만든다고 가정해 봅시다. 이 애플리케이션은 학생의 이름을 콘솔에 출력해야 합니다.
다음은 이 애플리케이션을 구현한 코드입니다:
class HonorRoll {
String studentName;
HonorRoll(String studentName) {
this.studentName = studentName;
}
public static void main(String[] args) {
HonorRoll alex = new HonorRoll("Alex");
System.out.println("New honor roll inductee: " + alex.studentName);
}
}프로그램을 실행하면 다음과 같은 결과가 출력됩니다:
New honor roll inductee: Alex
이 예제에서는 HonorRoll 생성자 안에서 학생의 이름을 저장하기 위해 this를 사용했습니다. this.studentName = studentName; 코드는 생성자 매개변수 studentName의 값(위 예제에서는 "Alex")을 인스턴스 변수 this.studentName에 할당합니다. 만약 this를 사용하지 않으면 다음과 같은 결과가 나옵니다:
New honor roll inductee: null
그 이유는 HonorRoll 생성자가 학생의 이름을 올바르게 저장하려면, this를 통해 자바 컴파일러에게 어느 것이 인스턴스 변수이고 어느 것이 매개변수인지 명확히 알려줘야 하기 때문입니다. 즉, 코드에서 this를 제거하면 매개변수가 자기 자신에게 할당되어 필드에는 null이 남게 됩니다.
this를 인자로 전달하기
this 키워드는 메서드나 생성자에서 현재 객체를 다른 메서드에 전달할 때도 자주 사용됩니다.
동네 커피숍의 커피 원두 재고 수량을 관리하는 애플리케이션을 만든다고 가정해 봅시다. 이 애플리케이션은 커피숍 사장님이 새 재고가 들어왔을 때 기존 재고 수량에 추가할 수 있어야 합니다. 다음은 이 애플리케이션을 구현한 코드입니다:
class AddStock {
int stockToAdd;
int stockTotal;
AddStock(int stockToAdd, int stockTotal) {
this.stockToAdd = stockToAdd;
this.stockTotal = stockTotal;
System.out.println("Current stock: " + this.stockTotal);
calculateNewStock(this);
System.out.println("New stock: " + this.stockTotal);
}
void calculateNewStock(AddStock s) {
s.stockTotal += s.stockToAdd;
}
}
class Main {
public static void main(String[] args) {
AddStock newStockValue = new AddStock(10, 9);
}
}실행 결과는 다음과 같습니다:
Current stock: 9 New stock: 19
코드를 하나씩 살펴보겠습니다. 먼저 AddStock이라는 클래스를 정의했습니다. 이 클래스의 생성자는 stockToAdd(추가할 재고)와 stockTotal(현재 총 재고)라는 두 값을 받아, calculateNewStock() 메서드를 호출해 커피숍의 최종 재고 수량을 계산합니다.
그런 다음 Main() 클래스에서 AddStock 클래스의 인스턴스를 생성하며 두 값인 10과 9를 전달합니다. 프로그램이 실행되면 지정한 두 값(추가할 재고와 현재 총 재고)을 더하고, 현재 재고와 갱신된 재고 수량을 모두 콘솔에 출력합니다.
여기서 핵심은 this 키워드가 calculateNewStock() 메서드를 호출할 때 인자로 사용되었다는 점입니다. 이를 통해 AddStock 클래스에서 다루고 있는 변수들을 담은 현재 객체 전체를, 갱신된 재고 수량 계산에 필요한 calculateNewStock() 메서드로 전달할 수 있습니다.
마무리
자바 this 키워드는 메서드나 생성자 내부에서 현재 객체를 가리키는 참조입니다. 자바에서 this 키워드의 주요 용도는 두 가지로 정리할 수 있습니다: 첫째, 변수 이름의 모호성을 제거하는 것, 둘째, this를 인자로 전달하는 것입니다.
이 글에서는 예제 코드와 함께 자바 this 키워드를 이러한 상황에서 어떻게 사용하는지 살펴봤습니다. 이제 여러분도 자신 있게 자바 this 키워드를 활용해 보세요.