상속
상속은 현실의 재산 물림과 유사하다. 재산 물림에 있어서 부모와 자식이 있다면, 이곳에는 부모 클래스와 자식 클래스가 있다.
'~(자식 클래스)는 ~(부모 클래스)하다' 혹은 '~(자식 클래스)는 ~(부모 클래스)의 종류 중 하나이다'의 관계를 성립하는 것을 상속이라고 한다.
자식 클래스가 부모 클래스와 상속 관계가 형성되는 과정에서 자식 클래스는 부모 클래스의 필드와 메소드를 물려받는다.
이러한 방식은 중복을 줄이고 다형성 등의 장점이 있지만, 결합도가 높다는 단점을 가지고 있다.
잘못 사용하면 문제가 커지기 때문에 반드시 사용해야할 때에만 사용하는 것이 좋다.
추가로 아무것도 상속받지 않은 클래스는 java.lang.Object를 상속 받는다. (즉, 모든 클래스는 Object의 자손이다.)
상속의 선언
(class 자식클래스 extends 부모클래스)
상속 관계
기본적으로 상속은 '일반화 + 확장' 의 형태를 띈다.
여기서 일반화란 "자식 클래스들을 부모클래스로 부를 수 있는 것"을 뜻한다.
예를 들어 컴퓨터는 컴퓨터라고 부를 수도 있지만 전자제품이라고 부를 수 있고, 스피커도 스피커라고 부를 수 있으나 전자제품이라고도 부를 수 있다.
전자제품이 부모클래스와 같고, 컴퓨터와 스피커는 자식클래스와 같다고 볼 수 있다.
전자제품은 "전기를 이용해 동작한다"라는 메소드를 가지고 있다면, 컴퓨터와 스피커 역시 동일한 메소드를 가지고 있다.
다만, 컴퓨터는 "연산처리를 한다"라는 메소드, 스피커는 "소리를 발생시킨다"라는 메소드를 부모 메소드에서 '확장'하여 가지고 있다.
그렇기에 자식 클래스는 부모클래스를 참조할 수 있다.
또한, 부모 클래스 역시 부모타입으로 자식타입을 참조할 수 있다.
class ParentClass{
public void a() {
System.out.println("부모");
}
}
class ChildClass extends ParentClass{
public void b() {
System.out.println("자식");
}
}
public class test {
public static void main(string[] args) {
ChildClass child = new ChildClass();
child.a(); //(O)
child.b(); //(O)
ParentClass parent = new ParentClass();
parent.a(); // (O)
parent.b(); // (X)
}
}
다만, 위와 같이 부모타입으로 자식 클래스를 참조했을 경우, 부모 클래스에는 존재하지 않는 메소드를 사용하면 에러가 발생한다.
그럼에도 이러한 방식의 참조를 사용하는 이유는 기능을 조건에 맞게 제한하기 위해서이다.
자식 클래스의 일부 메소드는 사용하지 않으니 굳이 분석할 필요가 없어지기 때문에 필요하다.
'Java > Base' 카테고리의 다른 글
[JAVA] 생성자 (0) | 2023.08.17 |
---|---|
[JAVA] getter(), setter() (0) | 2023.08.08 |
[JAVA] 다형성 - 메소드 오버라이딩(Method Overridng) (0) | 2023.08.08 |
[JAVA] 클래스 다이어그램 (0) | 2023.08.01 |
[JAVA] Java 이해하기 (0) | 2023.08.01 |