class Parent {
int a;
int b;
void play() {}
}
class Child extends Parent { //상속
int c;
}
위의 코드를 그림으로 그리면 아래와 같다.
class Human {
int age;
int name;
}
class Baby extends Human {}
class Point {}
class Circle {
Point p = new Point();
}
다른 객체지향언어인 C++에서는 클래스간의 다중상속을 허용한다. 다중상속을 허용하면 다중상속으로 인해 복합적인 여러 기능들을 가지는 클래스를 쉽게 작성할 수 있다는 장점이 있지만 클래스들 간의 관계가 복잡해지고, 서로 다른 클래스에서 상속받은 멤버들의 이름이 같을 경우에 이를 구별할 수 없다는 단점이 있다.
이런 이유로 자바에서는 단일상속만을 허용한다.
class Tv {}
class Audio {}
class TvAudio extends Tv, Audio {} //다중상속 -> 오류
위와 같이 코드를 작성하면 오류가 난다.
만일 두 개 이상의 클래스를 상속받고 싶다면,
상속받을 멤버의 비중이 가장 큰 클래스를 상속관계(extends)로 상속받고, 그 외의 클래스는 포함관계로 상속을 받으면 된다.
class Tv {}
class Audio {}
class TvAudio extends Tv {
Audio audio = new Audio();
}
Object클래스는 모든 클래스 상속계층도의 가정 최상위에 있는 클래스이다. 어떤 클래스가 상속받는 클래스가 없다면, 해당 클래스는 자동적으로 Object클래스를 상속받게 되어있다.
class Example {} //아래의 코드와 같다.
class Example extends Object {}
아래의 예시 코드를 보자.
class Tv {}
class SmartTv extends Tv {}
SmartTv클래스는 Tv클래스를 상속받는다. 그리고 Tv클래스는 Object클래스를 상속받는다.
그림으로 나타내면 아래와 같은 상속계층도로 나타낼 수 있다.
조상 클래스로부터 상속받은 메서드를 변경하는 것이다. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스에 맞게 변경시키기도 한다. 이럴 때 메서드 '오버라이딩'을 한다.
class Parent {
void ParentMethod() {}
}
class Child extends Parent {
void ParentMethod() {} //오버라이딩
void ParentMethod(int i) {} //오버로딩
}
오버라이딩과 오버로딩은 이름이 비슷해 헷갈릴 수 있다.
하지만 오버라이딩과 오버로딩은 그 차이가 분명하고, 서로 연관관계도 딱히 없다.
그 의미와 차이에 대해서 잘 알아두어야 한다.