✏️ MemberInit - initMember() 추가

package construct;

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

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

public class MethodInitMain3 {

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

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

    MemberInit[] members = {member1, member2};

    for (MemberInit s : members) {
      System.out.println("이름: " + s.name + " 나이: " + s.age + " 성적: " + s.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는 생략할 수 있다. 이 경우 변수를 찾을 때 가까운 지역변수(매개변수도 지역변수다.)를 먼저 찾고 없으면 그 다음으로 멤버 변수를 찾는다. 멤버 변수도 없으면 오류가 발생한다.

package construct;

public class MemberThis {
  String nameField;
  
  void initMember(String nameParameter) {
    nameField = nameParameter;
  }
}

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

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




✅ this와 코딩 스타일


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

package construct;

public class MemberThis {
  String nameField;
  
  void initMember(String nameParameter) {
    this.nameField = nameParameter;
  }
}

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

하지만 최근에 IDE가 발전하면서 IDE가 멤버 변수와 지역 변수를 색상으로 구분해준다.
다음을 보면 멤버 변수와 지역 변수의 색상이 다른 것을 확인할 수 있다.

profile
매일 성장하는 주니어 개발자의 기록📝

2개의 댓글

comment-user-thumbnail
2024년 2월 12일

that은 없나요?

1개의 답글