본문 바로가기
개발언어/JAVA

[Java]extends와 implements

by devebucks 2020. 7. 2.
728x90

 요즘 인프런에서 spring-boot 개념과 핵심 기능에 대한 강의를 듣고 있습니다. 한창 배우는데... extends와 implement는 쓰는데,,, 왜 쓰는 건지... 어떤 때에 써야 하는지 생각이 나지 않아서... 이번 기회에 정리를 해보려고 합니다.

 

 

extends와 implements는 뭘까요?

 

extends(상속)

 extends는 '상속'을 구현해 주는 키워드입니다. 부모 클래스가 가진 메소드나 변수를 자식 클래스가 물려 받아서 사용할 수 있게 합니다.

 

extends는 부모클래스가 가진 메소드나 변수를 자식클래스에서도 그대로 물려받아 사용할 수 있게 하기위해서 사용하는 것이었습니다. 고로! extends는 자식 클래스에 써주면 되는 것입니다. 단, 자식클래스에는 부모클래스 1개만 상속받을 수 있습니다.

 

extends를 사용할 수 있는 경우는 다음과 같습니다.

  • class가 class를 상속할 경우
  • interface가 interface를 상속할 경우

class가 interface를 상속받는 건 안됩니다.

 

 아래의 소스를 보면, 제가 임의로 만든 AccountRepository라는 interface가 스프링부트에서 제공하는 JpaRepository라는 interface를 상속받습니다. 

상속에 사용되는 JpaRepository는 PagingAndSortingRepositry를 또 상속받고 있네요. 

 

implements(상속, 구현)

반대로, implements는 부모객체에는 메소드나 변수를 선언만하고 기능적인 구현은 하지 않고, 자식클래스에서 선언만 된 메소드를 @Override로 구현(implements)해주는 것을 말합니다.

 

역시 자식 클래스에 implements 키워드를 적어주는 것으로 상속을 받게됩니다.

 

자식클래스에서 사용될 부모 클래스의 메소드는 반드시 @Override를 통해서 구현되어야 합니다.

 

의문점

AccountRepository를 @Autowired 주입받아서 스프링부트에 Bean으로 등록해서 사용하면 된다길래.. class에 AccountRepository를 implements로 상속받아서 사용할 수 있지 않을 까라고 생각을 해서 한번 적어나 봤더니... 에러가 발생했습니다.. 당연한 결과였습니다. 저는 AccountRepository에 아무런 선언도 해 놓지 않았기 때문에 에러가 발생한겁니다. AccountService.class에서는 JpaRepository를 상속받는 AccountRepository의 JpaRepository에서 이미 구현되어 있는 메소드(save()같은..)를 사용하면 될 뿐이었습니다. 

 

그러다면, 부모 메소드를 그대로 가져다 사용할 수 있는 extends를 통해 AccountRepository를 상속받는 다고 생각해보면 어떻게 될까요? 

.

.

.

정답은 "상속할 수 없다."입니다. class가 class를 상속하거나, interface가 interface를 상속할 때만이 extends를 통해서 상속(extends)을 할 수 있기 때문입니다.

 

그렇다면, 다른 클래스에서 상속말고 다른 클래스의 메소드나 변수를 사용할 수 있는 방법은 클래스에 객체(클래스)를 주입하는 방법입니다. 바로 @Autowired가 이 역할을 수행해 줍니다. 

필드를 통해서 의존성을 주입받습니다.

 

 

참고로, 블로그에 퀴즈의 답처럼 정리된 내용이 있어 공유합니다.

- extends는 일반 클래스와 abstract 클래스 상속에 사용되고, implement는 interface 상속에 사용된다.
- class가 class를 상속받을 땐 extends를 사용하고, interface가 interface 를 상속 받을 땐 extends 를 사용한다.
- class가 interface를 사용할 땐 implements를 써야하고interface가 class를 사용할 땐 implements를 쓸수 없다.
- extends는 클래스 한 개만 상속 받을 수 있다.
- extends 자신 클래스는 부모 클래스의 기능을 사용한다.
- implements는 여러개 사용 가능하다.
- implements는 설계 목적으로 구현 가능하다.
- implements한 클래스는 implements의 내용을 다 사용해야 한다.

출처: https://velog.io/@hkoo9329/%EC%9E%90%EB%B0%94-extends-implements-%EC%B0%A8%EC%9D%B4

 

 

 

 

참 기본적이면서도 간과하기가 쉬운 것이 자바 기본 개념이 아닌가 싶습니다. 사실은 가장 잘 알아야 하고, 기반을 다져놔야 하는 부분인데 말이지요. 책을 정독하면서 공부할 정도는 아니지만, 이렇게 공부를 하는 중간중간에 내 자신한테 질문을 했는데 내가 개념적으로 답을 할 수 없는 자바개념은 틈틈히 공부하는 것이 좋을 것 같습니다.

 

728x90

'개발언어 > JAVA' 카테고리의 다른 글

ObjectMapper  (0) 2020.08.08

댓글