인터페이스 및 분리

kante·2020년 11월 30일
1

2020 11 29

의존성 주입을 위해 인터페이스를 구현해야 했는데, 인터페이스는 동일한 목적으로 동일한 기능을 수행하게하는 .. 그런 간단한 기능으로만 알고 있었다. 하지만 직접 구현을 해 본적도 많이 없었고, 정확하게 이 인터페이스가 어떤 역할을 하기 위해 존재하는지에 대한 완벽한 이해가 없었기에 공부하게 되었다. 객체지향 프로그래밍 언어에서 가장 유명한 언어가 자바이므로, 자바로 다시 공부해보기로 했다. 외부 라이브러리 사용을 목적으로 다시 인터페이스를 공부해보고 싶었기에, 문법은 간단하게 다시 봤고, 외부 라이브러리를 사용할 때, 비즈니스 로직과 분리하는 방법을 위주로 살펴보았다.


먼저 인터페이스의 개념, 역할을 다시 한 번알아보았다.

인터페이스

서로 다른 두 개 이상의 독립된 컴퓨터 시스템 구성 요소 간에 정보를 교환하는 공유 경계(shared boundary)이다. 컴퓨터와 사용자 간의 통신(communucation)이 가능하도록 하는 장치나 프로그램(device or program)을 의미하기도 한다.

  • 인터페이스는 생명주기가 같은 2개 이상의 모듈을 수정의 비용을 감수 하더라도 교체의 비용을 줄이기 위해 사용

다형성. 즉 객체지향 프로그래밍의 특징을 극대화해서, 개발 코드 수정을 줄이고, 프로그램 유지보수성을 높이기 위해 인터페이스를 사용한다. 어떤 회사에 지원하기 위해, 회사가 자기소개서 문항을 딱 정해놓는 것도 인터페이스의 한 예라고 할 수도 있다.


문법, 다형성

자바에서는 interface 키워드로 선언하고, implements 키워드를 통해 인터페이스를 구현할 수 있다.

public interface A{
  int sumFunction();
}
public class B implements A{
  int sumFunction();
}
  • 인터페이스에서 선언해둔 함수나 상수는 다시 한 번 클래스에서 적어주어야만 한다.
  • 인터페이스는 implements할 때 여러 개를 사용할 수 있다.

라이브러리

반복되는 부분을 함수로 만들어두고, 이렇게 미리 만들어 놓은 함수들의 집합

라이브러리에 접근하기 위한 규칙을 정의한 것을 API 라고도 한다.

=> 외부 라이브러리를 사용하는 경우에는 언제든지 라이브러리 교체가 가능하도록 분리할 것.

내가 파이썬을 사용할 때 pandas라는 라이브러리를 사용하고 있다고 생각해보자. 그런데 갑자기 pandas 라이브러리가 deprecated 되어서 다른 라이브러리를 사용해야 할 불가피한 경우가 생겼다면, 내가 구현해 놓은 코드를 싹 갈아엎어야 할 수도 있다. 이럴 경우를 대비해서

라이브러리 <---> 라이브러리및 참조 인터페이스 <----> 비즈니스 로직

형태로 분리 해 놓으면 라이브러리가 바뀌어도 참조 인터페이스만 바꾸면 프로그램은 잘 돌아가게 된다.


Bridge 패턴

위에서 설명해 라이브러리와 비즈니스 로직을 연결시켜주는 것을 Bridge 라고 하며 이 패턴에 대해서 알아보자. 정의에 대해서 알아보면

"구현(implementation)으로부터 추상(abstraction) 레이어를 분리하여 이 둘이 서로 독립적으로 변화할 수 있도록 한다."

img

Abstraction

- 기능 계층의 최상위 클래스이며 추상 인터페이스를 정의한다. Implementor에 대한 레퍼런스를 유지한다.
- 구현 부분에 해당하는 클래스를 인스턴스를 가지고 해당 인스턴스를 통해 구현부분의 메서드를 호출한다.

RefinedAbstraction

- Abstraction에 의해 정의된 인터페이스를 확장한다.(extends)
- 기능 계층에서 새로운 부분을 확장한 클래스이다.

Implementor

- 구현 클래스를 위한 인터페이스를 정의한다.
- Abstraction의 기능을 구현하기 위한 인터페이스 정의한다.

ConcreteImplementor

- Implementor 인터페이스를 구현 즉, 실제 기능을 구현한다.

Bridge 패턴 vs Adapter 패턴

실질적으로 차이는 없고, 구조적으로도 차이가 없다. 하지만 의미상 차이와, 목적의 차이는 다음과 같다.

  1. Adapter는 어떤 클래스의 인터페이스가 다른 코드에서 기대하는 것과 다를 때, 어댑터를 둬서 중간에서 맞춰 주는 것
  2. Bridge는 추상과 구현을 분리하는 것.
  3. Adapter는 어떤 코드에 맞게끔 기존 코드를 쓰기 위해 그당시 만들어서 사용하고, Bridge는 두가지 다 구조를 알 경우 확장성을 고려하여 만들기 위해 사용된다.

참고

  1. https://limkydev.tistory.com/197
  2. https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4
  3. https://coding-restaurant.tistory.com/134
  4. https://www.crocus.co.kr/1537
profile
경험많은 개발자가 되자

0개의 댓글