Java에서 프로그래밍을 하다 보면 빠질 수 없는 키워드가 this입니다. this는 자바의 중요한 키워드로서 단어 뜻 그대로 객체 즉, 인스턴스 자신을 표현하는(가리키는) 레퍼런스 키워드입니다.
this 란
this는 현재 실행되고 있는 메서드가 속한 객체 자신에 대한 레퍼런스입니다. this는 컴파일러에 의해서 자동으로 관리가 되기 때문에 개발자는 this 키워드를 사용하기만 하면 됩니다.
this는 객체 내부 생성자 및 메서드에서 객체 내부 멤버(필드 + 메서드)에 접근하기 위해 사용됩니다. 객체 내부 멤버에 접근할 때 this 키워드가 필수는 아니지만 상황에 따라서 필수가 될 수 있습니다.
this의 필요성
예를 들어 원의 반지름을 입력받으면 원을 생성해 주는 클래스가 있을 때 그 클래스 코드는 다음과 같이 구성할 수 있을 것입니다.
public class Circle {
//반지름 멤버 필드
int radius;
//생성자
public Circle(int radius) {
radius = radius;
}
//반지름 값을 리턴하는 멤버 메서드
public int getRadius() {
return radius;
}
}
하지만 이 코드는 올바르지 못한 코드입니다.
생성자인 `Circle`메서드의 매개변수 이름은 그 자체로 코드를 읽는 사람에게 그 용도를 나타내기 때문에 주로 `r`, `a` 등과 같이 가독성과 코드 이해성을 저해하는 변수명이 아닌 용도에 맞는 변수명으로 지어주기 때문에 주로 멤버 필드와 동일한 변수명으로 지정하게 됩니다.
매개변수로 받는 변수명과 해당 클래스의 멤버 필드의 변수명이 같으면 코드 이해성에 용이하긴 하지만 두 변수의 구분이 없어지기 때문에 위와 같이 받아온 매개변수 `radius`를 멤버필드인 `radius`에 넣어 초기화시켜주고자 작성한 `Circle` 생성자 메서드에서는 `radius` 가 모두 매개변수 `radius`에 접근하면서 멤버필드의 `radius`가 초기화되지 않는 상황이 발생합니다.
radius = radius; //여기 있는 2개 모두 매개변수 radius에 접근함
그렇기 때문에 this 키워드를 사용하여 해당 변수가 어떤 radius를 의미하는지를 지정해 주는 방식을 사용하는 것입니다.
public Circle(int radius){
//멤버 radius = 매개변수 radius
this.radius = radius;
}
그리고 this는 인스턴스 자신을 뜻하기 때문에 클래스 멤버 메서드에서 리턴 타입이 인스턴스 자신의 클래스 타입이라면 this를 사용하여 인스턴스 자신의 주소를 반환할 수도 있다.
public Circle returnInstance(){
return this; //객체 자신의 레퍼런스 리턴
}
this 키워드는 객체 자신에 대한 레퍼런스 키워드이기 때문에 객체가 생성되어야 사용가능한 키워드이다.
this 키워드 사용 코드 시각화
public class Circle {
//반지름 멤버 필드
int radius;
//생성자
public Circle(int radius) {
this.radius = radius;
}
//객체 자신 리턴
public Circle returnInstance(){
return this;
}
//반지름 값을 리턴하는 멤버 메서드
public int getRadius() {
return radius;
}
public static void main(String[] args) {
Circle circle1 = new Circle(3);
Circle circle2 = new Circle(6);
Circle circle3 = new Circle(9);
}
}


this() 란
this()는 클래스 내에서 생성자가 다른 생성자를 호출할 때 사용하는 코드입니다. 즉, 인스턴스 자신의 생성자를 호출하는 키워드입니다.
생성자는 매개변수의 개수와 타입에 따라서 여러 개 존재할 수 있기 때문에 중복되는 코드를 줄여주기 위해 this() 키워드를 사용합니다.
this()의 필요성
- 객체 내부 생성자 및 메서드에서 해당 객체의 생성자를 호출하기 위해 사용
- 생성자를 통해 객체의 필드를 초기화할 때 중복되는 코드를 줄여주기 위해 사용
▶ this()를 사용하지 않은 코드
public class Car {
String model;
String color;
double price;
public Car(String model) {
this.model = model;
this.color = "Blue";
this.price = 50000000;
}
public Car(String model, String color) {
this.model = model;
this.color = color;
this.price = 50000000;
}
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
}
▶ this()를 사용한 코드
public class Car {
String model;
String color;
double price;
public Car(String model) {
this(model,"Blue",50000000);
}
public Car(String model, String color) {
this(model, color, 50000000);
}
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
}
this() 사용 시 주의할 점
- this()는 생성자 코드에서만 호출해야 한다.
- this()는 같은 클래스 안에서 다른 생성자를 호출할 때 사용해야 한다.
- this()는 반드시 생성자의 첫 번째 줄에 작성되어야 한다.
public Car(String model) {
System.out.println("model = " + model);
this(model, "Blue", 50000000);
}
위 코드와 같이 this() 키워드로 다른 생성자를 호출하기 이전에 다른 코드가 존재하면 컴파일 오류가 발생합니다. 그렇기 때문에 this()는 생성자의 첫 번째 줄에 작성해 주어야 합니다.
Reference
- 황기태, 김효수, 명품 Java Programming. 생능출판, 2019
- Github, "JAVA this와 this()의 차이점", https://lowelllll.github.io/java/2018/12/09/java-this-%EC%B0%A8%EC%9D%B4%EC%A0%90/
JAVA this와 this()의 차이점
자바 코드를 보면서 헷갈리기 쉬운 this와 this()의 차이점을 알아봅니다
lowelllll.github.io
- TCPschool, "this와 this()", https://www.tcpschool.com/java/java_methodConstructor_this
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'수수한 코딩세상 > Java' 카테고리의 다른 글
| [Java][Error] java.lang.ClassNotFoundException 문제해결 (2) | 2024.08.07 |
|---|---|
| [Java][Error] Prohibited package name 문제해결 (1) | 2024.08.05 |
| [Java] Project, Package, Class, Method, Variable, Constant 이름 짓는 규칙 (명명 규칙) (1) | 2024.08.02 |
| [Java] 호출 방식으로 알아보는 인스턴스 멤버 & 클래스 멤버 차이 (1) | 2024.07.31 |
| [Java] 문자열(String)로 알아보는 == 연산자와 equals() 메서드 차이 (0) | 2024.07.29 |