programing

수업에서 언제 "이거"를 사용해야 하나요?

newsource 2022. 7. 17. 00:22

수업에서 언제 "이거"를 사용해야 하나요?

는 그것을 있다.this는 현재 객체를 나타냅니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★를 들어, '아까', '아까보다', '아까보다'를 요?xthis.x떤방 ??아마도요.x고려된 방법에 대해 로컬 변수를 참조할 수 있습니까?이 방법에서만 볼 수 있는 변수입니다.

★★는?this.method()용할할 수???★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.method()디폴트로는 현재 오브젝트에 적용되지 않습니까?

this키워드는 주로 3가지 상황에서 사용됩니다.첫 번째이자 가장 일반적인 방법은 변수 참조를 모호하게 하기 위한 세터 방식입니다.두 번째는 현재 클래스 인스턴스를 인수로 다른 객체의 메서드에 전달해야 하는 경우입니다.세 번째는 컨스트럭터 내에서 대체 컨스트럭터를 호출하는 방법입니다.

케이스 1: 사용방법this변수 참조를 모호하게 하지 않습니다.Java setter 메서드에서는 일반적으로 설정하려는 개인 멤버 변수와 이름이 같은 인수를 전달합니다.해 보겠습니다.x로로 합니다.this.x이를 통해 파라미터 "name"의 값을 인스턴스 변수 "name"에 할당하고 있음을 알 수 있습니다.

public class Foo
{
    private String name;

    public void setName(String name) {
        this.name = name;
    }
}

케이스 2: 사용방법this인수가 다른 객체에 전달되었습니다.

public class Foo
{
    public String useBarMethod() {
        Bar theBar = new Bar();
        return theBar.barMethod(this);
    }

    public String getName() {
        return "Foo";
    }
}

public class Bar
{
    public void barMethod(Foo obj) {
        obj.getName();
    }
}

케이스 3: 사용방법this대체 컨스트럭터를 호출합니다.코멘트에서 trinithis는 다른 일반적인 용도를 정확하게 지적했다.this 의 클래스에 의 컨스트럭터가 . 1 을 사용할 수 .this(arg0, arg1, ...)원하는 다른 생성자를 호출하려면 생성자의 첫 번째 줄에서 호출해야 합니다.

class Foo
{
    public Foo() {
        this("Some default value for bar");

        //optional other lines
    }

    public Foo(String bar) {
        // Do something with bar
    }
}

도 본 적 요.this인스턴스 변수가 참조되고 있다는 사실을 강조하기 위해 사용되지만(모호한 해명의 필요성 포함), 내 의견으로는 드문 경우이다.

this가 이미 있듯이 로컬 은 하는

public class Outer {
  protected int a;

  public class Inner {
    protected int a;

    public int foo(){
      return Outer.this.a;
    }

    public Outer getOuter(){
      return Outer.this;
    }
  }
}

사용하시면 .this 가 겹칠 만 사용합니다 - 이름의 지역 변수가 겹칠 때 ('나름', '나름', '나 '나름'이나 '나름'이나 '나름'이나)

물론, 또 다른 좋은 이유는thisIDE 서 ide ide ide : )

사용할 필요가 있는 것은this.한정자는 현재 스코프 내의 다른 변수가 동일한 이름을 공유하고 인스턴스 멤버를 참조하는 경우입니다(William이 설명한 것처럼).x ★★★★★★★★★★★★★★★★★」this.x.

또한 "this"는 한 컨스트럭터를 다른 컨스트럭터에서 호출할 때도 유용합니다.

public class MyClass {
    public MyClass(String foo) {
        this(foo, null);
    }
    public MyClass(String foo, String bar) {
        ...
    }
}

, 더 .this메모장에서 적이 , 사용하여 소스 코드를 엽니다.this훨훨 、 기기기쉽쉽줄 。

상상해 보세요.

public class Hello {
    private String foo;

    // Some 10k lines of codes

    private String getStringFromSomewhere() {
        // ....
    }

    // More codes

    public class World {
        private String bar;

        // Another 10k lines of codes

        public void doSomething() {
            // More codes
            foo = "FOO";
            // More codes
            String s = getStringFromSomewhere();
            // More codes
            bar = s;
        }
    }
}

이것은 현대의 IDE에서는 읽기 쉽지만, 일반 텍스트 에디터에서는 읽기가 매우 어렵습니다.

