Interface pattern

froajnzd·2023년 4월 3일
0

pattern

목록 보기
2/12
post-thumbnail

객체지향 원리를 잘 따르다가 생겨난 패턴들이다.
큰 프로젝트일수록 기초공사가 중요하기에 앞으로 나올 패턴들도 중요하다고 볼 수 있다.

인터페이스 패턴을 알아보기 전에 먼저 추상 클래스와 인터페이스의 차이점부터 알아보겠다.

Q1. 추상 클래스와 인터페이스의 차이점?

추상 클래스와 인터페이스는 생김새, 사용법도 다르지만 하는 일이 비슷하다.

추상 클래스인터페이스
변수 선언가능불가(static final 필드는 가능함)
메소드추상이 아닌 메소드를 가질 수 있고모든 메소드가 추상 메소드
생성자정의 가능불가
가시성public, protected, private모두 public
메소드 가시성protected, private모두 public
상속object로부터
  • 추상 클래스는 여러 개의 인터페이스를 구현할 수 있지만, 인터페이스는 한 개의 추상 클래스만 상속할 수 있다.

  • 추상 클래스는 그 추상 클래스를 상속받아 기능을 이용하고, 확장시키는데 목적이 있다

  • 인터페이스는 함수의 껍데기만 구현해두고, 함수의 구현을 강제하여 구현된 객체의 같은 동작을 보장할 수 있다.

이렇게 추상클래스와 인터페이스가 나뉜 이유는, 자바에서 다중 상속을 못하기 때문!
반면, 여러 인터페이스를 상속받을 수 있다!

<참고링크> https://brunch.co.kr/@kd4/6

이런 인터페이스의 속성을 생각하며 인터페이스 패턴에 대해 사고해보자.

인터페이스 패턴, Interface Pattern

일단 설명에 앞서, 인터페이스 패턴이라는 것은 없다.
이 글에서 설명할 '어댑터 패턴'과 '퍼싸드 패턴'이 java의 인터페이스 개념을 잘 사용하는 것/관련된 것이기 때문에 분류하였다.

패턴의 아주 중요한 기초공사
인터페이스의 정의부구현부가 따로 있음
클래스 밖에 있는 사람한테 앞으로 이렇게 쓰겠다는 약속
안에서 하는 일은 밖에서 관심이 없음

  • java에서 인터페이스가 하듯, 여러 클래스가 동일 기능을 제공 가능하도록 하나의 클래스가 여러 인터페이스를 구현 가능하게 만들었다!

상속의 분류

  • 구현 상속(implementation inheritance) = extends
    -> 서브 클래스가 슈퍼 클래스의 구현을 "재사용"하겠다. = super()
  • 인터페이스 상속(interface inheritance) = implement
    -> 서브 클래스가 슈퍼 클래스의 인터페이스를 "구현"하겠다. 즉, 이 클래스가 메소드를 지원할 것이다

서론은 여기까지이다.
이제 본격적으로 각 패턴에 대해서 설명해보겠다.

각 패턴의 설명에 앞서서, 인터페이스 패턴 종류

  • 어댑터 패턴
  • 퍼싸드 패턴
  • 컴포지트 패턴
  • 브리지 패턴

1. 어댑터 패턴, Adapter Pattern

배경(문제상황-해결방안)

클래스의 인터페이스를 클라이언트가 원하는 인터페이스에 맞도록 변경하고 싶을 때 사용한다
기존 코드를 바꾸지 않고, 적응시킨다(adapt)
기존 객체를 통해 새로운 객체에게 요청을 보내도록 한다

구조/설명

인터페이스를 적용하는 대표적인 패턴(예전에 사용했던 것을 변경하여 사용하기 위함)
래퍼(Wrapper)로도 불린다. : 덧붙일 수 있다는 의미
단순 래핑 이상의 효과를 낸다.
- 존재하는 레거시 기능을 사용할 수 있도록 적응시키고, 존재하지 않는 기능은 래핑 객체에서 구현할 수 있다.

장점

레거시 시스템을 원하는 인터페이스로 사용할 수 있게 한다.
인터페이스가 불일치해도 사용할 수 있다.

구현 방법

  • 클래스 어댑터: 상속 이용
  • 객체 어댑터: 위임 이용

예시

통신시스템에서, 기존 시스템에 보안 A 프로토콜 라이브러리가 있는데, 새로운 시스템의 B 프로토콜 구축에 A 라이브러리를 사용하고 싶을 때.
-> [패턴을 쓰지 않은 방법1] 일반적으로는 클라이언트 코드를 수정해서 A 라이브러리 부분을 모두 B 라이브러리로 대체한다 > 코드에 산재한 A 라이브러리 관련 코드를 모두 수정해야한다
-> [패턴을 쓰지 않은 방법2] 클라이언트 코드를 그대로 쓴다 > 클라이언트 코드와 B 프로토콜 사이에 중재자 역할을 하는 새로운 클래스를 작성한다

<참고링크>
https://invincibletyphoon.tistory.com/20
https://clairdelunes.tistory.com/33

2. 퍼싸드 패턴, Facade Pattern

Facade : 프랑스어 Façade 에서 유래된 단어로 건물의 외관이라는 뜻이다. 건물의 외벽에서 보면 안의 구조는 보이지 않는다

배경(문제상황-해결방안)

복잡한 라이브러리를 이용하는데..

그 복잡한 시스템을 쉽게 사용하기 위해, 시스템의 부분집합을 사용하거나 특정한 방법으로 사용한다.
기존 시스템을 쉽게 사용하고 싶거나, 자신만의 인터페이스를 정의하고 싶을 때 사용한다.

복잡한 시스템의 부분만 사용 / 특정 방법으로 인터랙션할 필요가 있다.

따라서, 현재 시스템을 사용하는 클라이언트를 위한 새로운 인터페이스를 제시한다==대문

구조/설명

장점

클라이언트 객체가 다루어야 할 객체의 수를 줄여준다
새로운 기능을 추가해 확장할 수 있다
캡슐화한 층은, 시스템을 감추고 캡슐화할 수 있다.

3. 어뎁터 vs. 퍼싸드 패턴

둘 다 래퍼(wrapper)이다

어뎁터퍼싸드
이미 존재하는 클래스가 있는가?yesyes
설계해야하는 인터페이스가 있는가?yesno
다형적으로 동작하는 객체가 필요한가?probablyno
더 간단한 인터페이스가 필요한가?noyes

0개의 댓글