English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 가이드

Java 흐름 제어

Java 배열

Java 상대 객체(I)

Java 상대 객체(II)

Java 상대 객체(III)

Java 예외 처리

Java 목록(List)

Java Queue(큐)

Java Map 집합

Java Set 집합

Java 입력 출력(I/O)

Java Reader/Writer

Java 다른 주제

Java this 키워드

이 기사에서는 Java의 this 키워드를 예제를 통해 이해하고, 어떻게 그리고 어디서 사용하는지 알아보겠습니다.

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 키워드 사용

모든 경우에, 일반적으로 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 与Getters和Setters

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关键字的另一种形式。也就是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를 매개변수로 전달

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의 값을 변경할 수 있습니다.