에 있는지 될 예요.foo는 에디터의 "검색" 기능을 사용할 때까지 상주합니다.그럼 넌 소리칠거야getStringFromSomewhere()으로, 무엇, 을 잊었는가 하면, 무엇을 잊었는가 하는 입니다.s 즉입니다.bar = s지막막일 일가가가가

이것과 비교해 보세요.

public void doSomething() {
    // More codes
    Hello.this.foo = "FOO";
    // More codes
    String s = Hello.this.getStringFromSomewhere();
    // More codes
    this.bar = s;
}
  1. ?foo는 외부 에서 선언된 입니다.Hello.
  2. ?getStringFromSomewhere()외부 클래스에서도 선언된 메서드입니다.
  3. 요.barWorld및 「」를 참조해당됩니다.s는 이 메서드로 선언된 로컬 변수입니다.

물론, 당신이 무언가를 디자인할 때마다, 당신은 규칙을 만듭니다.따라서 API나 프로젝트를 설계할 때 규칙에 "누군가가 메모장으로 모든 소스 코드를 열면 그 사람은 그 사람의 머리를 쏴야 한다"는 내용이 포함되어 있다면 당신은 이것을 하지 않아도 된다.

this는 빌더 패턴에 도움이 됩니다.

public class User {

    private String firstName;
    private String surname;

    public User(Builder builder){
        firstName = builder.firstName;
        surname = builder.surname;
    }

    public String getFirstName(){
        return firstName;
    }

    public String getSurname(){
        return surname;
    }

    public static class Builder {
        private String firstName;
        private String surname;

        public Builder setFirstName(String firstName) {
            this.firstName = firstName;
            return this;
        }

        public Builder setSurname(String surname) {
            this.surname = surname;
            return this;
        }

        public User build(){
            return new User(this);
        }

    }

    public static void main(String[] args) {
        User.Builder builder = new User.Builder();
        User user = builder.setFirstName("John").setSurname("Doe").build();
    }

}

변수 이름이 겹치지 않는 한 코드를 읽을 때 알기 위해 사용합니다.

@William Brendel의 답변은 세 가지 다른 사용 사례를 좋은 방법으로 제시했습니다.

사용 예 1:

문서의 공식 Java 문서 페이지에서도 동일한 사용 사례가 제공됩니다.

인스턴스 메서드 또는 생성자 내에서 현재 개체(메서드 또는 생성자가 호출되는 개체)에 대한 참조입니다.이를 사용하여 인스턴스 메서드 또는 생성자 내에서 현재 개체의 모든 멤버를 참조할 수 있습니다.

여기서는 다음 두 가지 예를 설명하겠습니다.

필드에서 사용생성자에서 사용

사용 예 2:

투고에서 되지 않은 :this는 멀티태스킹애플리케이션의 현재 오브젝트를 동기화하여 데이터와 메서드의 중요한 섹션을 보호할 수 있습니다.

synchronized(this){
    // Do some thing. 
}

사용 예 3:

Builder 패턴의 구현은 다음 사용 방법에 따라 달라집니다.this변경된 개체를 반환합니다.

이 투고를 참조해 주세요.

빌더를 다른 클래스로 유지(유동 인터페이스)

구글은 이에 대해 조금 논의한 페이지를 썬 사이트에 올렸다.

요.this는 메서드 변수를 클래스 필드와 구별하기 위해 실제로 사용할 수 있습니다.


    private int x;
    public void setX(int x) {
        this.x=x;
    }

하지만 저는 그 컨벤션이 정말 싫어요.말 그대로 두 개의 다른 변수에 동일한 이름을 붙이는 것은 버그에 대한 레시피입니다.저는 다음과 같은 것을 훨씬 더 선호합니다.


    private int x;
    public void setX(int newX) {
        x=newX;
    }

만, 로 ''를 참조하는 경우는 .x이 때x★★★★★★ 。

사용 방법에 대해서는, 그 효과에 대해서는, 당신이 옳습니다.그것이 있든 없든, 얻을 수 있습니다.쓸 수 있어요?물론이죠. 사용하시겠습니까?당신에게 달렸습니다만, (코드에 정적인 Import 스테이트먼트가 가득 차 있지 않는 한) 명료함을 더하지 않는 것은, 개인적으로 무의미하다고 생각하기 때문에, 저는 그것을 사용하고 싶지 않습니다.

Java에서 'this' 키워드를 사용하는 방법은 다음과 같습니다.

  1. 「」를 사용합니다.this instance 하는
  2. 「」를 사용합니다.this()의 컨스트럭터를
  3. 「」를 사용합니다.this
  4. 「」를 사용합니다.this method parameter(메서드 )

