상속(inheritance)이란?
상속은 우리가 일반적으로 알 듯 무엇인가를 물려받는다는 의미입니다.
부모에게 재산을 상속받으면 상속받은 재산을 자신의 것으로 사용할 수 있듯,
B 클래스가 A 클래스를 상속받으면 B 클래스는 A 클래스의 멤버 변수와 메서드를 사용할 수 있습니다.
클래스 상속 문법
상속을 구현할 때는 extends 예약어를 사용합니다.
아래 코드는 'B 클래스가 A 클래스를 상속받는다' 라고 말하며,
A 클래스가 가지고 있는 속성이나 기능을 추가로 확장하여 B클래스를 구현한다는 뜻으로 생각하면 됩니다.
class B extends A {
}
그렇다면, 객체지향 프로그래밍에서는 상속을 언제 사용할까요?
두가지 관계를 설명드리겠습니다.
상속은 IS-A 관계에서 사용하는 것이 좋습니다.
IS-A 관계(is a relationship, inheritance)의 일반적인 개념과 구체적인 개념의 관계입니다.
car는 vehicle이다.
truck은 vehicle이다.
bus는 vehicle이다.
상속을 사용함으로써 코드의 재활용, 유지보수의 편리성 등의 장점이 존재하는 건 분명하나
관련이 없는 클래스들을 상속 관계로 사용하는 것은 바람직하지 않습니다.
HAS-A 관계에서는 상속을 사용하지 않습니다.
HAS-A(has a relationship, inheritance)는 일반적인 포함 관계입니다.
다른 클래스의 기능(변수 또는 메서드)을 사용합니다.
아래 그림은 자동차에 조립되어 있는 부품들을 표현한 사진입니다.
아래 상속에 관한 예제 코드를 보겠습니다.
상위 클래스에는 멤버변수와, 메서드가 존재합니다.
package com.packc;
public class Parent {
public String p1 = "Parent";
public void viewParent() {
System.out.println("Parent viewParent 호출");
}
}
하위 클래스에도 멤버변수와 메서드가 존재합니다.
package com.packc;
public class Child1 extends Parent {
public String c1 = "Child1";
public void viewChild1() {
System.out.println("Child1 viewChild1 호출");
}
}
상속을 받은 하위 클래스에서 상위 클래스의 메서드를 호출했습니다.
그 결과, 정상적으로 상위 클래스의 메서드가 호출된 것을 확인했습니다.
package com.packc;
public class InheritanceEx01 {
public static void main(String[] args) {
// 상위 클래스(parent)를 상속받은 하위 클래스(child1)의 인스턴스 생성
Child1 c1 = new Child1();
// 하위 클래스의 메서드 호출
c1.viewChild1();
// 하위 클래스의 인스턴에서 상위 클래스의 변수 호출
System.out.println(c1.p1);
// 하위 클래스의 인스턴에서 상위 클래스의 메서드 호출
c1.viewParent();
}
}
Annotation(애노테이션)이란?
자바를 사용하다보면, 위와 같이 주석처리된 문구를 볼 수 있습니다.
이는 자바에서 제공하는 애노테이션으로, 컴파일러에게 특정한 정보를 제공해 주는 역할을 합니다.
위 사진에 표시된 @Override은 이 메서드가 재정의된 메서드임을 컴파일러에게 알려 주는 기능입니다.
만약 메서드의 선언부가 다르다면 컴파일 오류가 발생하여 개발자의 실수를 막아줍니다.
애노테이션 | 설명 |
@Override | 재정의된 메소드라는 정보 제공 |
@FunctionalInterface | 함수형 인터페이스라는 절보 제공 |
@Deprecated | 이후 버젼에서 사용되지 않을 수 있는 변수,메서드가 사용되었다는 정보 제공 |
@SuppressWarnings | 특정 경고가 나타나지 않도록 함. |
'Java' 카테고리의 다른 글
[Java] 메서드 재정의 / 오버라이딩 / overriding (0) | 2022.09.29 |
---|---|
[Java] this에 관해서 (0) | 2022.09.28 |
[Java] static 변수에 대해서 / 클래스 멤버 변수 / 인스턴스 멤버변수 (0) | 2022.09.28 |
[Java] 얕은 복사에 자세히 알아보면? / Shallow Copy (0) | 2022.09.28 |
[Java] 가변 인자 / String ... args / 인자(argument) 여러 개 (0) | 2022.09.27 |
댓글