English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 기사에서는 Java의 this 키워드를 예제를 통해 이해하고, 어떻게 그리고 어디서 사용하는지 알아보겠습니다.
Java에서 this 키워드는 메서드나 생성자에서 현재 객체를 참조하는 데 사용됩니다. 예를 들어,
class Main { int instVar; Main(int instVar){ this.instVar = instVar; System.out.println("this 참조= "); + this); } public static void main(String[] args) { Main obj = new Main(8); System.out.println("객체 참조= "); + obj); } }
출력:
this 참조 = com.ThisAndThat.MyClass@74a14482 객체 참조 = com.ThisAndThat.MyClass@74a14482
위의 예제에서, Main 클래스의 obj라는 이름의 객체를 생성했습니다. 그런 다음, 클래스의 객체 obj와 this 키워드의 참조를 출력했습니다.
여기서, obj와 this의 참조가 같다는 것을 볼 수 있습니다. 이는 이것이 단순히 현재 객체의 참조라는 의미입니다.
모든 경우에, 일반적으로 this 키워드를 사용합니다.
Java에서는, 범위(클래스 범위나 메서드 범위) 내에 두 개나 많은同名 변수를 선언할 수 없습니다. 그러나 인스턴스 변수와 매개변수는同名일 수 있습니다. 예를 들어,
class MyClass { // 인스턴스 변수 int age; // 매개변수 MyClass(int age){ age = age; } }
위의 프로그램에서, 인스턴스 변수와 매개변수는 같은 이름을 가집니다: age. 여기서 이름이 불명확하기 때문에 Java 컴파일러가 혼란스럽습니다.
이 경우, 우리는 this 키워드를 사용합니다. 예를 들어,
먼저, this 키워드를 사용하지 않는 예제를 보겠습니다:
class Main { int age; Main(int age){ age = age; } public static void main(String[] args) { Main obj = new Main(8); System.out.println("obj.age = ", + obj.age); } }
출력:
mc.age = 0
위의 예제에서, 우리는 값을8콘스트럭터에 전달되었습니다. 그러나, 우리가 얻은 0은 출력입니다. 이는 Java 컴파일러가 인스턴스 변수와 매개변수 간의 이름이 불명확하기 때문입니다.
现在,让我们使用this关键字重写上面的代码。
class Main { int age; Main(int age){ this.age = age; } public static void main(String[] args) { Main obj = new Main(8); System.out.println("obj.age = ", + obj.age); } }
출력:
obj.age = 8
现在,我们得到了预期的输出。这是因为当构造函数被调用时,构造函数内部的内容被调用构造函数的对象obj所替换。因此,age变量被赋值为8。
另外,如果参数和实例变量的名称不同,则编译器会自动附加this关键字。例如代码:
class Main { int age; Main(int i) { age = i; } }
等同于:
class Main { int age; Main(int i) { this.age = i; } }
this关键字的另一个常见用法是在类的setter和getter方法中。例如:
class Main { String name; // setter 方法 void setName( String name ) { this.name = name; } // getter 方法 String getName(){ return this.name; } public static void main(String[] args) { Main obj = new Main(); // 调用setter和getter方法 obj.setName("Seagull"); System.out.println("obj.name: ",+obj.getName()); } }
출력:
obj.name: Seagull
在这里,我们使用了this关键字:
在setter方法中分配值
在getter方法中访问值
在处理构造函数重载时,我们可能必须从另一个构造函数调用一个构造函数。在这种情况下,我们不能显式调用构造函数。相反,我们必须使用this关键字。
在这里,我们使用this关键字的另一种形式。也就是this()。让我们举个例子
class Complex { private int a, b; //带有两个参数的构造函数 private Complex( int i, int j ) { this.a = i; this.b = j; } //단일 매개변수를 가진 생성자 private Complex(int i){ //두 매개변수로 생성자 호출 this(i, i); } //매개변수 없는 생성자 private Complex(){ //단일 매개변수로 생성자 호출 this(0); } @Override public String toString(){ return this.a + " + " + this.b + "i"; } public static void main(String[] args) { //Complex 클래스의 객체 생성 //사용2매개변수로 생성자 호출 Complex c1 = new Complex(2, 3); //단일 매개변수로 생성자 호출 Complex c2 = new Complex(3); //매개변수 없이 생성자 호출 Complex c3 = new Complex(); //객체 출력 System.out.println(c1); System.out.println(c2); System.out.println(c3); } }
출력:
2 + 3i 3 + 3i 0 + 0i
위의 예제에서는 this 키워드를 사용했습니다.
Complex(int i) 생성자에서 Complex(int i, int j) 생성자 호출
Complex() 생성자에서 Complex(int i) 생성자 호출
이 줄을 주의하세요,
System.out.println(c1);
여기서, 우리가 객체 c를 출력할 때,1이 때, 객체가 문자열로 변환됩니다. 이 과정에서 toString()를 호출합니다. 우리가 클래스에서 toString() 메서드를 재정의했기 때문에 이 메서드를 통해 출력을 얻습니다.
this()의 가장 큰 장점 중 하나는 중복 코드의 수를 줄이는 것입니다. 하지만, this()를 사용할 때는 특별히 주의해야 합니다.
다른 생성자에서 생성자를 호출하면 비용이 증가하며, 이는 느리는 과정입니다. this()를 사용하는 또 다른 큰 장점은 중복 코드의 수를 줄이는 것입니다.
주의:다른 생성자에서 생성자를 호출하는 것을 명시적 생성자 호출이라고 합니다.
this 키워드를 사용하여 현재 객체를 메서드에 전달할 수 있습니다. 예를 들어,
class ThisExample { // 변수 선언 int x; int y; ThisExample(int x, int y) { //구조 함수 내의 변수에 값을 할당 this.x = x; this.y = y; //add() 호출 전 x와 y의 값 System.out.println("이를 addTwo() 메서드에 전달하기 전:"); System.out.println("x = ")} + this.x + ", y = ", + this.y); //add() 메서드 호출, 이를 매개변수로 전달 add(this); //add() 호출 후 x와 y의 값 System.out.println("이를 addTwo() 메서드에 전달한 후:"); System.out.println("x = ")} + this.x + ", y = ", + this.y); } void add(ThisExample o){ o.x += 2; o.y += 2; } } class Main { public static void main(String[] args) { ThisExample obj = new ThisExample(1, -2); } }
출력:
addTwo() 메서드에 this를 전달하기 전: x = 1, y = -2 addTwo() 메서드에 this를 전달한 후: x = 3, y = 0
위의 예제에서, ThisExample() 생성자에서 주의해야 할 다음 줄을 확인하세요:
add(this);
여기서 우리는 this를 매개 변수로 전달하여 add() 메서드를 호출합니다. this 키워드는 클래스의 객체 obj에 대한 참조를 포함하고 있으므로, add() 메서드에서 x와 y의 값을 변경할 수 있습니다.