♦ 자바의 상속(Inheritance)
상속의 특징
객체 간의 is a 관계가 성립되어야 한다.
부모클래스의 멤버(인스턴스 변수, 메소드)를 자식클래스가 선언 없이 사용가능하다. 단 private 접근지정자와 생성자는 상속되지 않는다.
자바는 단일 상속(Single Inheritance)만을 지원한다.
extends 키워드로 표현한다.
API 및 사용자가 만든 클래스들은 모두 상속 관계인 계층구조로 되어있다. 가장 상위에는 java.lang.Object 클래스가 있다. 따라서 모든 클래스는 Object 클래스를 상속받는다.
상속의 형식
public class 자식클래스명 extends 부모클래스명 { }
class AA { // 부모클래스 String name = "홍길동"; public String getName() { return name; } } class BB extends AA { // extends 키워드로 AA 클래스를 상속 int age = 23; public int getAge() { return age; } } public class Test01 { public static void main(String[] args) { BB bb = new BB(); System.out.println(bb.getName()); System.out.println(bb.getAge()); } }
상속과 생성자
생성자는 상속되지 않는다.
클래스를 객체 생성할 때에는 자동으로 부모클래스를 먼저 객체 생성 후에 자신의 클래스가 생성된다. 부모클래스가 먼저 생성되어야 자식 클래스가 부모클래스의 멤버를 사용할 수 있기 때문이다. 부모클래스를 객체 생성하기 위해서 자동으로 부모클래스의 기본생성자가 호출된다.
public class Test01 { public static void main(String[] args) { BB bb = new BB(); } } class AA { public AA() { System.err.println("AA 생성자"); } } class BB extends AA { public BB() { System.err.println("BB 생성자"); } }
super 키워드
this 키워드는 메모리에 올라간 자신의 인스턴스를 의미하고 super 키워드는 부모의 인스턴스를 의미한다.
상속관계의 자식클래스에서 부모클래스의 구성요소를 명시적으로 호출할 때 사용하다. 자동으로 자식클래스에서 부모클래스의 멤버를 사용할 수 있지만 특별한 목적으로 부모클래스의 멤버 및 생성자를 명시적으로 호출할 수 있다.
일반적으로 다음 2가지 경우에 사용한다.
1. 부모클래스의 멤버와 자식클래스의 멤버가 이름이 동일한 경우
class AA { String name = "홍길동"; } class BB extends AA { String name = "이순신"; public void getInfo() { System.out.println(super.name); // 홍길동 출력 System.out.println(this.name); // 이순신 출력 System.out.println(name); // 이순신 출력 } }
2. 자식클래스에서 명시적으로 부모클래스의 생성자를 호출하는 경우
class AA { String name; public AA(String name) { this.name=name; } } class BB extends AA { public BB(String name) { super(name); // 부모클래스의 생성자 호출 } }