티스토리 뷰
▶자바 어댑터(Adapter) 패턴
🔎 Adapter 패턴이 무엇인지, 왜 사용하는지
우리가 인터페이스(interface)를 공부할 때 이 인터페이스를 자식 클래스에 implements 하게 되면
인터페이스에 선언한 추상 클래스 모두를 무조건 구현해야만 했습니다.
하지만, 필요한 메소드만 재정의 하고 싶을 수 있습니다....
인터페이스를 직접 지정하지 않고 다른 클래스를 거쳐 일부는 강제성을 없애고
다시 그 클래스를 상속받는다면 골라서 재정의할 수 있게 될 것입니다.
이때 중간에서 강제성을 없애주는 클래스를 추상 클래스로 선언하기도 하며,
추상 클래스 이름 뒤에는 Adapter를 붙여서 목적을 알려줍니다.
→ 중간에서 강제성을 없애주는 추상 클래스
📌 예제 코드
상황은 이러합니다..
Animal이라는 interface를 만들어서 이 인터페이스를 상속받는 클래스들이 반드시 구현해야 할 메소드들을 적어둘겁니다.
그런데 특정 클래스에서는 인터페이스에 있는 추상 메소드에서 재정의하고 싶지 않은 메소드가 있습니다.
📄 Animal.java (interface)
package interfaceTest;
public interface Animal {
public abstract void sitDown();
public abstract void getHands();
public abstract waitNow();
}
📄 Dog.java
Dog 클래스에서는 원래 의도대로 인터페이스의 모든 추상메소드를 오버라이딩 했습니다.
package interfaceTest;
public class Dog implements Animal {
@Override
public void sitDown() {
System.out.println("앉는다.");
}
@Override
public void getHands() {
System.out.println("손을 준다.");
}
@Override
public void waitNow() {
System.out.println("기다린다.");
}
}
이제 Cat 클래스를 만드려고 합니다. 그런데 저는 여기서 showHands() 메소드만 재정의하고 싶을 때
갑자기 Dog 클래스 처럼 다 적고 필요없는 메소드를 그냥 지워버리면 에러가 발생합니다.
오버라이딩 하라고 말이죠.
이럴 때 바로 Adapter 패턴을 사용하는 것인데요.
즉 Adapter에서는 추상 메소드를 형식상 구현했음을 명시하여 강제성을 소멸시킵니다.
이때 반드시 인터페이스와 동일한 이름 + Adapter를 붙여줍시다.
📄 AnimalAdapter.java
아래와 같이 형식상 구현부를 작성하는 것입니다.
중괄호({}) 안에 세미콜론(;)을 작성하여 의도하여 빈칸으로 작성했음을 명시해줍니다.
즉, 무조건 반드시 재정의해야 하는 메소드를 빼고 여기서 재정의를 해줌으로써 강제성을 소멸시키는 것입니다.
package interfaceTest;
public abstract class AnimalAdapter implements Animal {
// Adapter에는 결국에 무조건 구현해야 할 메소드는 빼고 구현해둠
@Override
public void sitDown() {;}
@Override
public void touchNose() {;}
}
이제는 의도대로 Cat 클래스를 만들 수가 있게 되는 것인데요.
따라서 Animal 인터페이스를 상속받는 것이 아니라 AnimalAdapter를 상속받아야 합니다.
📄 Cat.java
package interfaceTest;
public class Cat implements Animal{
@Override
public void showHands() {
System.out.println("손은 준다. 가끔");
}
}
'백엔드 > Java' 카테고리의 다른 글
[Java] 자바의 다중상속 그리고 모호성(ambiguity)에 대하여 (0) | 2023.02.05 |
---|---|
[Java] 마커 인터페이스(Marker Interface)에 대해 알아보자 (0) | 2023.02.03 |
[Java] 내부 클래스(Inner Class) & 익명 클래스(Anonymous Class) (0) | 2023.02.02 |
[Java] 인터페이스(interface)에 대해 알아보자 (0) | 2023.02.02 |
[Java] 추상 클래스(Abstract Class) (0) | 2023.02.02 |
- Total
- Today
- Yesterday
- 머신러닝
- 스타일 컴포넌트 styled-components
- 디프만
- Python
- 프로젝트 회고
- 자바
- testing
- 자바스크립트
- react
- styled-components
- 프론트엔드
- 리액트 훅
- 타입스크립트
- frontend
- 데이터분석
- jest
- 프론트엔드 공부
- next.js
- 딥러닝
- 자바스크립트 기초
- 프론트엔드 기초
- rtl
- TypeScript
- HTML
- JSP
- react-query
- CSS
- 파이썬
- 인프런
- 리액트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |