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 |