06
22
728x90

생성자를 다양화해야 하는 이유

객체를 생성할 때 외부의 값으로 객체를 초기화할 필요가 있다.

외부의 값이 어떤 타입으로 몇 개가 제공될 지 모르기 때문에 생성자도 다양화해질 필요가 있다.

 

생성자 오버로딩(Overloading)

매개변수의 타입, 개수, 순서가 다른 생성자를 여러 개 선언하는 것

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) {...} //오버로딩이 아님 , 매개변수의 타입과 갯수가 같기 때문에

 

예제)

package sec07.exam03_constructor_overloading;

public class Car 
{
	String company = "현대자동차";
	String model;
	String color;
	int maxSpeed;
	
	Car()
	{
		
	}
	Car(String model)
	{
		this.model = model;
	}
	Car(String model, String color)
	{
		this.model = model;
		this.color = color;
	}
	Car(String model, String color, int maxSpeed)
	{
		this.model = model;
		this.color = color;
		this.maxSpeed = maxSpeed;
	}
	Car(String model, int maxSpeed, String color ) //생성자 오버로딩 가능 String int String 이기 때문에 위의 String String int와는 다름
	{
		this.model = model;
		this.color = color;
		this.maxSpeed = maxSpeed;
	}
}
package sec07.exam03_constructor_overloading;

public class CarExample 
{
	public static void main(String[] args) 
	{
		Car car1 = new Car();
		System.out.println("car1.company :" + car1.company);
		System.out.println("car1.model :" + car1.model);
		System.out.println("car1.color :" + car1.color);
		System.out.println("car1.maxSpeed :" + car1.maxSpeed);
		
		Car car2 = new Car("자가용");
		System.out.println("car2.company :" + car2.company);
		System.out.println("car2.model :" + car2.model);
		System.out.println("car2.color :" + car2.color);
		System.out.println("car2.maxSpeed :" + car2.maxSpeed);
		
		Car car3 = new Car("자가용", "빨강");
		System.out.println("car3.company :" + car3.company);
		System.out.println("car3.model :" + car3.model);
		System.out.println("car3.color :" + car3.color);
		System.out.println("car3.maxSpeed :" + car3.maxSpeed);
		
		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);
	}
}

 

출력 결과

 

다른 생성자 호출 (this())

생성자가 오버로딩되면 생성자 간의 중복된 코드가 발생할 수 있다.

초기화 내용이 비슷한 생성자들에서 이러한 현상을 많이 볼 수 있다.

this() : 객체의 다른 생성자를 호출

해결 방법 :

1. 초기화 내용을 한 생성자에 몰아서 작성한다.

2. 다른 생성자는 초기화 내용을 작성한 생성자를 this(...)로 호출한다.

Car(String model)
{
       //호출
       this(model,null,0);
}

Car(String model, String color)
{
       //호출
       this(model,color,0);
}

Car(String model, String color, int maxSpeed)
{      
       //공통 실행 코드
       this.model = model;
       this.color = color;
       this.maxSpeed = maxSpeed;
}

 

예제)

package sec07.exam04_other_constructor_call;

public class Car 
{
	String company = "현대자동차";
	String model;
	String color;
	int maxSpeed;
	
	Car()
	{
		
	}
	Car(String model)
	{
		//System.out.println("Car(String model) 실행");
		//항상 다른 생성자를 호출하는 코드는 생성자의 첫줄에 와야함. 아니면 에러
		this(model, null, 0);
	}
	Car(String model, String color)
	{
		this(model, color, 0);
	}
	Car(String model, String color, int maxSpeed)
	{
		this.model = model;
		this.color = color;
		this.maxSpeed = maxSpeed;
	}
}

 

728x90
COMMENT