- 생성자는 객체 생성 직후 객체를 초기화 하기 위한 특별한 메서드로 생각
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);
}
}
}

하지만 이 코드는 초기값을 설정하는 부분이 계속 반복
package construct;
public class MethodInitMain2 {
public static void main(String[] args) {
MemberInit member1 = new MemberInit();
initMember(member1, "user1", 15, 90);
MemberInit member2 = new MemberInit();
initMember(member2, "user2", 16, 80);
MemberInit[] members = {member1, member2};
for (MemberInit s : members) {
System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" +
s.grade);
}
}
static void initMember(MemberInit member, String name, int age, int grade) {
member.name = name;
member.age = age;
member.grade = grade;
}
}
- 본인한테 가까운 거 먼저 찾고 없으면 멤버변수 찾는방식.
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는 인스턴스 자신의 참조값을 가리킨다.
메소드: '프로그램이 어떤 동작을 하게 하는 명령 기능', 영어와 관련지어 '동사'에 해당. sout와 같이 JAVA에서 제공하지만, 개발자가 직접 만들어 사용 가능

멤버변수 - 클래스변수, 인스턴스 변수

package construct;
public class MemberThis {
String nameField;
void initMember(String nameParameter) {
nameField = nameParameter;
}
}
this와 코딩 스타일

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

생성자는 인스턴스(객체)를 생성하고 나서 즉시 호출된다.


생성자의 진짜 장점은 객체를 생성할 때 직접 정의한 생성자가 있다면 직접정의한 생성자를 반드시 호출해야 한다는 점이다. 참고로 생성자를 메서드 오버로딩 처럼 여러개 정의할 수 있는데, 이 경우에는 하나만 호출하면 된다.





두 생성자를 보면 중복하는 부분이 있다.

이때 this() 라는 기능을 사용하면 생성자 내부에서 자신의 생성자를 호출할 수 있다. 참고로 this는 인스턴스 자신의 참조값을 가리킨다. 그래서 자신의 생성자를 호출한다고 생각하면 된다.
생성자 중복피하기(이해 하는데 오래걸림)
- 다른 생성자를 호출해서 자기의 값으로 초기화(예를 들어 메소드를 호출하는 것처럼)



package construct.ex;
import java.awt.*;
public class Book {
String title; //제목
String author; //저자
int page; //페이지 수
Book(){//기본 생성자
this("", "", 0);
}
// title과 author만을 매개변수로 받는 생성자
Book(String title, String author){
this(title,author,0);
}
// 모든 필드를 매개변수로 받는 생성자
Book(String title, String author, int page){
this.title = title;
this.author = author;
this.page = page;
}
void displayInfo(){
System.out.println("제목: " + title + ", 저자:" + author + ", 페이지:" + page);
}
}
방식

1. 2개를 먼저 만들어준다. 이렇게

2. void displayInfo() {
System.out.println("제목: " + title + ", 저자: " + author + ", 페이지: " +
page);
}
} 이 줄을 넣어서 출력을 완료해준다.