package ex_this;
public class Ex2 {
public static void main(String[] args) {
/*
* 생성자 this()
* - 생성자 내에서 자신의 인스턴스 내의 다른 생성자를 명시적으로 호출
* - 생성자 초기화 코드가 중복될 때 중복 제거를 위해 하나의 생성자에서만
* 초기화 코드를 작성하고 나머지 다른 생성자는 해당 생성자 호출을 통해
* 데이터만 전달하여 초기화 코드의 중복을 제거하는 용도로 사용
* - 주의사항!
* 생성자 this()는 반드시 생성자 내의 첫문장에서 호출되어야 한다!
*
* < 기본 사용 문법 >
* this([생성자에 전달할 데이터...]);
*
*/
Person2 p = new Person2();
System.out.println("이름 : " + p.name);
System.out.println("나이 : " + p.age);
System.out.println("======================");
Person2 p2 = new Person2("이순신");
System.out.println("이름 : " + p2.name);
System.out.println("나이 : " + p2.age);
}
}
class Person2 {
String name;
int age;
// 기본 생성자 정의 - 이름 : "홍길동", 나이 : 0 초기화
public Person2() {
// name = "홍길동";
// age = 0;
// Person2("홍길동", 0);
// 다른 생성자 Person2(String, int)를 호출하여 대신 초기화 요청
// => 생성자는 new 이외에 직접 호출이 불가능하며 생성자 this() 필수!
this("홍길동");
System.out.println("Person2() 생성자 호출됨!");
// this("홍길동", 0); // 컴파일 에러 발생!
// => 생성자 this()는 반드시 생성자 내의 첫문자에서 호출!
}
// 이름 전달받는 생성자 정의 - 나이 : 0 초기화
public Person2(String name) {
// this.name = name;
// age = 0;
this(name, 0); // 로컬변수 name에 저장된 데이터는 그대로 전달
System.out.println("Person2(String) 생성자 호출됨!");
}
// 이름, 나이 전달받는 생성자 정의
public Person2(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Person2(String, int) 생성자 호출됨!");
}
}
연습
package ex_this;
public class Test2 {
public static void main(String[] args) {
Car c = new Car();
c.print();
// c.company = "현대자동차";
// c.model = "소나타";
// c.print();
System.out.println("============================");
Car c2 = new Car("기아자동차");
c2.print();
System.out.println("============================");
Car c3 = new Car("기아자동차", "스포티지");
c3.print();
}
}
/*
* Car 클래스 정의
* - 멤버변수
* 1) 회사(company, 문자열)
* 2) 모델(model, 문자열)
* 3) 색상(color, 문자열)
* 4) 최대속도(maxSpeed, 정수)
* - 기본생성자 정의 및 다음 데이터로 초기화
* 회사 : "현대자동차"
* 모델 : "소나타"
* 색상 : "검정"
* 최대속도 : 200
* - 회사(company)를 전달받는 생성자 정의 및 다음 데이터로 초기화
* 회사 : 전달받은 회사
* 모델 : "소나타"
* 색상 : "검정"
* 최대속도 : 200
* - 회사(company), 모델(model)을 전달받는 생성자 정의 및 다음 데이터로 초기화
* 회사 : 전달받은 회사
* 모델 : 전달받은 모델
* 색상 : "검정"
* 최대속도 : 200
* - 회사(company), 모델(model), 색상(color)을 전달받는 생성자 정의 및 다음 데이터로 초기화
* 회사 : 전달받은 회사
* 모델 : 전달받은 모델
* 색상 : 전달받은 색상
* 최대속도 : 200
* - 회사(company), 모델(model), 색상(color), 최대속도(maxSpeed)을
* 전달받는 생성자 정의 및 다음 데이터로 초기화
* 회사 : 전달받은 회사
* 모델 : 전달받은 모델
* 색상 : 전달받은 색상
* 최대속도 : 전달받은 최대속도
*
* - 멤버변수 정보 출력하는 print 메서드 정의
*/
class Car2 {
String company;
String model;
String color;
int maxSpeed;
public Car2() {
// 로컬변수가 없으므로 모든 변수에 this 생략 가능
// company = "현대자동차";
// model = "소나타";
// color = "검정";
// maxSpeed = 200;
this("현대자동차", "소나타", "검정", 200);
}
public Car2(String company) {
// company 로컬변수는 이름이 중복되므로
// 멤버변수 company에 레퍼런스 this 생략 불가!
// this.company = company;
// this.model = "소나타"; // this 생략 가능
// color = "검정";
// maxSpeed = 200;
this(company, "소나타", "검정", 200);
}
public Car2(String company, String model) {
// this.company = company;
// this.model = model;
// color = "검정";
// maxSpeed = 200;
this(company, model, "검정", 200);
}
public Car2(String company, String model, String color) {
// this.company = company;
// this.model = model;
// this.color = color;
// maxSpeed = 200;
this(company, model, color, 200);
}
public Car2(String company, String model, String color, int maxSpeed) {
this.company = company;
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
public void print() {
System.out.println("회사 : " + company);
System.out.println("모델 : " + model);
System.out.println("색상 : " + color);
System.out.println("최대속도 : " + maxSpeed + " km/h");
}
}