외부에서 제공되는 다양한 데이터들을 이용해서 객체를 초기화 하려면 생성자도 다양화될 필요가 있습니다.
Car 객체를 생성할 때 외부에서 제공되는 데이터가 없다면 기본 생성자로 Car 객체를 생성해야 하고 외부에서 model 데이터가 제공되거나 model과 color 가 제공될 경우에도 Car객체를 생성할 수 있어야 합니다.
생존자가 하나뿐이라면 이러한 요구 조건을 수영할 수 없습니다.
그래서 자바는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 제공합니다. 생성자 오버로딩이란 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말합니다.
public class 클래스 {
클래스([타입 매개변수, ....]) {
}
클래스([타입 매개변수, ....]) {
}
}
[생성자의 오버로딩]
= 매개 변수의 타입, 개수, 순서가 다르게 선언합니다.
다음은 Car클래스에서 생성자를 오버로딩한 예를 써보겠습니다.
public class Car {
Car() {}
Car(String model) {}
Car (String model, String color) {}
Car (String model, String color, int maxSpeed) {}
}
생성자 오버로딩 시 주의점은 매개 변수의 타입과 개수 그리고 선언된 순사가 똑같을 경우 변수 이름만 바꾸는 것은 생성자 오버로딩이라고 볼 수 없습니다. 아래의 코드
Car(String model, String color) {}
Car(String color, String model) {} <= 오버로딩 아님
생성자가 오버로딩되어 있을 경우, new 연산자로 생성자를 호출할 때 제공되는 매개 값의 타입수에 의해 호출된 생성자가 결정됩니다.
Car car1 = new Car();
Car car2 = new Car("그랜저");
Car car3 = new Car("그랜저", "흰색");
Car car4 = new Car("그랜저","흰색", 300);
new Car()는 기본 생성자로 객체를 생성하고, new Car("그랜저")는 Car(String model) 생성자로 갹체를 생성합니다.
new Car("그랜저", "흰색")는 Car(String model, String color) 생성자로 객체를 생성하고
new Car("그랜저", "흰색", 300)는 Car(String model, String color, int maxSpeed)생성자로 객체를 생성합니다.
public class Car {
// 필드
String company = "현대자동차";
String model;
String color;
int maxSpeed;
// 생성자 1
Car() {
}
// 생성자 2
Car(String model) {
this.model = model;
}
// 생성자 3
Car (String model, String color) {
this.model = model;
this.color = color;
}
// 생성자 4
Car (String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
객체 생성시 선택자를 선택 가능 합니다.
public class CarExample {
public static void main(String[] args) {
// 1번 생성자 선택
Car car1 = new Car();
System.out.println("car1.company : " + car1.company);
System.out.println();
// 2번 생성자 선택
Car car2 = new Car("자가용");
System.out.println("car2.company : " + car2.company);
System.out.println("car2.model : " + car2.model);
System.out.println();
// 3번 생성자 선택
Car car3 = new Car("자가용" , "빨강");
System.out.println("car3.company : " + car3.company);
System.out.println("car3.model : " + car3.model);
System.out.println("car.3.color : " + car3.color);
System.out.println();
// 4번 생성자 선택
Car car4 = new Car("택시", "검정", 200);
System.out.println("car4.company : " + car4.company);
System.out.println("car4.model : " + car4.model);
System.out.println("car4.color : " + car4.color);
System.out.println("car4.maxSpeed : " + car4.maxSpeed);
System.out.println();
}
}
다른 생성자 호출(this())
생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있습니다.
매개 변수의 수만 달리하고 필드 초기화 내용이 비슷한 생성자에서 이러한 현상을 많이 볼 수 있습니다.
이 경우에는 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선할 수 있습니다.
생성자에게 다른 생성자를 호출할 때에는 다음과 같이 this() 코드를 사용합니다.
클래스( [매개변수선언, .....] ) {
this(매개변수, ..., 값, ...); <-클래스의 다른 생성자 호출
실행문;
}
this()는 자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫줄에서만 허용됩니다.
this()의 매개값은 호출되는 생성자의 매개 변수 타입에 맞게 제공해야 합니다. this() 다음에는 추가적인 실행문들이 올 수 있습니다.
생성자 오버로딩에서 생기는 중복 코드를 제거 해보겠습니다.
앞에사 사용한 두 개의 생성자에서 this()를 사용해서 마지막 생성자인 Car(String model, String color, int maxSpeed)를 호출하도록 수정하면 중복 코드를 최소화가 가능합니다.
public class Car {
// 필드
String company = "현대자동차";
String model;
String color;
int maxSpeed;
// 생성자 1
Car() {
}
// 생성자 2
Car(String model) {
this(model, "은색", 250);
}
// 생성자 3
Car (String model, String color) {
this(model, color, 250);
}
// 생성자 4
Car (String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
생성자 2.3번은 호출해서 생성자 4번으로 매개 변수 값을 넘겨주고 생성자 4번은 실행합니다.
CarExample를 작동시켜보면
'JAVA' 카테고리의 다른 글
제네릭 (0) | 2022.08.23 |
---|---|
JAVA 메서드 (0) | 2022.07.21 |
JAVA 필드 초기화 (0) | 2022.07.20 |
JAVA 생성자 (0) | 2022.07.19 |
Java 클래스 - 필드 (0) | 2022.07.15 |