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은 없나요?