Spring Boot를 공부하다 보면 상속개념을 자주 사용하게 되었다. 물론 강의를 들으면서 따라치다보니 깊은 고민없이 그냥 이렇게 동작하는구나 하고 이해했었다. 그러다 복습을 하던 와중에 인터페이스를 쓰는 걸지 궁금 해졌다. typescript에서는 interface가 자료형을 공유하여 협업에 도움을 주기 위함이던데 JAVA는 무엇때문에 쓰는걸까싶었다.
인터페이스의 사전적 정의는 아래와 같다.
서로 다른 두 개의 시스템, 장치사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다.
이게 무슨 말인가 싶다. 그럼 자바에서 인터페이스가 먼지 살펴보자
자바에서 인터페이스란 일종의 추상 클래스이다. 인터페이스는 추상클래스처럼 추상메서드와 상수를 갖지만 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버 변수를 구성원으로 가질 수 없다.
목적은 다른 클래스를 작성하는데 도움 줄 목적으로 작성된다.
즉, 클래스를 작성하기 위한 밑그림만 그려진 “기본 설계도” 정도로 이해하자
좀 더 풀어서 설명하자면 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 기본 설계도를 제공하는것이 인터페이스의 역할이자 개념이다. 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 유지보수를 쉽게 하기 위해 인터페이스를 사용한다.
이제 인터페이스를 예시를 보며 이해하자
public interface 인터페이스명 {
//상수
타입 상수명 = 값;
//추상 메소드
타입 메소드명(매개변수, ... );
//디폴트 메소드
default 타입 메소드명(매개변수, ... ){
//구현부
}
//정적 메소드
static 타입 메소드명(매개변수) {
//구현부
}
}
상수 : 인터페이스에서 고정된 값을 통해 고정값을 참조해서 사용해라 (강제적)
추상메소드 : 가이드만 제공하니 오버라이딩(재정의)해서 재구현해라 (강제적)
디폴트메소드 : 인터페이스에서 기본적으로 제공하지만, 원한다면 각자 구현해도 됨.(선택적)
정적메소드 : 인터페이스에서 제공하는 것만 사용할것 (강제적)
그럼 인터페이스는 알겠는데 어떻게 주로 사용하는가?
실제 인터페이스를 까보자. 얼마전에 배웠던 JpaRepository를 까본다. 나는 저번과정을 통해 인터페이스를 Autowired로 인스턴스화하여 findAll()함수를 바로 사용했다.
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
/*
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#findAll()
*/
@Override
List<T> findAll();
}
그럼 JpaRepository에서 선언된 findAll이 구현된 부분을 찾아간다. 그럼 SimpleJpaRepository 클래스에서 구현되었다는 것을 확인가능하다.
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
/*
* (non-Javadoc)
* @see org.springframework.data.jpa.repository.JpaRepository#findAll()
*/
@Override
public List<T> findAll() {
return getQuery(null, Sort.unsorted()).getResultList();
}
}
@NoRepositoryBean
public interface JpaRepositoryImplementation<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
......
}
JpaRepository.interface
JpaRepositoryImplementation.interface
SimpleJpaRepository.class (구현부) ⇒ 단, IoC 컨테이너에 올라가도록 어노테이션으로 올려줘야한다.
즉, 그럼 결국 JpaRepository는 JpaRepositoryImplementation에서 상속되고 SimpleJpaRepository클래스에서 구현되었다.
그래서 JpaRepository.interface에 존재하는 findAll 메소드를 호출하면 SimpleJpaRepository클래스에서 구현된 코드가 실행된다.
틈새 공부
extends와 implements는 머가 다른건가?
extends : 상속의 대표적인 형태다. 부모의 메소드를 그대로 사용가능하며 오버라이딩할 필요없이 구현되어 있는 것을 바로 사용가능하다.
implements : 부모의 메소드를 반드시 오버라이딩(재정의)해야한다. 아무래도 구현부에서 사용된다. 또한 다중상속을 지원한다.
래퍼런스
자바의 정석()
https://limkydev.tistory.com/197
'개발' 카테고리의 다른 글
JAVA의 스레드를 공부하자 (0) | 2022.02.26 |
---|---|
[TDD] 자바와 JUnit을 활용한 실용주의 단위 테스트 (작성중) (0) | 2022.02.24 |
[JUnit5] JUnit5를 공부해보자(Spring Boot, REST API) (0) | 2022.02.24 |
JAVA의 Servlet이 뭐지? (0) | 2022.02.19 |
OOP(Object-Oriented Programming, 객체 지향 프로그래밍)이 머냐? (0) | 2022.02.16 |