Interface vs Abstract

0

JAVA

목록 보기
3/18
post-thumbnail

기존 다른 분들께서 작성한 포스팅들 중에서 이해하기 좋은 interface와 abstract에 대해 작성되어 있는 부분을 참고하여 저 나름대로 정리하고자 합니다.

Interface

  • 부모 자식 관계인 상속 관계에 얽메이지 않는다
  • 공통 기능이 필요할 때, Abstract Method를 정의해놓고 구현하는 class에서 각 기능들을 오버라이딩하여 여러 형태로 구현 가능 (다형성과 연관)
  • interface를 구현하는 클래스들에 대해 동일한 메소드, 동작을 강제하기 위해 존재
  • 다중 구현 가능
  • Has - A (~을 할 수 있는) 관계 혹은 be able to 관계
  • interface는 각각 다른 abstract class를 상속하는 class의 공통 기능을 명시할 때 사용하면 편리

Abstract

  • 부모와 자식 관계 (상속 관계)
  • abstract class를 상속(extends)받으며 같은 부모(abstract class)를 상속 받는 자식 class들 간에 공통기능을 구현,확장
  • 다중상속을 지원 안함
  • 왜 다중 상속을 지원 안할까?
    - B라는 클래스가 SuperA 클래스(commonType 메소드 존재), SuperB(commonType 메소드 존재) 클래스를 다중 상속 받아 commonType 메소드를 구현한다고 가정하면 어떤 commonType 메소드를 상속받아 오버라이딩 할 건지에 대해 모호해집니다. 이것을 다중 상속 모호성이라하고, 이 때문에 JAVA는 다중 상속을 막아 놓았습니다.
  • abstract 메소드는 반드시 구현
  • Is - A (~이다) 관계 혹은 is kind of 관계

abstract class와 interface의 차이 및 왜 존재할까?

기능적인 이유는 위에 정리한 것들이 되겠지만 본래 목적은 객체지향적인 관점에서 abstract class는 상속, interface는 다형성을 위해 존재한다고 생각할 수 있겠습니다.

스프링에서 인터페이스를 사용하는 이유

1. 확장 가능성
쇼핑몰에 결제를 담당하는 부분이 있으며 결제의 종류 경우 무통장입금, 카드 결제, 삼성페이결제, 현금결제가 있다고 가정하겠습니다.
이런 경우 결제를 담당하는 인터페이스가 있으며, 각각의 결제 종류 마다 처리하는 로직이 다르므로 인터페이스를 상속 받아 구현하면 됩니다.
즉, 결제 종류에 따라 확장 가능성을 결제 담당 인터페이스를 통해 열어두는 것입니다.


2. Decoupling
인터페이스를 사용하여 의존성을 줄이는 것입니다.
결합도와 응집도에 대한 개념이 필요한데 간단히 말씀드리자면 소프트웨어에서 결합도는 코드의 한 요소가 다른 것들과 얼마나 강력하게 연결되었는지 얼마나 의존적인지를 의미하며 응집도는 하나의 기능을 수행하는 요소들간의 연관성 척도이며 독립적인 기능이 되기 위해서는 응집도가 강해야 합니다.
즉, 낮은 결합도 + 높은 응집도가 좋은 설계라고 할 수 있습니다.
decoupling은 결합도를 낮추는 것을 의미하는데 즉, 클래스와 클래스 간의 의존 관계를 줄이는 것을 의미하며 결합도를 낮춰서 향후 유지 보수를 용이하게 하고 변경에 따른 유연성을 확보하기 위함입니다.

위 getPayType() 메소드 내부에 samsungPay, realCashPay에 대한 객체를 생성한 것을 볼 수 있습니다.
만약 samsungPay, realCashPay에 대한 객체가 없으면 해당 메소드는 동작하지 않기 때문에 결합도가 증가한다고 볼 수 있습니다. 위 처럼 추상 클래스를 사용하는 경우 생기는 의존성 주입을 아래의 인터페이스 형식으로 바구게 되면 의존 관게를 줄일 수 있습니다. 즉, 결합도를 낮추는 것입니다.



참고

profile
컴퓨터공학과 + 실무 = 4 + N = 모르는거 ∞ ...

0개의 댓글