먼저 클래스는 객체의 바탕이 되는 레이아웃이라고 표현할 수 있을 것 같아요. 즉, 김영미, 김은정이라는 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.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;
}
}
'코딩' 카테고리의 다른 글
[Java] 패키지, 클래스, 객체 개념 정리 (0) | 2018.02.25 |
---|---|
[Java] 메소드 선언, 호출하기 (0) | 2018.02.25 |
[Java] 각 학생의 점수를 입력받아 최고 점수 및 평균 점수 구하는 프로그램 (0) | 2018.02.18 |
[Java] Calendar 활용하기 (0) | 2018.02.18 |
[Java] 열거 (Enumeration, Enum) (0) | 2018.02.18 |