CodeGym에서 학생들은 첫 번째 수업에서 문자 그대로 Java this 키워드를 접하게 됩니다. 시간이 지남에 따라 그 의미가 명확해집니다. 그러나 돌이켜보면 많은 사람들이 오랫동안 이 키워드의 선을 이해할 수 없었다는 것을 스스로 인정했을 것입니다. 이 기사는 아직 그렇게 할 수 없는 사람을 위해 this 키워드 의 비밀을 다루는 장막을 뒤로 젖힐 것입니다 ... Schildt의 Java 참조를 얻었고 171페이지에서 this 키워드를 볼 수 있습니다. 메서드가 자신을 호출한 개체를 참조하는 데 필요합니다. 그것으로 수업을 끝낼 수 있습니다. 그러나 세부 사항이 필요합니다. 일반적으로 다음 두 가지 경우에 사용해야 합니다.
따라서 단순히 메소드의 이름 변수를 자신에게 할당하는 것입니다. 물론 말이되지 않습니다. 따라서 언어는 Human 클래스의 이름 변수를 setName 메서드 의 이름 변수 와 구별할 방법이 필요했습니다 . 이 문제 는 this 키워드 를 도입하여 해결되었습니다 . 이 경우 메서드의 변수가 아니라 Human 클래스 의 instancen과 연결된 변수를 참조하려고 함을 나타냅니다 .
이 문서의 시작 부분에서 언급한 것처럼 호출 개체를 참조합니다. 결과적으로 setName 메소드는 생성된 객체에 사람의 이름을 설정합니다. 아래는 this 키워드를 사용하지 않은 프로그램의 코드입니다 . 이 코드는 Human 개체를 만들고 여기에 이름을 할당합니다. 다음은 this
키워드가 있는 코드입니다 .
- 인스턴스 변수와 메소드/생성자 변수의 이름이 같은 경우;
- 다른 유형의 생성자에서 특정 유형의 생성자(예: 기본 생성자 또는 매개 변수가 있는 생성자)를 호출해야 하는 경우. 이를 명시적 생성자 호출이라고도 합니다.
예 1: 인스턴스 변수와 메서드 변수의 이름이 동일합니다.
이름 필드를 정의하는 Human 클래스 가 있다고 가정합니다 . 이름 변수 에 대한 setter를 생성해 보겠습니다 (setter는 완전히 작동합니다. 여기에 catch가 없습니다).
class Human {
String name;
public void setName(String newName) {
name = newName;
}
}
String newName을 setName setter 메서드 에 전달합니다. 새 변수를 선언했고 setName 메서드를 묶는 중괄호({}) 내에서만 볼 수 있기 때문에 원하는 대로 이름을 지정할 수 있었습니다. setter에는 한 줄이 있습니다.
name = newName;
여기에서는 newName 이라는 새 변수를 도입 하고 개체의 기존 이름 변수에 할당했습니다. 많은 프로그래머는 궁극적으로 같은 것에 대해 이야기할 때 새 이름으로 변수를 도입하는 것을 이상하게 여길 수 있습니다. 즉, Human 클래스의 이름 필드에 대해 이야기하고 있습니다. 그렇기 때문에 Java 제작자는 동일한 변수 이름을 편리하게 사용할 수 있는 방법을 고안했습니다. 즉, 동일한 것을 나타내는 변수에 대해 두 개의 이름이 있는 이유는 무엇입니까? 즉, 다음과 같은 작업을 수행하려고 합니다.
class Human {
String name;
public void setName(String name) {
name = name;
}
}
그러나 여기서 우리는 문제에 봉착합니다 . 이제 이름이 같은 두 개의 변수가 있습니다. 한 문자열 이름은 Human 클래스 에 속 하고 다른 문자열 이름은 setName 메서드 에 속합니다 . 결과적으로 JVM은 setter에 다음 줄을 작성할 때 참조하는 변수를 알 수 없습니다.
name = name;
Java는 가장 가까운 이름 변수, 즉 setName 메소드의 변수를 의미한다고 가정합니다 . 


public class Solution {
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Vinny");
human1.print();
}
}
class Human {
String name;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
void print() {
System.out.println(name);
}
}
따라서 동일한 것을 나타내기 위해 새 변수를 도입하지 않아도 되므로 코드가 더 깔끔해지고 추가 변수로 덜 어수선해집니다 .
예제 2: 명시적 생성자 호출에 사용
다른 생성자에서 하나의 생성자를 호출하는 것은 (이상하게도 충분히) 여러 생성자가 있고 새 생성자가 이전에 다른 생성자에서 작성된 초기화 코드를 복제하지 않으려는 경우에 유용할 수 있습니다. 혼란스러운? 그것은 보이는 것처럼 그렇게 무섭지 않습니다. 아래 코드를 보세요. 여기에는 Human 클래스 에 대한 두 개의 생성자가 있습니다 .
class Human {
int age;
int weight;
int height;
Human(int age, int weight) {
this.age = age;
this.weight = weight;
}
Human(int age, int weight, int height) {
// Call the constructor with two parameters
this(age, weight);
// and then initialize the missing variable
this.height = height;
}
}
여기서 우리는 먼저 int age 와 int weight 라는 두 개의 매개변수를 가진 생성자를 제공했습니다 . 두 줄의 코드가 있다고 가정합니다.
this.age = age;
this.weight = weight;
나중에 세 개의 매개변수가 있는 다른 생성자를 추가하기로 결정하고 기존 연령 및 체중 매개변수에 키를 추가합니다. 다음과 같이 새 생성자를 작성할 수 있습니다.
this.age = age;
this.weight = weight;
this.height = height;
그러나 이 생성자에서 기존 코드를 반복하는 대신 this 키워드를 사용하여 두 개의 매개 변수로 생성자를 명시적으로 호출할 수 있습니다.
this(age, weight);
// and then initialize the missing variable:
this.height = height;
마치 매개변수가 3개인 생성자에게 다음과 같이 말하는 것과 같습니다.
- 두 개의 매개변수가 있는 다른 생성자를 호출합니다.
- 그런 다음 다른 변수를 추가합니다.
GO TO FULL VERSION