https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

인스턴스 변수와 같은 이름의 다른 로컬 변수가 두 개 있는 경우 이를 사용하여 이름 간의 충돌을 피하기 위해 현재 실행 개체를 참조합니다.

this는 현재 오브젝트에 대한 참조입니다.생성자에서 이름이 같은 로컬 및 현재 클래스 변수를 구분하기 위해 사용됩니다. §:

public class circle {
    int x;
    circle(int x){
        this.x =x;
        //class variable =local variable 
    }
} 

this다른 컨스트럭터에서1개의 컨스트럭터를 호출하는 경우에도 사용할 수 있습니다.예를 들어 다음과 같습니다.

public class circle {
    int x;

    circle() { 
        this(1);
    }

    circle(int x) {
        this.x = x; 
    }
}

"이것"이 아닌 "x"를 사용해도 차이가 있나요?x"는 몇 가지 메서드에서 사용됩니까?

보통은 그렇지 않아요.하지만 때로는 차이가 있습니다.

  class A {
     private int i;
     public A(int i) {
        this.i = i; // this.i can be used to disambiguate the i being referred to
     }
  }

method()만 사용하면 기본적으로는 현재 오브젝트에 적용되지 않습니까?

하지만 하다면 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,this.method()에, 이 오브젝트에 의해서 콜이 발신되는 것을 나타냅니다.

this결과 코드에는 영향을 주지 않습니다.컴파일 시간 연산자이며, 컴파일 시간 연산자가 있든 없든 생성된 코드는 동일합니다.사용할 필요가 있는 경우는, 상황에 따라서 다릅니다.예를 들어, 앞에서 설명한 것처럼 클래스 변수를 섀도우하는 로컬 변수가 있고 로컬 변수가 아닌 클래스 변수를 참조하려면 이 변수를 사용해야 합니다.

edit: "resulting code will be same" 즉, 로컬 스코프의 어떤 변수가 클래스에 속한 변수를 숨기지 않는 경우.따라서

class POJO {
   protected int i;

   public void modify() {
      i = 9;
   }

   public void thisModify() {
      this.i = 9;
   }
}

두 방법의 결과 코드는 동일합니다.차이점은 일부 메서드가 동일한 이름으로 로컬 변수를 선언하는 경우입니다.

  public void m() {
      int i;
      i = 9;  // i refers to variable in method's scope
      this.i = 9; // i refers to class variable
  }

William Brendel의 투고와 dbcommissions 질문에 대해서, 케이스 2에 대해서.다음은 예를 제시하겠습니다.

public class Window {

  private Window parent;

  public Window (Window parent) {
    this.parent = parent;
  }

  public void addSubWindow() {
    Window child = new Window(this);
    list.add(child);
  }

  public void printInfo() {
    if (parent == null) {
      System.out.println("root");
    } else {
      System.out.println("child");
    }
  }

}

사물과 부모-자녀 관계를 형성할 때 사용하는 것을 본 적이 있습니다.단, 간결하게 하기 위해 간소화된 것입니다.

Java의 "this" 키워드는 현재 클래스 개체를 참조하기 위해 사용됩니다.

Java에서는 "this" 키워드를 6가지로 사용할 수 있습니다.

  1. 클래스 수준 변수 액세스: 로컬 및 클래스 수준 변수가 동일한 경우 대부분 사용됩니다.
  2. 클래스 메서드 액세스: 기본 동작이며 무시할 수 있습니다.
  3. 같은 클래스의 다른 생성자를 호출하는 경우
  4. 반환값으로 'this' 키워드 사용 : 메서드에서 현재 인스턴스를 반환하기 위해
  5. 메서드에 'this' 키워드를 인수로 전달: 현재 클래스 인스턴스를 인수로 전달
  6. 키워드는 생성자에 대한 인수로서 : 현재 클래스 인스턴스를 인수로 전달하기 위한 것입니다.

참조: https://stacktraceguru.com/java/this-keyword-in-java

현재 객체의 멤버가 사용되고 있는지 확인합니다.나사산 안전이 우려되는 경우 일부 응용 프로그램에서 잘못된 개체 구성원 값을 변경할 수 있습니다. 따라서 올바른 개체 구성원 값이 사용되도록 이 값을 구성원에 적용해야 합니다.

오브젝트가 스레드 안전과 관련이 없는 경우 어떤 오브젝트멤버 값을 사용할지 지정할 필요가 없습니다.

언급URL : https://stackoverflow.com/questions/2411270/when-should-i-use-this-in-a-class