클래스의 상속 - 상속의 기본

클래스의 상속 - 상속의 기본

"연관된 일련의 클래스들에 대한 공통적인 규약을 정의할 수 있다."

상속의 이유와 목적을 물어본다면 다음과 같이 답할 수 있다. 상속은 단순히 코드의 재활용 목적으로 사용하지 않으며 만약 그렇게 사용할 경우 무의미하게 코드가 복잡해지고 제대로 활용하지 못하는 상황을 경험할 수 있다.

※ 상속의 가장 기복적인 특성

UML 기호로 상속 관계를 표현한 예시를 들어보자면 위와 같다.

상속의 대상이 되는 클래스 : 상위 클래스, 기초 클래스, 부모 클래스

상속을 하는 클래스 : 하위 클래스, 유도 클래스, 자식 클래스

※ 상속과 생성자

하위 클래스의 인스턴스 생성 시 상위 클래스, 하위 클래스의 생성자 모두 호출된다.

하위 클래스의 인스턴스 생성 시 상위 클래스의 생성자가 먼저 호출 된다.

즉, 하위 클래스의 생성자에서 사위 클래스의 생성자를 명시적(super())으로 호출하지 않으면, 인자를 받지 않는 생성자가 자동으로 호출된다.

import java.io.*; import java.util.*; // 좋은 스킬 흡수하기 public class Main { public static void main(String[] args) throws IOException { new SubCLS(); new SubCLS(1); new SubCLS(1,2); } } class SuperCLS{ public SuperCLS(){ System.out.println("super1"); } public SuperCLS(int i){ System.out.println("super2"); } public SuperCLS(int i, int j){ System.out.println("super3"); } } class SubCLS extends SuperCLS{ public SubCLS(){ System.out.println("sub1"); } public SubCLS(int i){ super(i); System.out.println("sub2"); } public SubCLS(int i, int j){ System.out.println("sub3"); } }

super1 sub1 super2 sub2 super1 sub3

위 예제에서 확인해 볼 수 있듯이 하위클래스에서 명시적으로 상위 클래스의 생성자를 호출하지 않으면 하위 클래스에서는 인자를 받지 않는 상위 클래스의 디폴트 생성자를 호출하게 된다. 즉, 항상 명시적 호출이 없으면 super() 존재한다고 생각하면 쉽다.

※ 상속 관계에 있는 두 클래스의 적절한 생성자 정의

자바는 상속 관계에 있을지라도, 상위 클래스의 인스턴스 멤버는 상위 클래스의 생성자를 통해서 초기화하도록 유도하고 있다. 물론 하위 클래스에서 초기화 시킬수도 있지만 말이다.

※ 단일 상속만을 지원하는 자바

자바는 프로그램이 과도하게 복잡해지는 것을 막기 위해 단일 상속만을 지원한다. 즉, 하나의 클래스가 상속할 수 있는 클래스는 최대 1개 라는 뜻이다. 물론 상속의 깊이를 더하는 것은 얼마든지 가능하다.

※ static 은 상속의 대상이 아니다.

static은 인스턴스 생성과 상관없이 접근이 가능하다. 즉, 상속의 대상이 아니다.

from http://sweet-smell.tistory.com/151 by ccl(A) rewrite - 2021-12-09 16:01:56