수업 시간에 "this"를 언제 사용해야합니까?
나는 그것이 this
현재 객체 를 참조 한다는 것을 알고 있습니다. 하지만 언제 사용해야하는지 모르겠습니다. 예를 들어, 일부 방법 x
대신에 사용하면 차이가 this.x
있습니까? 수 있음 x
고려 방법에 대한 로컬 변수를 참조 할 것인가? 나는이 방법에서만 볼 수있는 변수를 의미합니다.
무엇에 대해 this.method()
? 사용할 수 있습니까? 사용해야합니까? 방금 사용 method()
하면 기본적으로 현재 객체에 적용되지 않습니까?
이 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
이미 많은 대답이 말한 것처럼 로컬 변수로 숨기는 것 외에 중첩 된 비 정적 클래스에서 외부 인스턴스에 액세스 할 때입니다.
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"는 한 생성자를 다른 생성자에서 호출 할 때도 유용합니다.
public class MyClass {
public MyClass(String foo) {
this(foo, null);
}
public MyClass(String foo, String bar) {
...
}
}
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 또는 프로젝트를 디자인 할 때 규칙에 "누군가가 이러한 소스 코드를 모두 메모장으로 열면 머리에서 직접 촬영해야합니다"가 포함되어 있으면이를 수행하지 않는 것이 좋습니다.
@William Brendel의 답변은 세 가지 사용 사례를 훌륭하게 제공했습니다.
사용 사례 1 :
이것에 대한 공식 Java 문서 페이지 는 동일한 사용 사례를 제공합니다.
인스턴스 메소드 또는 생성자 내에서 이것은 현재 객체 (메소드 또는 생성자가 호출되는 객체)에 대한 참조입니다. 이를 사용하여 인스턴스 메소드 또는 생성자 내에서 현재 오브젝트의 모든 멤버를 참조 할 수 있습니다.
두 가지 예를 다룹니다.
이것을 필드 와 함께 사용하고 생성자와 함께 사용
사용 사례 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.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
결과 코드에 영향을 미치지 않습니다-컴파일 시간 연산자이며 코드의 유무에 관계없이 생성 된 코드는 동일합니다. 사용해야 할 때는 상황에 따라 다릅니다. 예를 들어 클래스 변수를 가리는 로컬 변수가 있고 로컬 변수가 아닌 클래스 변수를 참조하려는 경우에 말했듯이이를 사용해야합니다.
편집 : "결과 코드가 동일합니다"라는 것은 물론 로컬 범위의 일부 변수가 클래스에 속하는 변수를 숨기지 않는 경우를 의미합니다. 그러므로
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
}
사례 2 와 관련하여 William Brendel 의 게시물 및 dbconfessions 질문과 관련하여 . 예를 들면 다음과 같습니다.
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");
}
}
}
객체와 부모-자식 관계를 구축 할 때 이것을 사용하는 것을 보았습니다. 그러나 간결성을 위해 단순화되었습니다.
현재 개체의 멤버가 사용되도록합니다. 스레드 안전성이 중요한 경우 일부 응용 프로그램은 잘못된 오브젝트 멤버 값을 변경할 수 있습니다. 따라서 올바른 오브젝트 멤버 값이 사용되도록 멤버에 적용해야합니다.
객체가 스레드 안전성과 관련이없는 경우 어떤 객체 멤버의 값을 사용할지 지정할 이유가 없습니다.
참고 URL : https://stackoverflow.com/questions/2411270/when-should-i-use-this-in-a-class
'Programing' 카테고리의 다른 글
마스터와 개발 브랜치 사이의 "git pull"또는 "git merge" (0) | 2020.04.10 |
---|---|
한 요소에 두 개의 CSS 클래스 사용하기 (0) | 2020.04.10 |
파이썬에서 문자열을 공백으로 나눕니다 (따옴표 붙은 부분 문자열 유지) (0) | 2020.04.10 |
큰 SQL 파일을 가져올 때 MySQL 서버가 사라졌습니다 (0) | 2020.04.10 |
Swift에서 객체의 유형을 어떻게 알 수 있습니까? (0) | 2020.04.10 |