Java/모두의 자바

Chapter 06-35 생성자 오버로딩과 this

계란💕 2022. 2. 7. 15:28

06-36.1 생성자 오버로딩이란?

 

  Def) 생성자 오버로딩: 생성자도 메서드와 마찬가지로 여러 개를 선언할 수 있다. 

  - 매개변수의 수와 형만 다르면 생성자를 여러개 선언할 수 있다. 

<hide/>

package javaStudy;
public class Car{
	// 형 + 필드명 
	String name;
	int number;
	
	public Car(String name) {
		this.name = name;
	}
}

  - 34장에서 Car클래스에 이름을 받는 생성자를 하나 추가했다. 

  - 생성자를 추가한 뒤 Car객체를 생성할 때 "소방차"라는 이름 넣어서 생성했다.

 

 

06-36.2 

  Ex) 

<hide/>

package javaStudy;

public class CarExam3 {

	public static void main(String[] args) {
		Car c1 = new Car("소방차");
		Car c2 = new Car();
	}	
}

  Note) 출력 결과:  The constructor Car(String) is undefined

  - 위 코드에서 정의한 생성자가 하나 있고 기본 생성자가 만들어지지 않기 때문에 컴파일 에러가 난다. 

  - 그럼 기본 생성자를 아예 사용할 수 없을까? No!

  - 셍성자도 여러 개 정의할 수 있다.

  - 기본 생성자로도 Car객체를 만들고 싶다면 기본 생성자를 직접 정의해두면 된다. 

 

  Def) 기본 생성자: 디폴트로 아무 값도 받지않는 생성자를 말한다. 

 

 

06-36.3 기본생성자 만들기

  Ex)  

<hide/>

package javaStudy;
public class Car{
	// 형 + 필드명 
	String name;
	int number;
	
	public Car(String name) {
		this.name = name;
		
	}
	public Car() {		
	
	}	
}

 

  Note) 기본 생성자를 정의하면 CarExam3에 있던 에러가 사라진다.

  - 생성자도 이렇게 오버로딩이 가능하다. 

  

 

06-36.4 

  Ex)

<hide/>

package javaStudy;
public class Car{
	// 형 + 필드명 
	String name;
	int number;
	
	public Car(String name) {
		this.name = name;
		this.number = number;	
	}
	public Car() {		
	}	
}

  Note)  이름 외에 번호도 받을 수 있도록 생성자를 정의했다. 

  - 필드 name에 매개변수로 받아온 name값을 넣는다

  - 필드 numbeer에 매개변수로 받아온 number 값을 넣는다.

  - 새로 만들 생성자를 사용해서 Car객체를 만들어보자.

 

 

06-36.5 Car객체 만들기

  Ex)

<hide/>

package javaStudy;
public class Car{
	// 형 + 필드명 
	String name;
	int number;
	
	public Car(String name) {
		this.name = name;
	}
	
	public Car() {		
//		this.name = "이름없음";
//		this.number = 0;	
		this("이름없음", 0 );
	}	
	
	public Car(String name, int number) {
		this.name = name;
		this.number = number;
		
	}
}

  Note)

  - this.name = "이름없음" 과 this.number = 0;은 같은 코드이므로 다음과 같이 바꿔준다.

    -> this("이름 없음", 0)

    -> this에 괄호를 붙이면 자기 자신의 생성자를 의미한다. 

    -> 자기 자신의 생성자에 "이름 없음"과 0을 넣어 호출하면 Car객체에 기본 생성자를 호출했을 때

    -> String값과 int값을 가진 생성자를 호출할 것이다. 

  - 생성자 Car()에서 this("이름 없음", 0)는 Car(String name, int number)를 호출하는 것이다. 

  -  마찬가지로 Car(String name) 에서 { this.name = name; } 대신에 this(name, 0)으로 바꿔주면

  -  Car(String name, int number)를 호출한다. 

  - 만약 this(0)이 가능하려면 생성자 중에서 Car(int number)가 있어야 한다. 

  -  따라서 this()는 생성자를 호출하는 방법으로 정의되지 않은 생성자는 호출할 수 없다. 

  - 생성자가 여러 개인 경우 생성자를 간편히 만들게 해준다. 

  - 생성자 내에서 해당 클래스의 다른 생성자를 호출한다.  

 

 

06-36.6. 클래스 Car는 name과 number를 필드로 가진다. Car 클래스에 다음과 같인 세 가지 종류의 생성자를 만들라.

  (1) 매개변수를 받지 않는 생성자: name은 이름 없음, number은 0으로 초기화

  (2) 매개변수로 String만 입력 받는 생성자: name을 입력받은 문자열로 지정하고  number는 0으로 초기화 한다.

  (3) 매개변수로 String과 int를 입력받는 생성자: name과 number를 입력받은 값으로 초기화한다. 

  Ex)

<hide/>


package javaStudy;
public class Car{
	// 형 + 필드명 
	String name;
	int number;
	
	public Car() {		
		this("이름없음", 0 );
	}	
	public Car(String name) {
		this(name, 0);
	}
	public Car(String name, int number) {
		this.name = name; 
		this.number = number;
		
	}
}
<hide/>

package javaStudy;
public class CarExam {
	public static void main(String[] args) {
		
		Car car1  = new Car();
		Car car2  = new Car("자동차");
		Car car3  = new Car("자동차", 1234);
		
		System.out.println(car1.name + " , " +car1.number );
		System.out.println(car2.name + " , " +car2.number );
		System.out.println(car3.name + " , " +car3.number );
	
	}
}

  Note)  반복하는 코드는 직접 사용하지 않고 this()를 이용해서 다른 생성자를 호출해야한다. 

 

'Java > 모두의 자바' 카테고리의 다른 글

Chapter 07-37 상속이란?  (0) 2022.02.08
Chapter 06-36 패키지  (0) 2022.02.07
Chapter 06-34 메서드 오버로딩  (0) 2022.02.07
Chapter 06-33 this  (0) 2022.02.07
Chapter 06-32 생성자  (0) 2022.02.07