답변:
이 this
키워드는 주로 세 가지 상황에서 사용됩니다. 첫 번째이자 가장 일반적인 것은 setter 메소드에서 변수 참조를 명확하게하는 것입니다. 두 번째는 현재 클래스 인스턴스를 다른 객체의 메서드에 대한 인수로 전달해야 할 때입니다. 세 번째는 생성자 내에서 대체 생성자를 호출하는 방법입니다.
사례 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
. 단일 클래스에 대해 여러 생성자가있는 경우 생성자 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(arg1, arg2, ...)
생성자 내부 에도 있습니다.
this
내가 잊어 버린 다른 일반적인 용도를 지적 하여 내 답변에 추가했습니다. 최종 결과가 전체적으로 더 나은 답변이기 때문에 이것에 아무런 문제가 없습니다. 정확히 SO의 목적입니다. 또한 trinithis의 경우와 마찬가지로 가능한 한 신용을 제공하려고합니다.
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
- 대부분의 사람들은 그것을 사용 - 같은 이름의 중복 지역 변수있을 때. (예를 들어 세터 메소드)
물론 사용해야 할 또 다른 좋은 이유 this
는 IDE에서 인텔리전스가 팝업되기 때문입니다. :)
유일한 필요 를 사용하는 this.
다른 현재 범위의 주 내에서 변수와 동일한 이름과 (윌리엄 설명 같은) 인스턴스 멤버를 참조 할 때 규정이다. 그 외에도 x
와 사이의 동작에는 차이가 없습니다 this.x
.
this.x
코드를 좀 더 명확하게 읽는 데 사용할 수도 있습니다. 코드의 유지 관리 성 / 가독성 또한 고려해야 할 요소입니다.
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();
}
}
좋은 답변이 많이 있지만 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
에디터의 "find"기능을 사용하기 전까지는 어디에 있는지 알아 내기 힘들 것입니다. 그런 다음 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;
}
foo
은 외부 클래스에서 선언 된 변수 라는 것을 알고 Hello
있습니다.getStringFromSomewhere()
외부 클래스에서도 선언 된 메소드 라는 것을 알고 있습니다.bar
속하고 해당 메소드에 선언 된 로컬 변수 라는 것을 알고 있습니다.World
s
물론 무언가를 디자인 할 때마다 규칙을 만듭니다. 따라서 API 또는 프로젝트를 디자인 할 때 규칙에 "누군가이 소스 코드를 모두 메모장으로 열면 머리에 직접 촬영해야합니다"라는 규칙이 포함되어 있으면 이 를 수행하지 않는 것이 좋습니다.
변수 이름이 겹치지 않는 한 코드를 읽을 때 명확하게 표시됩니다.
this
불필요 할 때 키워드를 지속적으로 볼 때 코드가 읽기 어려운 보일러 플레이트 코드 일뿐입니다.
this
코드를 lmao를 읽기가 더 어렵게 만들지는 않습니다.
@William Brendel의 답변은 세 가지 사용 사례를 훌륭하게 제공했습니다.
사용 사례 1 :
에 offical 한 자바 문서 페이지에 이 같은 사용 사례를 제공한다.
인스턴스 메소드 또는 생성자 내에서 이것은 현재 객체 (메소드 또는 생성자가 호출되는 객체)에 대한 참조입니다. 이를 사용하여 인스턴스 메소드 또는 생성자 내에서 현재 오브젝트의 모든 멤버를 참조 할 수 있습니다.
두 가지 예를 다룹니다.
이것을 필드 와 함께 사용하고 생성자와 함께 사용
사용 사례 2 :
이 게시물에서 인용되지 않은 다른 유스 케이스 : this
데이터 및 메소드의 중요한 섹션을 보호하기 위해 멀티 스레드 응용 프로그램의 현재 객체를 동기화하는 데 사용할 수 있습니다.
synchronized(this){
// Do some thing.
}
사용 사례 3 :
빌더 패턴의 구현은 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
하지 않습니다.
메소드와 함께 사용하면 효과에 대한 것이 맞습니다. 당신은 그것의 유무에 관계없이 동일한 결과를 얻을 수 있습니다. 사용할 수 있습니까? 확실한. 사용해야합니까? 당신에게 달려 있지만, 개인적으로 명확성이 추가되지 않는 무의미한 세부 묘사라고 생각한다면 (코드가 정적 가져 오기 문으로 가득 차 있지 않은 한), 나는 그것을 직접 사용하지 않을 것입니다.
다음은 java에서 'this'키워드를 사용하는 방법입니다.
this
현재 클래스 인스턴스 변수를 참조하기 위해 키워드 사용this()
현재 클래스 생성자를 호출하는 데 사용this
현재 클래스 인스턴스를 반환하기 위해 키워드 사용this
메소드 매개 변수로 키워드 사용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
또한 다른 생성자에서 하나의 생성자를 호출하는 데 사용할 수 있습니다. 예 :
public class circle {
int x;
circle() {
this(1);
}
circle(int x) {
this.x = x;
}
}
this
결과 코드에 영향을 미치지 않습니다-컴파일 시간 연산자이며 코드의 유무에 관계없이 생성 된 코드는 동일합니다. 사용해야 할 때는 상황에 따라 다릅니다. 예를 들어 클래스 변수를 가리는 로컬 변수가 있고 로컬 변수가 아닌 클래스 변수를 참조하려는 경우에 말했듯이이를 사용해야합니다.
편집 : "결과 코드가 동일합니다"라는 것은 물론 로컬 범위의 일부 변수가 클래스에 속한 변수를 숨기지 않는 경우를 의미합니다. 그러므로
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
}
에 대하여 윌리엄 브렌델 의 게시물과 dbconfessions 에 대한 질문 의 경우 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"키워드는 현재 클래스 객체를 참조하는 데 사용됩니다.
자바에는 "this"키워드가 6 가지 있습니다.
현재 개체의 멤버가 사용되도록합니다. 스레드 안전성이 중요한 경우, 일부 응용 프로그램은 잘못된 오브젝트 멤버 값을 변경할 수 있으므로 올바른 오브젝트 멤버 값이 사용되도록 멤버에 적용해야합니다.
객체가 스레드 안전성과 관련이없는 경우 어떤 객체 멤버의 값을 사용할지 지정할 이유가 없습니다.