본문 바로가기
Java

[Java] 상속에 관해서 / IS-A 관계 / HAS-A 관계 / extends / Annotation(애노테이션)이란? / @Override / @Deprecated

by bkuk 2022. 9. 28.

상속(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 특정 경고가 나타나지 않도록 함.

 

댓글