서브 클래스의 객체는 슈퍼 클래스의 멤버를 모두 가지고 있다. 또한 슈퍼 클래스의 멤버로 취급할 수 있고 슈퍼 클래스의 객체로 취급할 수 있다.
사람은 생물이다.
class Person {}
class Student extends Person {}
Student s = new Student();
Person p = s; // 업캐스팅, 자동 타입 변환
업캐스팅은 서브 클래스 객체를 슈퍼 클래스 타입으로 타입 변환하는 것을 말한다.
업캐스팅된 레퍼런스에 대해 객체 내에 슈퍼 클래스의 멤버만 접근 가능하다.
이미지 출처 : 명품 Java Programming
서브클래스인 Student 의 객체라면 슈퍼 클래스의 멤버와 서브 클래스의 멤버를 모두 접근 가능한데 업캐스팅이 되면 슈퍼 클래스의 멤버만 접근할 수 있다.
다운캐스팅은 슈퍼 클래스 객체를 서브 클래스 타입으로 변환하는 것을 말한다. 이때 명시적인 타입 변환이 필요하다.
class Person {} // 슈퍼 클래스
class Student extends Person {} // 서브 클래스
Person p = new Student("이재문"); // 업캐스팅
Student s = (Student)p; // 다운캐스팅, (Student) 의 타입 변환 표시가 필요하다.
이미지 출처 : 명품 Java Programming
인터페이스는 클래스가 구현해야 할 메소드들이 선언되는 추상형을 말한다.
interface
키워드로 선언할 수 있다.
~ java 7 - 상수, 추상 메소드로만 구성
java 8 ~
- default 메서드 포함 ( java 8 )
- private 메서드 포함 ( java 9 )
- static 메서드 포함 ( java 9 )
단, 필드(멤버 변수) 는 선언할 수 없다.
public interface GameConsoleInterface {
public static final int TIMEOUT = 10000; // 상수 필드 public static final 생략 가능
public abstract void up();
void down(); // 추상메소드 public abstract 생략 가능
void left();
public default void right() { // default 메서드 public 생략 가능
System.out.println("");
};
}
인터페이스만으로는 객체를 만들 수 없다.
new GameConsoleInterface(); // 불가, 오류 발생
인터페이스 타입의 레퍼런스 변수는 선언할 수 있다.
GameConsoleInterface console;
인터페이스를 상속받는 클래스는 인터페이스의 모든 추상 메소드를 반드시 구현해야 한다.
다른 인터페이스를 extends 로 상속 가능하다.
인터페이스는 다중 상속이 가능하다.
interface MobileInterface extends PhoneInterface {}; // 인터페이스가 다른 인터페이스 상속시 extends
interface MP3Interface {};
interface MusicPlayerInterface extends MobileInterface, MP3Interface {}; // 다중 상속
인터페이스는 상속받은 클래스들이 기능을 서로 다르게 구현할 수 있도록 하여 클래스의 다형성을 실현할 수 있다.
// 클래스에서 사용시 상속될 수 없음을 의미. final class ... => 상속 불가
// 메소드에서 사용시 오버라이드될 수 없다.
// 변수에서 사용시 수정될 수 없다.