
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)
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.name = name;
다음과 같이 수정하면 name은 둘 다 매개변수를 뜻하게 된다. 따라서 멤버 변수의 값이 변경되지 않는다.
name = name;
this를 사용해서 둘을 명확하게 구분해야 한다.this는 인스턴스 자신을 가리킨다.this는 생략할 수 있다. 이 경우 변수를 찾을 때 가까운 지역변수(매개변수도 지역변수다.)를 먼저 찾고 없으면 그 다음으로 멤버 변수를 찾는다. 멤버 변수도 없으면 오류가 발생한다.
package construct;
public class MemberThis {
String nameField;
void initMember(String nameParameter) {
nameField = nameParameter;
}
}
예를 들어서 nameField는 앞에 this가 없어도 멤버 변수에 접근한다.
nameField는 먼저 지역변수(매개변수)에서 같은 이름이 있는지 찾는다. 이 경우 없으므로 멤버 변수에서 찾는다.nameParameter는 먼저 지역변수(매개변수)에서 같은 이름이 있는지 찾는다. 이 경우 매개변수가 있으므로 매개변수를 사용한다.다음과 같이 멤버 변수에 접근하는 경우에 항상 this를 사용하는 코딩 스타일도 있다.
package construct;
public class MemberThis {
String nameField;
void initMember(String nameParameter) {
this.nameField = nameParameter;
}
}
this.nameField를 보면 this를 생략할 수 있지만, 생략하지 않고 사용해도 된다.
이렇게 this를 사용하면 이 코드가 멤버 변수를 사용한다는 것을 쉽게 확인할 수 있다. 그래서 과거에 이런 스타일을 많이 사용하기도 했다. 쉽게 이야기해서 this를 강제로 사용해서, 지역 변수(매개변수)와 멤버 변수를 눈에 보이도록 구분하는 것이다.
하지만 최근에 IDE가 발전하면서 IDE가 멤버 변수와 지역 변수를 색상으로 구분해준다.
다음을 보면 멤버 변수와 지역 변수의 색상이 다른 것을 확인할 수 있다.

that은 없나요?