생성자 - 필요한 이유
예시 코드) 기본
package construct;
public class MemberInit {
String name;
int age;
int grade;
}
package construct;
public class MethodInitMain1 {
public static void main(String[] args) {
MemberInit member1 = new MemberInit();
member1.name = "user1";
member1.age = 15;
member1.grade = 90;
MemberInit member2 = new MemberInit();
member2.name = "user2";
member2.age = 16;
member2.grade = 80;
MemberInit[] members = {member1, member2};
for (MemberInit s : members) {
System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" +
s.grade);
}
}
}
실행결과
이름:user1 나이:15 성적:90 이름:user2 나이:16 성적:80
예시코드) 메서드 활용하여 초기 값 설정
package construct;
public class MemberInit {
String name;
int age;
int grade;
//메서드추가(초기값 설정)
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);
}
}
}
this
멤버 변수와 메서드의 매개변수의 이름이 같으면 둘을 어떻게 구분해야 할까? 이 경우 멤버 변수보다 매개변수가 코드 블럭의 더 안쪽에 있기 때문에 매개변수가 우선순위를 가진다. 따라서 initMember(String name,...) 메서드 안에서 name 이라고 적으면 매개변수에 접근하게 된다. 멤버 변수에 접근하려면 앞에 this. 이라고 해주면 된다. 여기서 this 는 인스턴스 자신의 참조값을 가리킨다.
this의 생략
this 는 생략할 수 있다. 이 경우 변수를 찾을 때 가까운 지역변수(매개변수도 지역변수다)를 먼저 찾고 없으면 그 다음으로 멤버 변수를 찾는다.
예시)필드 이름과 매개변수 이름이 다를때
package construct;
public class MemberThis {
String nameField;
void initMember(String nameParameter) {
nameField = nameParameter;
}
}
예시코드) 생성자 활용하여 초기 값 설정
객체를 생성하고 이후에 바로 초기값을 할당해야 하는 경우가 많다.
따라서 앞서initMember(...) 와 같은 메서드를 매번 만들어야 한다. 그래서 대부분의 객체 지향 언어는 객체를 생성하자마자 즉시 필요한 기능을 좀 더 편리하게 수행할 수 있도록 생성자라는 기능을 제공한다.
생성자를 사용하면 객체를 생성하는 시점에 즉시 필요한 기능을 수행할 수 있다
package construct;
public class MemberConstruct {
String name;
int age;
int grade;
//생성
MemberConstruct(String name, int age, int grade) {
System.out.println("생성자 호출 name=" + name + ",age=" + age + ",grade=" +
grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}