this
키워드자바에서 this
키워드는 인스턴스의 자기자신을 의미한다. 인스턴스화 되었을 때 자기자신의 메모리 주소를 담고있는 키워드이다.
this
키워드의 주요 용도객체 자신을 가리키는 참조
this
는 현재 객체를 가리키는 참조 변수이다. 클래스 내부에서 자신이 속한 객체를 참조할 수 있다. 실행 클래스에서 사용하는 것이 아니라 데이터 클래스 내부에서 사용된다.멤버 변수와 매개변수 구분
메서드나 생성자의 매개변수와 멤버 변수의 이름이 동일할 때 이를 구분하기 위해 사용한다. 이때, this
를 통해 객체의 멤버 변수임을 명확히 할 수 있다. 이를 통해 변수명 혼동을 방지하고, 코드 가독성을 높일 수 있다.
class Variable {
// 인스턴스 멤버 필드
String instanceVariable;
void doFunc() {
// 지역 변수
String instanceVariable = "20";
System.out.println("doFunc() 호출 : " + instanceVariable); // 20
System.out.println("doFunc() 호출 : " + this.instanceVariable); // 10
}
// 메서드의 아규먼트도 지역변수임
void doFunc2(String instanceVariable) {
System.out.println("doFunc2() 호출 : " + instanceVariable); // 20
System.out.println("doFunc2() 호출 : " + this.instanceVariable); // 10 }
}
public class VariableMainEx02 {
public static void main(String[] args) {
Variable v = new Variable();
v.instanceVariable = "10";
v.doFunc();
v.doFunc2("20");
}
}
내부 생성자 호출
생성자 내에서 다른 생성자를 호출할 때 this(매개변수)
형식으로 사용된다. 이를 통해 중복되는 코드를 줄이고, 코드 재사용성을 높일 수 있다.
class This {
This() {
System.out.println("생성자 호출");
}
This(String name) {
//This(); // 에러 발생
this();
System.out.println("생성자 오버로딩 호출");
//this(); //errer - this must be first statement in constructor
}
}
public class ThisMainEx01 {
public static void main(String[] args) {
This t = new This("홍길동");
}
}
class Constructor {
String hakbun;
String name;
// 기본 생성자
Constructor() {
this("0000", "아무개");
}
Constructor(String name) {
this("0000",name);
}
// 매개변수가 있는 생성자
Constructor (String hakbun, String naem) {
this.hakbun = hakbun;
this.name = naem;
}
}
public class ThisMainEx02 {
public static void main(String[] args) {
Constructor c1 = new Constructor(); // 전체
System.out.println(c1.hakbun);
System.out.println(c1.name);
Constructor c2 = new Constructor("홍길동"); // 학번
System.out.println(c2.hakbun);
System.out.println(c2.name);
Constructor c3 = new Constructor("1111", "박문수");
System.out.println(c3.hakbun);
System.out.println(c3.name);
}
}
static
메서드에서는 사용 불가this
는 인스턴스 자신을 가리키는 참조 변수이므로, 인스턴스가 아닌 클래스 레벨에서 동작하는 static
메서드에서는 사용할 수 없다. static
메서드는 특정 인스턴스와 무관하게 호출되기 때문이다.this()
를 사용하여 자기 자신을 호출하거나, 순환 참조를 만들 수 없다. 이는 무한 루프를 방지하기 위한 규칙이다.📌 객체의 독립성
같은 클래스의 여러 객체가 생성되더라도, 각각의 객체는 자신만의 this
를 가진다. 따라서 this
는 각 객체가 자신의 멤버에 접근하는 방법을 제공한다.
this
는 객체 자신을 가리키는 참조 변수로, 클래스 내부에서 자신의 멤버 변수나 메서드에 접근할 때 사용한다.- 주로 멤버 변수와 매개변수가 동일할 때 이를 구분하기 위해 사용되며, 다른 생성자를 호출하는 데도 사용한다.
static
메서드에서는 인스턴스와 관계없기 때문에this
를 사용할 수 없다.