[Java] 상속 Inheritance (추상 클래스, 인터페이스)

dustle·2022년 11월 30일
1

상속이란 자식 클래스가 부모 클래스의 기능을 그대로 물려받을 수 있는 기능입니다.

자바는 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있어 클래스 다중 상속을 지원하지 않습니다.
(인터페이스 다중 구현은 가능합니다. 인터페이스에서 implements는 상속이 아닌 구현이라 합니다.)

추상 클래스

추상 클래스는 클래스 내 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우 입니다.
추상 클래스의 경우 인터페이스처럼 클래스에서 상속을 받는다면 추상 메소드가 있을경우 모두 구현해야 합니다. 어떤 클래스가 추상 클래스를 상속 받을 때는 extends를 사용합니다.

clss Dog extends Animal {

}

인터페이스

인터페이스는 모든 메소드가 추상 메소드로 정의되어있습니다.
Java 8 이후 defalut 키워드로 구현부가 존재하는 메소드를 만들 수 있고 static 메소드와 상수(static final 형태)도 선언 할 수 있게 되었습니다.

clss Genesis implements Car {

}

Java 8 이후 인터페이스의 기능이 추상 클래스와 유사한 기능을 하게 되었는데, 차이가 무엇일까?

추상 클래스가 상속 받아서 기능을 확장하는 것과 다형성에 목적이 있다면,
인터페이스는 구현을 강제하기 때문입니다.

추상 클래스는 부모 클래스의 기능을 확장합니다. IS-A 관계를 가진 클래스에서 메소드 오버라이딩을 통해 메소드를 확장할 수 있습니다.

인터페이스는 빈 메소드를 모두 구현해야 하기 때문에 동일한 동작을 약속하기 위해 존재합니다(설계도).
또한 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화가 가능합니다.


제가 JPA 를 쓰는데요.. 분명 인터페이스인데 extends가 있어요

public interface FavoriteTrailRepository extends JpaRepository<FavoriteTrail, Long> {
    Optional<FavoriteTrail> findByMemberAndHikingTrail(Member member, HikingTrail hikingTrail);
    List<FavoriteTrail> findByMemberAndHikingTrailIn(Member member, List<HikingTrail> hikingTrails);
    void deleteAllByMember(Member member);
}

인터페이스를 공부하는 중 분명 JpaRepository 는 인터페이스라는 기억이 있는데 extends를 써서 찾아보았습니다.

인터페이스끼리의 상속은 extends를 사용합니다. 물론 인터페이스이므로 다중 상속도 가능합니다.
implements는 구현하다라는 뜻을 가지고, 상속받은 인터페이스에서는 구현할 필요가 없으니 extends를 사용한다라고 외우면 편할 것 같습니다.

그 외의 경우에는 클래스를 상속받는 경우 extends 인터페이스를 상속받는 경우 implements를 사용합니다.

결론

인터페이스가 자바 8 이후로 구현이 가능해지며 추상 클래스와의 기능 차이가 명확하지 않은 것 같습니다. 하지만 인터페이스와 추상 클래스는 목적에서의 차이가 분명하기 때문에 구현 목적에 맞게 사용하면 좋을 것 같습니다.

2개의 댓글

comment-user-thumbnail
2022년 11월 30일

좋은 정보에요..!

1개의 답글