먼저 클래스는 객체의 바탕이 되는 레이아웃이라고 표현할 수 있을 것 같아요. 즉, 김영미, 김은정이라는 2명의 "객체"가 있으면 이 객체를 생성할 때 기본적인 구조는 사람 클래스를 따릅니다. 사람 클래스에 "사람이라는 객체는 국가, 이름, 주민번호를 가져" 라고 선언해주는거에요. 이 때 국가, 이름, 주민번호와 같은 객체의 정보는 필드라고 합니다. 그래서 클래스를 선언할 때 먼저 "이 클래스를 기반으로 생성될 객체는 이런 이런 필드를 가진다"라고 정의해줍니다. 

그리고 클래스에서 다음으로 정의하는게 생성자인데요 (constructor), 생성자는 단순하게 생각해서 "사람이라는 객체는 처음에 이런 이런 필드 값을 가지고 태어나면 돼"라고 알려줍니다. 


아래 [Korea.class]라고 되어있는게 Korean이라는 클래스 코드입니다. 여기서 기본적인 객체의 레이아웃을 짜주는거죠!

여기선 필드에서 국가를 대한민국으로 디폴트 지정해주고, 생성자에서 선언한대로 사용자가 객체의 이름과 주민번호를 넣어주면 그 두가지 필드+대한민국이라는 국가 필드를 가진 객체를 생성합니다. 



[Korean.class]

package practice;


public class Korean {

//필드

String nation = "대한민국"; //모든 객체는 기본적으로 대한민국이라는 값을 가지고 생성됨.

String name;

String ssn;

//생성자

public Korean (String name, String ssn) { //name과 ssn라는 string 변수를 받아온다.

this.name = name; //this.name은 이 객체의 필드 name을 지칭. 받아온 name 매개변수 값이 이 객체의 필드 name에 대입된다.

this.ssn = ssn; //마찬가지로 받아온 ssn 매개변수 값이 ssn에 대입

}

}



이렇게 클래스를 만들었으면 이제 외부 클래스에서 객체를 만들고 필드도 호출해봅니다. 객체 생성하지 않고 필드 호출은 불가능하다고 해요. 어찌보면 당연하지만요!
외부 클래스를 KoreanExample이라고 이름 지었고 (책 그대로 보고 따라함) 여기서 k1과 k2이라는 객체를 만듭니다. 

[KoreanExample.Class]

package practice;


public class KoreanExample { //Korean 클래스의 필드 값을 불러오게될 다른 외부 클래스

public static void main(String[] args) {

Korean k1 = new Korean("김영미", "011225-1234567"); //이름과 가짜주민번호를 매개변수로 제공하고 Korean 클래스의 새로운 객체 k1을 생성한다. 

System.out.println("k1.name: " + k1.name);

System.out.println("k1.ssn: " + k1.ssn);

Korean k2 = new Korean("김은정","920525-0654321");

System.out.println("k2.name: " + k2.name);

System.out.println("k2.ssn: " + k2.ssn);

}

}



그런데 위 예시처럼 이름과 주민번호 두개를 매개변수로 하지 않고 다른 조합을 매개변수로 하는 객체도 생성할 수 있어야겠죠! 생성자를 여러개 선언하면 가능합니다. 이걸 생성자 오버로드라고 부르는데 아래처럼 생성자를 연달아서 선언해주면 됩니다. 


[생성자 오버로드 - Korean.class]


package practice;


public class Korean {

//필드

String nation = "대한민국"; //필드 값을 초기화해줌

String name;

String ssn;

//생성자 오버로드

Korean(String name) {

this.name = name;

}

Korean(String name, String ssn) { //name과 ssn라는 string 변수를 받아온다.

this.name = name; //this.name은 이 객체의 필드 name을 지칭. 받아온 name 매개변수 값이 이 객체의 필드 name에 대입된다.

this.ssn = ssn; //마찬가지로 받아온 ssn 매개변수 값이 ssn에 대입

}

}



[다른 생성자 호출 - this()]


아래 코드를 보면


package practice;


public class Korean {

//필드

String name;

String ssn;

String nation;

//생성자 오버로드

Korean(String name) {

this.name = name;

this.ssn = "없음";

this.nation = "대한민국";

}

Korean(String name, String ssn) {

this.name = name;

this.ssn = ssn;

this.nation = "대한민국";

}

Korean(String name, String ssn, String nation) {

this.name = name

this.ssn = ssn

this.nation = nation;

}

}


생성자 3개가 거의 비슷합니다. 매번 다 써야하니 중복 작업이 만만치 않아요! 항상 보면 프로그래밍할 땐 최대한 중복 코드를 줄이는게 좋은 듯 한데, (주워들음) 중복 생성자 호출 코드를 줄이는 방법도 있습니다. this()를 사용하는건데, 생성자의 첫 줄에만 this()를 사용할 수 있다고 해요. 그래서 생성자 1, 2에 this()를 사용했고 생성자 3의 코드를 호출하도록 했습니다. 그러니까 생성자 3의 this.name = name

 this.ssn = ssn

 this.nation = nation;를 this(name, ssn, nation)으로 묶었고, 생성자 1에선 name만 인풋으로 받기 때문에 ssn과 nation을 초기값 "없음"과 "대한민국"으로 설정했고, 마찬가지로 생성자 2에선 name과 ssn을 인풋으로 받기 때문에 this(name, ssn, "대한민국")이라고 3번째 생성자를 호출합니다. 


package practice;


public class Korean {

//필드

String name;

String ssn;

String nation;

//생성자 오버로드

Korean(String name) {

this(name, "없음", "대한민국"); //인풋으로 받을 이름만 name을 매개변수로, 나머지는 초기화 스트링을 준다. 

}

Korean(String name, String ssn) {

this(name, ssn, "대한민국");

}

Korean(String name, String ssn, String nation) {

this.name = name

this.ssn = ssn

this.nation = nation;

}

}



+ Recent posts