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 name
과Member
의 멤버 변수의 이름이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이 중복되는 것.
- 예를 들어 이런 경우