생성자 - 필요한 이유

예시 코드) 기본

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;
	}
	
}