슬기로운슬기

인터페이스 (interface)

  • 일종의 추상화 클래스
  • 추상메서드와 상수만을 멤버로 가질 수 있음
  • 추상클래스를 부분적으로 완성된 ‘미완성 설계도’라면 인터페이스는 밑그림만 그려져 있는 ‘기본 설계도’
  • 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다고 생각
interface 인터페이스이름 {
	public static final 타입 상수이름 = 값;
	public abstract 메서드이름(매개변수목록);
}
  • public static final, public abstarct 만 사용할 수 있으며 생략 가능

 

인터페이스 상속

  • 인터페이스는 인터페이스로부터만 상속받을 수 있음
  • 다중 상속이 가능
  • 클래스와 달리 Object클래스와 같은 최고 조상이 없음
interface PostRepository extends JpaRepository<Post, Long>, PostRepositoryQuery
  • JpaRepository와 PostRepositoryQuery는 interface

 

인터페이스 구현체

  • 인터페이스를 구현한 클래스는 해당 인터페이스에 정의된 모든 메서드를 반드시 구현해야 함
    • 인터페이스의 메서드 중 일부만 구현한 경우 abstract를 붙여 추상클래스로 선언해야함
  • 인터페이스를 구현한 클래스는 키워드 implements를 사용

public class PostServiceImpl implements PostService {}
  • 인터페이스를 구현한 클래스에 메서드를 오버라이드할 때 @Override를 붙이자.  -> 선택사항이지만 사용하는 것이 더 코드를 안전하고 이해하기 쉽게 만들어줌
    1. 오타나 메서드 시그니처 오류 방지
      • 자바 컴파일러가 해당 메서드가 실제로 상위 클래스나 인터페이스의 메서드를 오버라이드하고 있는지 확인할 수 있음
      • 만약 메서드 이름이나 시그니처가 잘못된 경우 컴파일 오류가 발생하여 오류를 빨리 발견할 수 있음
    2. 코드 가독성 향상
      • 상속 구조가 복잡하거나 여러 인터페이스를 구현한 경우 유용함
    3. 버전 호환성
      • 이전 버전과의 호환성 보장
      • 새로운 버전에서 추가된 메서드를 오버라이드할 때 이름이나 시그니처가 변경된 경우, 컴파일러가 오류를 감지할 수 있음
    4. IDE 지원
      • IDE(통합 개발 환경)은 **@**Override 어노테이션을 활용하여 개발자가 오버라이드하고자 하는 메서드를 쉽게 찾을 수 있도록 도와줌

 

인터페이스 구현체 사용이유(인터페이스 사용 목적)

  1. 같은 특성의 뼈대를 동일하게 유지해서 코드의 일관성을 유지하기 위함
    • 만약 car라는 인터페이스에 자동차의 기능인 stop() , go(),  openTheDoor(), closeTheDoor() 이 있음 (필수 뼈대를 만들어 놓음)
    • class 아반떼 impliments car , class 소나타 impliments car로 구현→ 소스가 car라는 동일한 특성들은 일관성있게 유지하게 됨
    • : 기본기능은 오버라이드를 통해서 뼈대를 재구현하고 각 차들의 특별한 기능도 추가로 구현할수 있게 됨
  2. 느슨한 결합을 만들기 위함
    • 구현체와 호출자(사용자)간의 관계가 인터페이스로 추상화되어, 호출자는 인터페이스의 메서드를 호춤함으로써 구현체의 내부 동작 방식에 대해서 알 필요가 없음
    • 구현체의 내부가 변경되더라도 호출자는 영향을 받지 않음. 호출자는 인터페이스의 메서드만 신경쓰면 되기 때문에, 새로운 구현체를 손쉽게 교체하거나 추가할 수 있음

 

Spring - Controller 와 Service

@RestController
@RequiredArgsConstructor
public class PostController {
  private final PostService PostService;
}
public class PostServiceImpl implements PostService {}
  • Service 인터페이스에 정의된 모든 메서드를 ServiceImpl에서 구현
  • → PostController 클래스에서는 Service 인터페이스 타입의 객체를 파라미터로 받음: 자바에서의 다형성의 개념
  • → Service의 메서드를 호출할 수 있게 됨
  • → ServiceImpl 객체는 Service 인터페이스의 타입을 가지고 있기에 Service 인터페이스에 정의된 메서드들을 사용 가능
반응형
profile

슬기로운슬기

@스를기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!