Home > Archive > Java_archive > ☕️[Java] this

☕️[Java] this
Java Programming Language

this

Member - initMember() 추가

package construct;

public class Member {
  String name;
  int age;
  int grade;

  // 추가
  void initMember( String name, int age, int grade) {
    this.name = name;
    this.age = age;
    this.grade = grade;
  }
}

MethodInitMain3

package construct;

public class MethodInitMain3 {

  public static void main(String[] args) {
    Member member1 = new Member();
    member1.initMember("user1", 15, 90);

    Member member2 = new Member();
    member2.initMember("user2", 16, 80);

    Member[] members = { member1, member2 };

    for (Member member : members) {
      System.out.println("아름:" + member.name + " 나이:" + member.age + " 성적:" + member.grade);
    }
  }
}
  • initMember(...)Member에 초기값 설정 기능을 제공하는 메서드입니다.

다음과 같이 메서드를 호출하면 객체의 멤버 변수에 인자로 넘어온 값을 채웁니다.

  • member1.initMember("user1", 15, 90)

this

Member의 코드를 다시 봐봅시다.

  • initMember(String name...)의 코드를 보면 메서드의 매개변수에 정의한 String nameMember의 멤버 변수의 이름이 String name으로 둘다 똑같습니다.
    • 나머지 변수 이름도 name, age, grade로 모두 같습니다.

“멤버 변수와 메스더의 매개변수의 이름이 같으면 둘을 어떨게 구분해야 할까요?”

  • 이 경우 멤버 변수보다 매개변수가 코드 블럭의 안쪽에 있기 때문에 “매개변수가 우선 순위를” 가집니다.
    • 따라서 initMember(String name, ...) 메서드 안에서 name이라고 적으면 매개변수에 접근하게 됩니다.
  • 멤버 변수에 접근하려면 앞에 this.이라고 해주면 됩니다.
    • 여기서 this는 인스턴스 자신의 참조값을 가리킵니다.

진행 과정

this.name = name; // 1. 오른쪽의 name은 매개변수에 접근
this.name = "user"; // 2. name 매개변수의 값 사용
x001.name = "user"; // 3. this.은 인스턴스 자신의 참조값을 뜻함. 따라서 인스턴스의 멤버 변수에 접근.

this 제거

만약 이 예제에서 this를 제거하면 어떻게 될까요?

this.name = name

다음과 같이 수정하면 name은 둘다 매개변수를 뜻하게 됩니다.
따라서 멤버변수의 값이 변경되지 않습니다.

name = name;

정리

  • 매개변수의 이름과 멤버 변수의 이름이 같은 경우 this를 사용해서 둘을 명확하게 구분해야 합니다.
  • this는 인스턴스 자신을 가리킵니다.

this의 생략

  • this는 생략할 수 있습니다.
    • 이 경우 변수를 찾을 때 가까운 지역변수(매개변수도 지역변수입니다.)를 먼저 찾고 없으면 그 다음으로 멤버 변수를 찾습니다.
      • 멤버 변수도 없으면 오루가 발생합니다.

다음 예제는 필드 이름과 매개변수의 이름이 서로 다릅니다.

MemberThis

package construct;

public class MemberThis {
  String nameField;

  void initMember(String nameParameter) {
    nameField = nameParameter;
  }
}

“예를 들어서 nameField는 앞에 this가 없어도 멤버 변수에 접근합니다.”

  • nameField는 먼저 지역변수(매개변수)에서 같은 이름이 있는지 찾습니다.
    • 이 경우 없으므로 멤버 변수에서 찾습니다.
  • nameParametr는 먼저 지역변수(매개변수)에서 같은 이름이 있는지 찾습니다.
    • 이 경우 매개변수가 있으므로 매개변수를 사용합니다.

this와 코딩 스타일

“다음과 같이 멤버 변수에 접근하는 경우에 항상 this를 사용하는 코딩 스타일도 있습니다.”
MemberThis

package construct;

public class MemberThis {
  String nameField;

  void initMember(String nameParameter) {
    this.nameField = nameParameter;
  }
}
  • this.nameField를 보면 this를 생략할 수 있지만, 생략하지 않고 사용해도 됩니다.
    • 이렇게 this를 사용하면 이 코드가 멤버 변수를 사용한다는 것을 눈으로 쉽게 확인할 수 있습니다.
      • 그래서 과거에 이런 스타일을 많이 사용하기도 했습니다.
        • 쉽게 이야기해서 this를 강제로 사용해서, 지역 변수(매개변수)와 멤버 변수를 눈에 보이도록 구분하는 것입니다.

“하지만 최근에는 IDE가 발전하면서 IDE가 멤버 변수와 지역 변수를 색상으로 구분해줍니다.”

  • 이런 점 때문에 this는 꼭 필요한 경우에만 사용해도 충분하다 생각한다.
    • 예를 들어 이런 경우 this.name = name -> name이 중복되는 것.