Java/모두의 자바

Chapter 07-40 super과 부모 생성자

계란💕 2022. 2. 8. 21:49

07-40.1 super 키워드

 

  Def) super 키워드: 부모 객체를 나타낸다.

  - 자식이 부모의 메서드나 필드를 이용할 때도 쓸 수 있다.

 

  (1) 기본 생성자를 하나 가지는 Car클래스이다. 

<hide/>

package javaStudy;
public class Car{
	public Car() {
		System.out.println("Car의 기본 생성자입니다. ");
	}
}

 

  (2) Car클래스를 상속받는 Truck클래스를 만들고 기본 생성자를 하나 추가한다.

<hide/>
package javaStudy;
public class Truck extends Car {
	public Truck() {
		System.out.println("Truck의 기본 생성자입니다.");
	}
}

 

  (3) TruckExam클래스를 하나 더 만든다.

<hide/>
package javaStudy;

public class TruckExam {
	public static void main(String[] args) {
		Truck t = new Truck();
	}
}

  Note) 출력 결과:

  - 만약 Car객체를 만들고 실행했다면 Car의 기본 생성자가 출력될 것이다. 

  -  Truck의 객체를 만들고 실행했는데 Truck의 생성자 뿐만 아니라 Car의 기본 생성자까지 출력됐다.. 

  - 그리고 Car의 기본 생성자가 먼저 출력됐다. 

  - new라는 키워드로 Truck을 생성하면 이 Truck이 메모리에 올라갈 때(트럭이 인스턴스화 될 때)

  - 부모인 Car객체도 인스턴스화된다.  

  - Car객체가 생성되어야만 Truck객체도 생성된다. 

  - 생성자는 객체를 포기화된다. 

  - 생성자가 호출될 때 자동으로 부모의 생성자가 호출되면서 부모 객체를 초기화한다.

  - 부모 객체를 호출할 때, "super"라는 키워드를 사용한다.

  - super()를 붙이면 부모 생성자가 호출된다. 

  

  (4)

<hide/>

package javaStudy;

public class Truck extends Car {
	public Truck() {
		super();
		System.out.println("Truck의 기본 생성자입니다.");
	}
}

  - super라는 키워드를 추가해서 실행해도 앞선 출력 결과와 같다. 

  - 나를 가리키는 키워드가 "this"였다면 부모를 가리키는 키워드는 "super"이다.

 

 

07-40.2 super키워드를 쓰는 이유는?

 

  - 프로그래머가 직접 호출하지 않아도 컴파일러가 자동으로 호출하는데 왜 super가 쓰일까?

  -  코드를 수정하여 다시 확인한다.

  - super키워드를 주석 처리한다. 

<hide/>

package javaStudy;

public class Truck extends Car {
	public Truck() {
//		super();
		System.out.println("Truck의 기본 생성자입니다.");
	}
}

  - Car클래스에는 기본 생성자를 없애고 Car이름을 받는 생성자를 추가한다.

<hide/>
package javaStudy;
public class Car{
	public Car(String name) {
		System.out.println("Car의 name 생성자입니다. ");
	}
}

  - Truck 클래스를 다시 확인한 결과 에러가 발생했다.

  - Truck 객체가 생성되기 위해서는 반드시 부모 객체가 먼서 생성되야 하는데

  - 부모의 생성자를 직접 호출하지 않으면 컴파일러는 기본 생성자만 호출한다.

  - 그런데, 부모 클래스에 기본 생성자가 없으므로 Truck클래스에 에러가 난다. 

  - super 키워드를 이용해서 직접 생성자를 호출해야 에러가 발생하지 않는다.

<hide/>
package javaStudy;

public class Truck extends Car {
	public Truck() {
		super("트럭");
		System.out.println("Truck의 기본 생성자입니다.");
	}
}

  - 주석문을 삭제하고 트럭을 추가하면 TruckExam에서 에러가 나지 않는다. 

 

 

07-40.3 super와 부모 생성자 실습 

Bus 클래스는 Car클래스의 자식클래스이다. Bus클래스의 생성자는 name(이름), number(차량번호), fee(요금)을 입력 받아 초기화 된다. 부모 클래스의 생성자를 이용해서 Bus클래스의 생성자 name과 numbe를 초기화한 다음 fee를 초기화하라.

<hide/>

package javaStudy;
public class Car{
	String name;
	int number;

	public Car(String name, int number) {
		this.name = name;
		this.number = number;
	}
}
<hide/>


package javaStudy;

public class Bus extends Car {
	int fee;
	public Bus( String name, int number, int fee) {
// 정답:		super(name, number);
		this.fee = fee;
	}
}

   -  실행 위한 코드

<hide/>

package javaStudy;

public class BusExam {

	public static void main(String[] args) {
		
		Bus bus = new Bus("뛰뛰", 3000, 1050  );
		
		if( bus.name != "뛰뛰" ) {
			System.out.println("bus의 name이 다릅니다.");
		}
		else if( bus.number != 3000) {
			System.out.println("bus의 number가 다릅니다.");
		}
		else if( bus.fee != 1050) {
			System.out.println("bus의 fee가 다릅니다.");
		}
		else {
			System.out.println("정답입니다.");
		}
	}
}

  Note) 실행 결과: 정답입니다.

  - super.필드명 , super.메서드명()으로 부모의 필드나 부모의 메서드에 접근 가능하다. 

  - 생성자도 오버라이드가 가능하므로 매개 변수에 따라서 생성자를 여러 개 정의 가능하다. 

  - super()를 호출할 떄 인자로 무엇을 넣어주는냐에 따라 알맞은 생성자를 호출할 수 있다.

 

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

Chapter 07-42 클래스 형변환  (0) 2022.02.09
Chapter 07-41 오버라이딩(Overriding)  (0) 2022.02.08
Chapter 07-39 추상 클래스  (0) 2022.02.08
Chapter 07-38 접근 제한자  (0) 2022.02.08
Chapter 07-37 상속이란?  (0) 2022.02.08