상속
상속은 자식 클래스가 부모 클래스의 기능을 그대로 물려받을 수 있는 것을 의미합니다. 자식 클래스는 부모 클래스를 선택하여, 그 부모의 필드와 메서드를 상속받아 그대로 사용할 수 있습니다.
상속 선언
class 자식클래스명 extend 부모클래스명 {
...
}
상속 선언 예제
package class01;
class A { // 기존에 있었던 클래스
// 부모 클래스, 상위 클래스
int a;
A() {
System.out.println("A() 생성자");
}
void funcA() {
System.out.println("a= " + this.a);
}
}
// 부모클래스에서는 자식클래스의 내용에 접근 xxx
// 자식클래스에서는 부모클래스의 멤버변수, 메서드에 접근 O
class B extends A { // 기존에 존재했던 클래스를 보고 추가로 구현한 클래스
// 자식 클래스, 하위 클래스
int b;
B() {
System.out.println("B() 생성자");
}
void funcB() {
System.out.println("b= " + this.b);
}
}
public class Test01 {
public static void main(String[] args) {
A aaa = new A(); // 객체화(인스턴스화)
aaa.a = 10; // aaa -> a, funcA()
B bbb = new B(); // bbb -> a, b, funcA(), funcB()
bbb.a = 22;
bbb.b = 20; //
aaa.funcA();
bbb.funcA();
bbb.funcB();
}
}
실행결과
super / super()
super
super 키워드는 부모 클래스로부터 상속받은 필드나 메서드를 자식 클래스에서 참조하는데 사용하는 변수입니다. 인스턴스 변수의 이름과 지역 변수의 이름이 같을 경우 this 키워드를 사용하여 구분할 수 있었던 것 처럼 마찬가지로 부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같을 경우 super 키워드를 사용하여 구별할 수 있습니다.
super()
super() 메서드는 부모 클래스의 생성자를 호출할 때 사용됩니다. 자식 클래스의 인스턴스를 생성하면, 해당 인스턴스에는 자식 클래스의 고유 멤버뿐만 아니라 부모 클래스의 모든 멤버까지도 포함되어 있습니다.
자바 컴파일러는 부모 클래스의 생성자를 명시적으로 호출하지 않는 모든 자식 클래스의 생성자 첫 줄에 자동으로 super() 메서드를 추가하여, 부모 클래스의 멤버를 초기화할 수 있도록 해줍니다. 하지만 자바 컴파일러는 컴파일 시 클래스에 생성자가 하나도 정의되어 있지 않아야만, 자동으로 기본 생성자를 추가해 줍니다. 만약 부모 클래스에 매개변수를 가지는 생성자를 하나라도 선언했다면, 부모 클래스에는 기본 생성자가 자동으로 추가되지 않을 것입니다.
class Parent {
int a;
Parent(int n) {
a = n;
}
}
만약 위 코드처럼 부모 클래스에 매개변수를 가지는 생성자를 하나라도 선언했다면, 부모 클래스에는 기본 생성자가 자동으로 추가되지 않을 것입니다.
class Parent {
int a;
Parent(int n) {
a = n;
}
}
class Child extends Parent {
int b;
Child() {
super();
b = 20;
}
}
위 코드처럼 Parent 클래스를 상속받은 자식 클래스에서 super() 메서드를 사용하여 부모 클래스의 기본 생성자를 호출하게 되면, 오류가 발생합니다. 왜냐하면 부모 클래스인 Parent 클래스에는 기본 생성자가 추가되어 있지 않기 때문입니다. 따라서 매개변수를 가지는 생성자를 선언해야 할 경우에는 되도록이면 기본 생성자까지 명시적으로 선언하는 것이 좋습니다.
class Parent {
int a;
Parent() {
a = 10;
}
Parent(int n) {
a = n;
}
}
class Child extends Parent {
int b;
Child() {
super();
b = 20;
}
}
GitHub
https://github.com/Qkrwnsgus0522/Java