상속(inheritance)이란?
상속(inheritance)이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미합니다.
이러한 상속은 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다.
상속을 이용하면 기존에 정의되어 있는 클래스의 모든 필드와 메소드를 물려받아, 새로운 클래스를 생성할 수 있습니다.
이때 기존에 정의되어 있던 클래스를 부모 클래스(parent class) 또는 상위 클래스(super class), 기초 클래스(base class)라고도합니다.
그리고 상속을 통해 새롭게 작성되는 클래스를 자식 클래스(child class) 또는 하위 클래스(sub class), 파생 클래스(derived class)라고도 합니다.
쉽게 말해 부모 클래스(상위 클래스)와 자식 클래스(하위 클래스)가 있으며, 자식 클래스는 부모 클래스를 선택해서, 그 부모의 멤버를 상속받아 그대로 쓸 수 있게 됩니다.
상속을 하는 이유는 간단합니다. 이미 마련되어 있던 클래스를 재사용해서 만들 수 있기 때문에 효율적이고, 개발 시간을 줄여주게 됩니다.
상속을 하더라도 자식 클래스가 부모의 모든 것들을 물려받는 것은 아닙니다.
- 부모 클래스의 private 접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없습니다.
- 부모와 자식 클래스가 서로 다른 패키지에 있다면, 부모의 default 접근 제한을 갖는 필드 및 메소드도 자식이 물려받을 수 없습니다.
(default 접근 제한은 ‘같은 패키지에 있는 클래스’만 접근이 가능하게끔 하는 접근 제한자이기 때문입니다.) - 그 이외의 경우는 모두 상속의 대상이 됩니다.
상속의 장점
중복된 코드를 줄일 수 있고(기존 클래스 재활용), 유지 보수가 편리하며, 통일성이 있고 다형성을 구현할 수 있다.
클래스 상속
상속을 받는 방법은 간단하다. 상속받을 자식 클래스 뒤에 extends 키워드를 사용하고 부모 클래스를 적어주면 된다.
상속받고자 하는 자식 클래스명 옆에 extends 키워드를 붙이고, 상속할 부모 클래스명을 적습니다.
자바는 다중 상속을 허용하지 않으므로, extends 뒤에는 하나의 부모 클래스만 와야 합니다.
즉, 1개의 부모 클래스로부터의 단일 상속만 허용된다. 하지만 부모 클래스는 여러 개의 자식 클래스에게 상속이 가능하다.
public Class Parent{ .... }; // 부모 클래스
public Class Child extends parent { .... }; // 자식 클래스
다음은 코드 예시입니다. (ParentBook 클래스를 ChildBook 클래스가 상속, 둘은 같은 패키지로 가정)
public class ParentBook{
String name; //필드
int price;
public void Print(){ // 메소드
System.out.println("책의 이름과 가격 : "+name+" "+price);
}
public class ChildBook extends ParentBook{
ChildBook (String name, int price){ // 생성자
this.name = name; // ChildBook이 ParetBook의 필드를 상속받아서 가능한 선언
this.price = price; // "
}
public static void main (String[] args){
ChildBook Child = new ChildBook("나의 라임오렌지 나무", 10000);
System.out.print("[구현 결과 1] ");
Child.Print();
}
[구현 결과 1] 책의 이름과 가격 : 나의 라임오렌지 나무 10000
이처럼 부모 클래스는 자식 클래스에 포함된 것으로 볼 수 있습니다.
따라서 부모 클래스에 새로운 필드를 하나 추가하면, 자식 클래스에도 자동으로 해당 필드가 추가된 것처럼 동작합니다.
자식 클래스에는 부모 클래스의 필드와 메소드만이 상속되며, 생성자와 초기화 블록은 상속되지 않습니다.
또한, 부모 클래스의 접근 제어가 private이나 default로 설정된 멤버는 자식 클래스에서 상속받지만 접근할 수는 없습니다.
'JAVA > 개념' 카테고리의 다른 글
자바(JAVA) : 추상 클래스, 메소드, 인터페이스, final, 오브젝트 (0) | 2022.01.04 |
---|---|
자바(JAVA) : this, this(), super, super() (0) | 2022.01.04 |
자바(JAVA) : this, this() (0) | 2022.01.02 |
자바(JAVA) : 클래스 (0) | 2022.01.02 |
JAVA 제어문 : 조건문(if) , 선택문(switch) (0) | 2021.12.31 |