상속(Inheritance)은 부모(Super) 클래스의 기능을 재사용하고 기능을 확장할 수 있는 객체지향 프로그래밍(OOP)의 특징이다.
상위 클래스의 기본 생성자를 호출하는 메서드.
public class A{
protected String a; // protected는 상속관계에서 하위클래스가
// 상위 클래스의 접근을 허용하는 접근 권한
private int b;
//...
}
public class B extends A{
public B(){
super(); // 명시적으로 써도 되지만, 생략한다면 컴파일러가 자동으로 삽입
// new Employee();
}
}
역할 부모 클래스의 생성자를 호출함으로써 부모 인스턴스를 생성한다.위치 생성자 메서드에서 가장 첫 문장에 사용해야 한다.생략가능 기본적으로 컴파일 시 자동으로 삽입된다.필요성 자식 인스턴스가 메모리에 생성되려면, 부모 인스턴스가 먼저 메모리에 생성되어 있어야 하기 때문이다. super()를 작성하고 이 구문으로 자식 클래스의 생성자가 호출될 때 부모 클래스의 인스턴스를 먼저 생성하게 하며, 이후 자식 클래스의 인스턴스가 생성되게 한다. Java에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현한다.
즉 부모(조상)클래스 타입의 참조변수로 자손클래스의 인스턴스 필드 or 메소드 (멤버)에 접근할 수 있다.
Animal ani = new Dog();
자식 인스턴스는 부모 클래스 타입으로 형변환이 가능하며, 그 반대는 불가능하다.
개은 동물이다 [⭕]동물은 개이다 [❌]Dog 클래스의 객체(의 참조값)가 Animal 클래스 변수 ani에 할당.
자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것
Animal a = new Dog();
Dog d = new Dog();
Animal ani;
ani = d;
ani.eat(); // "개처럼 먹다"
// ani.bark(); error
컴파일 시간의 처리 ani 변수는 Animal 클래스타입으로 선언되었지만, 실제로는 Dog 클래스의 객체를 참조하고 있으므로 Animal 클래스타입의 eat() 메소드를 호출하는 것이 아니라, 객체의 실제 타입인 Dog 클래스의 eat() 메소드를 호출하여 "개처럼 먹다"가 출력된다.런타임 처리 ani 변수가 Dog 클래스의 객체를 가리키고 있더라도, 변수의 선언 타입이 Animal 클래스 타입이므로 컴파일러는 Animal 클래스에 정의된 멤버만을 허용한다. 즉, 컴파일러는 ani 변수를 Animal 클래스의 참조로 간주하고 처리한다.자식클래스의 정보를 담을 수 있는 객체의 자료형이 부모클래스로 전환되어 있던 것(업캐스팅된 객체)을 다시 되돌리는 것을 의미
Animal ani = new Dog();
((Dog) ani).bark();
Dog dog = (Dog) ani;
타입을 변환하면 변수가 가리키는 객체의 실제 타입이 무엇인지 구별하기가 어렵다. 따라서 변수가 참조하는 객체의 실제 타입을 식별하도록 자바는
instanceof연산자를 제공한다.
instanceof 연산자는 변수가 해당 타입이나 자식 타입이라면 true를 반환하고 그렇지 않다면(부모타입이라면도 포함) false를 반환한다.