들어가기 전
해당 내용은 자바의 신 3판을 읽고 내용 정리 및 공부한 내용을 정리한 글입니다!
자바의 신 Vol 1: 기초 문법편 | 이상민 - 교보문고
자바의 신 Vol 1: 기초 문법편 | 현장 전문가가 쓴 자바 기초 입문서다. NAVER, NHN, SKPlanet 등에서 성능 전문가의 풍부한 경험을 바탕으로 자바를 실무에 맞게 제대로 쓸 줄 알게 해주는 입문서를 목
product.kyobobook.co.kr
10장. 자바는 상속이라는 것이 있어요
1. 상속
상속은 부모 클래스에 선언되어 있는 public 및 protected 로 선언되어 있는 모든 변수와 메소드를
내가 갖고 있는 것 처럼 사용할 수 있다.
즉 다른 패키지에 선언된 부모 클래스의 접근제어자가 없거나 private로 선언된 것들은 자식 클래스에서 사용할 수 없다.
public class Parent {
public Parent() {
System.out.println("Parent Constructor");
}
public void printName(){
System.out.println("Parent printName()");
}
}
package hello.helloSpring.study;
public class Child extends Parent{
public Child() {
System.out.println("child Constructor");
}
}
package hello.helloSpring.study;
public class Inheritance {
public static void main(String[] args) {
Child child = new Child();
child.printName();
}
}
1. 실행하게 되면 부모클래스의 기본 생성자가 호출된다
2. 그 다음 자식 클래스의 생성자에 있는 내용이 수행된다.
그렇다면 아래와 같이 될 것이다.
Parent Constructor
child Constructor
Parent printName()
- 부모 클래스에서는 기본 생성자를 만들어 놓는 것 이외에는 상속을 위해서 아무런 작업을 할 필요는 없다.
- 자식 클래스는 클래스 선언 시 extends 다음에 부모 클래스 이름을 적어준다.
- 자식 클래스의 생성자가 호출되면 자동으로 부모 클래스의 매개변수 없는 생성자가 실행된다.
- 자식 클래스에서는 부모 클래스에 있는 public protected로 선언된 모든 인스턴스 및 클래스 변수와 메소드를 사용할 수 있다.
- extends 뒤에는 클래스를 하나만 써서 단일 상속밖에 안된다.
2. 상속과 생성자
자식 클래스에서는 모든 생성자가 실행될때 기본 생성자를 찾는다.
부모 클래스에 기본 생성자가 없다면 컴파일 시 자동으로 기본생성자를 만들어주지만,
만약 매개변수가 있는 생성자를 만들었을 경우에는 기본 생성자는 자동으로 만들어지지 않으며
기본 생성자가 없다는 오류가 발생한다.
이러한 경우엔 해결할 수 있는 방법은 두 가지이다.
1. 부모 클래스에 "매개변수 없는 " 기본 생성자를 만든다.
2. 자식 클래스에서 부모 클래스의 생성자를 명시적으로 지정하는 super()를 사용한다.
(1) super()
super()는 부모 클래스의 생성자를 호출한다는 의미이다.
부모 클래스에 매개변수가 있는 생성자만 있을 경우에는 super()를 이용해서 부모 생성자를 꼭 호출 해야한다.
그리고 자식 클래스의 생성자에서 super()를 명시적으로 지정하지 않으면, 컴파일시 자동으로 super()가 추가된다.
super()은 반드시 자식 클래스의 생성자에서 가장 첫줄에 선언되어야 한다.
// 기본생성자가 없는 부모 클래스
public class ParentArg {
public ParentArg(String name) {
System.out.println("ParentArg("+name+") Constructor");
}
public void printName() {
System.out.println("printName() - ParentArg");
}
}
// super()로 부모 생성자를 명시적으로 호출하는 자식 클래스
public class ChildArg extends ParentArg{
public ChildArg() {
super("ChildArg");
System.out.println("Child Constructor");
}
}
여기에서 super("ChildArg") 라고 지정하면, 부모 클래스의 생성자 중 String 타입을 매개 변수로 받을 수 있는 생성자를 찾는다. String을 매개 변수로 있는 생성자가 있기 때문에 이 생성자가 호출된다.
그런데, 만약 이 생성자처럼 참조 자료형을 매개 변수로 받는 생성자가 하나 더 있을 때
super(null) 이라고 호출하면 컴파일 시 오류가 발생한다. 관련해서 코드를 살펴보자.
public class ParentArg {
public ParentArg(String name) {
System.out.println("ParentArg("+name+") Constructor");
}
public ParentArg(InheritancePrint obj) {
System.out.println("ParentArg(InheritancePrint) Constructor");
}
public void printName() {
System.out.println("printName() - ParentArg");
}
}
public class ChildArg extends ParentArg{
public ChildArg() {
super(null);//오류발생
System.out.println("Child Constructor");
}
}
❗ 오류 발생 error: reference to ParentArg is ambiguous > super(null) ❗
부모 클래스에 참조 자료형인 String 과 InheritancePrint를 매개 변수로 잡는 생성자가 있으므로,
null을 넘겨주면 어떤 생성자를 찾아가야 하는지를 자바 컴파일러가 마음대로 정할 수가 없다.
따라서 super() 를 사용할 때에는 null을 넘기는 것보다는 호출하고자 하는 생성자의 기본 타입을 넘겨주는 것이 좋다.
3. 메소드 오버라이딩 Overriding
상속에서는 부모의 기능을 자식이 모두 포함한다고 볼 수 있다. (자식 클래스에서 일부 private로 선언된 기능은 제대로 활용할 수 없지만)
상속관계 보다 유연하게 활용하기 위한 메소드
'ON > 개발지식' 카테고리의 다른 글
[책리뷰] 자바의 신 3판 - 9장. 자바를 배우면 패키지와 접근 제어자는 꼭 알아야 해요 (0) | 2023.12.12 |
---|---|
[책리뷰] 자바의 신 3판 - 8장. 참조 자료형에 대해서 더 자세히 알아봅시다. (0) | 2023.12.11 |
[책리뷰] 자바의 신 3판 - 7장. 여러 데이터를 하나에 넣을 수는 없을까요? (0) | 2023.12.08 |
[책리뷰] 자바의 신 3판 - 6장. 제가 조건을 좀 따져요 (1) | 2023.12.07 |
[책리뷰] 자바의 신 3판 - 5장.계산을 하고 싶어요 (1) | 2023.12.05 |