일반 적으로 상속은 부모가 자녀에게 해준다 라고 생각을 하지만, 자바에서는 자녀의 입장으로 생각해야한다. → 자녀가 부모에게 상속을 받는다.
부모의 메서드, 변수 등을 모두 상속 받고, 자녀만의 새로운 메서드를 생성 할 수 있고, 부모의 메서드를 재정의 할 수도 있다.
부모클래스 (상위 클래스)
자녀클래스 (하위 클래스)
class Children extends Parents{}
자녀클래스의 클래스 선언에 extends + 부모 클래스의 이름을 붙여 부모클래스를 상속 받을 수 있다.
단, 여러 클래스를 동시에 상속받을 순 없다! 하지만 클래스와 인터페이스를 동시에 받을 수 있고, 인터페이스는 다중 구현이 가능하다.
패키지가 달라도 상속이 가능하지만, 제어자에 따라 모든 변수 및 메서드를 전부 상속 받지 못할 수 있다.
접근 제어자 | 상속 가능 경로 |
---|---|
public | 외부 클래스 어디서나 가능. |
private | 같은 클래스 안에서만 가능(상속받는 클래스와 클래스가 같을 순 없음으로 사실상 상속이 불가능하다.) |
default(제어자가 없을때) | 같은 패키지 안에서만 가능. |
protected | 같은 패키지 안에서만 가능. 상속관계가 아닌 클래스는 사용할 수 없다. |
특정 변수 혹은 메서드를 아무데서나 사용이 되지 않도록 보안(?)하고 싶지만, 상속을 해야할 때는 protected 제어자를 사용해주어 상속 받지 않은 모든 클래스에서는 사용할 수 없도록 만들어주면 된다!
한 클래스가 다른 클래스를 상속 받는 동시에, 인터페이스를 구현할 수도 있다.
public class A extends B implements C {
}
한 클래스가 여러 클래스를 동시에 상속 받을 순 없지만, 한 클래스가 여러 인터페이스를 구현할 수 있다.
public class A implements C, D, E {
}
super 예약어는 , 자식클래스에서 부모 클래스로 접근을 할때 사용한다.
주로 생성자를 만들때 사용하는데 , 이유는 이러하다
⇒ 클래스에 생성자를 따로 만들지 않아도, 자바에서 자동으로 디폴트 생성자를 만든다.
그런데, 상속을 받은 자녀클래스가 생성자를 만들때 컴파일러에서 자동으로 부모클래스의 디폴트 생성자를 자녀클래스의 디폴트 생성자의 최상단에 추가를 한다.
⇒ 부모클래스에서 생성자를 따로 생성했다면 해당 생성자가 자동으로 추가가되는데 , 이 과정에서 super 예약어를 사용해주어야한다.
보통 하던 방식으로 하게 되면 에러가 사라지지 않을 것 이다...
자식클래스로 인스턴스를 생성할 때, 이 클래스의 자료형을 부모클래스로 형변환할 수 있지만, (=업캐스팅(upcating)) 반대로 부모클래스로 인스턴스를 생성할 때 자식클래스로 형변환은 불가능하다. → 자식은 부모의 모든걸 담고 있지만 , 부모는 자식이 +@ 시킨 성질을 가지지 못하기때문.
Parents p = new Cildren(); => 묵시적 형변환 가능. 업캐스팅.
Cildren c = new Parents(); => 불가능.
(자료형) 변수명 = 인스턴스생성자;
오버라이딩 ⇒ 자식클래스가 상속받은 부모 클래스의 메소드를 재정의 하는 것.
(@ 는 애노테이션을 나타내주는 표시)
오버라이딩의 조건!
→ 부모 클래스의 메소드와 이름이 같아야 합니다.
→ 부모 클래스의 메소드와 매개변수가 같아야 합니다.
→ 부모 클래스의 메소드와 반환타입이 같아야 합니다.