객체지향 디자인패턴에 대해 아래 2개의 얄코님 영상을 보고 정리한 내용
🎥 객체지향 디자인패턴 1 - 얄팍한 코딩사전
🎥 객체지향 디자인패턴 2 - 얄팍한 코딩사전
🪄 목차
- Singleton
- Strategy
- State
- Command
- Adapter
- Proxy
- Facade
- Template-method
- Decorator
- Factory-method
- Abstract-factory
- Mediator
- Composite
✏️ 객체지향 디자인패턴 1
▶️ Singleton
Singleton 패턴이란?
- 객체가 딱 하나만 만들어져야 할 때 사용하면 유용한 패턴
사용 예시
- ex) 다크모드 설정
사용자가 어떠한 페이지에서 다크모드를 설정하면 다른 모든 페이지에서도 다크모드로 나와야한다.
여기서 사용된 자바 규칙 ⭐️ (private && static)
- 생성자
private
→ new
생성 불가
⇒ 매번 새롭게 객체를 생성하지 못하도록 한다 !
static
이 붙은 클래스 / 메서드 → 정적공간, 메모리 용량이 딱 정해져있음
static
이 아닌 것들은 객체가 생성될 때마다 메모리를 차지하지만 static
으로 선언되면 객체가 얼마나 만들어지던 메모리에 지정된 공간에 하나씩만 존재하게 된다.
예시상황에 singleton 패턴 적용
- 정적 변수와 정적 메소드 생성 (
static
사용)
정적 변수에 저장된 값을 다른 페이지에서 그대로 가져다 쓰게하여 매번 new
로 다크모드를 설정해주는 객체를 생성하지 않아도 계속해서 변수 값을 불러와 일정한 설정 유지 가능
▶️ Strategy
Strategy 패턴이란?
사용 예시
- ex) 기능 버튼 중 하나를 눌러서 모드를 설정하고 해당 모드에 대해서만 검색을 하도록 하는 기능을 구현하고자 함 ( 기능 버튼들 : 전체, 이미지, 뉴스, 지도 )
[ 전체 | 이미지 | 뉴스 | 지도 ]
[. . . 검색창 . . .]
검색 버튼 🔍
여기서 사용된 자바 규칙 ⭐️ (Interface)
interface
== 자격증 같은 존재
- 자격증은 자격증 스스로는 일을 하는게 아님 → 누군가가 바리스타 자격증을 따면 바리스타 일을 할 수 있게 된다.
- 특정
interface
를 implement
한 클래스는 해당 interface
에서 지정한 메서드를 필수적으로 선언하여 장착한다. → 각자 해당 메소드를 가지게 되지만 각각의 메소드는 그 안에 다른 내용을 가지는 것이 가능하다.
- 동일한 틀 안에 있는 특정 작업의 방식을 바꿔줄 때 주로 사용된다.
예시상황에 Strategy 패턴 적용
- 전략 패턴으로 구현한다면 모드 마다의 동작 하나하나를 모듈로 따로 분리한 뒤,
- 버튼들을 누를 때 마다 검색 버튼을 누를 때 실행될 검색 모듈을 갈아끼워주는 방식으로 코드를 짜는 것
▶️ State
State 패턴이란?
- 특정 상태마다 다르게 할 일을 정해주는 패턴
- 하나하나 모듈화하여 지정할 때 쓰인다.
사용 예시
- ex) 다크모드를 껏다 켰다 하는 스위치를 구현하는 상황
라이트 모드에서 스위치 on → 다크모드
다크모드에서 스위치 on → 라이트모드
예시상황에 State 패턴 적용
- Strategy 패턴은 지정된 특성 메소드가 모듈화된 모드에 따라 다르게 실행되는 것이라면
- State 패턴은 모드도 전환되도록 하는 것과 같다
▶️ Command
Command 패턴이란?
- Strategy 패턴은 같은 일을 하지만 알고리즘이나 방식이 갈아끼워지는 것이라면,
- Command 패턴은 그 하는 일 자체가 다른 것이다.
사용 예시
- 다양하게 존재한다
- 모드 변경,
스위치를 올리고 내릴 때 각각 다르게 짜는 것 등등
- ex) 로봇이 할일을 순서대로 입력 -> 이를 순서대로 실행하는 학습용 프로그래밍
여기서 사용된 자바 규칙 ⭐️
abstract
추상 클래스
- 본디 자식들은 상속을 하나만 할 수 있음 (부모가 여러명일 수 없다)
abstract
추상 클래스는 집콕하고 있는 부모, 유산의 형태만 물려준다고 이해하면 편하다.
틀을 넘겨주기 위해서 상속을 해주는 클래스
- 스스로 객체 생성 불가 !
new ()
불가
- 그러나
abstract
추상 클래스를 상속받은 자식 클래스들은 그 틀 안에서 자신만의 메서드 구현이 가능하다 + 추가적인 메서드도 따로 구현할 수 있다.
abstract
추상 클래스 속 추상 메서드는 부모가 아닌 자식 클래스에서 구현된다.
예시상황에 Command 패턴 적용
- 상속은 하나만 가능, 인터페이스는 여러개 가능
▶️ Adapter
Adapter 패턴이란?
- 형식이 다른 둘 사이 연결되어 호환될 수 있게 해준다.
- 인터페이스가 서로 다른 객체들이 같은 형식아래 작동할 수 있도록 해주는 디자인 패턴
사용 예시
- 다른 사람이 짠 코드를 내 코드에 적용시킬 때
- 인터페이스도 다르고 메서드도 다르고 하는 알고리즘을 내 코드에 적용시키자
- ex) 아까의 검색 기능에 동영상 검색 기능도 추가됨 (여기서 동영상 검색 기능은 다른 사람의 코드를 가져와서 적용시키고자 한다)
[ 전체 | 이미지 | 뉴스 | 지도 | 동영상 ]
[. . . 검색창 . . .]
검색 버튼 🔍
예시상황에 Adapter 패턴 적용
SearchFindAdapter
라는 클래스를 만든다. (implements SearchStrategy
)
- 멤버 변수로
FindAlgorithm
의 객체가 생성자를 통해 넣어진다.
- 내가
search()
라고 말하면 너는 find(true)
로 알아들어 ~~
→ search() 가 실행되면 findAlgorithm의 find() 가 실행된다
▶️ Proxy
proxy 패턴이란?
- 대리인 패턴
- 회사 대표가 몸소 등장해야 하는 일은 중요도/권한이 높은 일
- 객체를 여러개를 생성하기 부담되는 것들에 대리인인 proxy 클래스를 따로 두어서 가벼운 일을 proxy 클래스가 처리
사용 예시
- ex) 제목이 뜨고 있지만 마우스를 위에 올리면 해당 영상의 프리뷰가 재생되는 유튜브 같은 사이트를 구현하는 상황
예시상황에 proxy 패턴 적용
- 두개의 메서드 존재
- 1) 제목 보여주기 → 가벼운 작업
2) 프리뷰 보여주기 → 영상 데이터를 받아와야 한다 ( == 무거운 작업 )
- 무거운 작업을 할 때에만 실제 클래스를 불러오도록 하여 프록시 객체로 생성된 썸네일에 커서를 올리면 실제 클래스가 호출되어 작업이 진행되도록 한다.
- 필요할 때에만 실제 객체를 생성 (= 대표님을 불러오는)
그러지 않을 때에는 프록시가 대신 작업하도록 한다.
✏️ 객체지향 디자인패턴 2
▶️ Facade
Facade 패턴이란?
- Facade는 "건물의 정면"을 의미하는 단어
- 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴
사용 예시
- 작업마다 여러 클래스에 접근 → 객체를 일일이 만들어서 실행하는 비효율적인 상황일 때
- 다양한 작업이 여러 곳에서 일어나야 하는 상황일 때
예시상황에 Facade 패턴 적용
- 여러 클래스에 접근하는 것을 하나의 메서드로 만들어 그 메서드를 돌리는 클래스를 하나 만들어서 한줄의 코드로 실행 가능
- Facade 뒤에 숨겨두고 스위치만 누르면 작동 되는 형식처럼 동작하게 한다.
▶️ Template-method
Template-method 패턴이란?
- 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴
- 즉, 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화 할 때 유용하다.
사용 예시
- 같은 형식을 지닌 특정 작업들의 세부 방식을 다양화 하고자 할 때
- 어떤 일을 수행하는 몇가지의 여러 방법이 있는데 그 전반적 과정에 공통된 절차가 있을 때 Template-method 패턴으로 코드를 효율적으로 짤 수 있다.
- ex) 약과를 만들 때 -
반죽 만들기
, 튀기기
, 시럽 바르기
이 세가지 과정을 어떻게 하느냐에 따라 약과가 달라진다.
예시상황에 Template-method 패턴 적용
- Template-method 패턴에서는 각각 자식 클래스에서 오버라이딩 하는 방식으로 다른 것들을 만들어 낸다.
- 부모 클래스에서는 전체 과정 방식을 알고 있고,
자식 클래스에서는 각 과정 내부의 세부 메서드를 오버라이딩하면서 패턴을 적용 가능하다.
▶️ Decorator
Decorator 패턴이란?
- Decorator 패턴은 객체에 추가적인 요건을 동적으로 추가한 것
- 여기서 동적으로 추가할 때는 보통 특정 객체를 결합하는 방식을 사용한다.
사용 예시
- 특정 클래스에 객체가 할 수 있는 일을 여러가지 두고 각 객체마다 사용자가 원하는 대로 골라서 시키거나 기능들을 필요에 따라 장착시킬 수 있을 때 사용한다.
- ex) 슈팅 게임 → 아이템을 먹거나 레벨업을 할 때마다 공격시 발사되는 게 추가되는 느낌
여기서 사용된 자바 규칙 ⭐️
@override
한거에서 super();
→ 상속해준 부모가 해당 메서드에서 실행하는걸 그대로 받아와서 토씨하나 안틀리고 실행하겠다. (부모가 하는걸 그대로 따라함)
- 객체가 생성자 변수로 다른 객체 안으로 들어감 → 실행하는 메서드의 행동이 추가되도록 하는 것
예시상황에 Decorator 패턴 적용
- 탄환 발사 → 레이저 발사 → 미사일 발사 → 플라즈마 발사
super();
로 일단 부모가 하는 공격을 한 다음 ⇒ 자식이 자신의 방식으로 공격 (점점 추가되는 공격)
▶️ Factory-method
Factory-method 패턴이란?
두가지 효용이 존재
1
- 객체를 생성하는 코드는 여러곳에 있을 수 있는데 만약 생성자가 변경되면 그걸 일일이 변경하여야 한다. → 부담이 커짐
- 이 역할을 Factory 클래스가 대신 하면 그 메서드 내부만 변경시키면 된다.
2
- 조건에 따라 객체를 생성해 가져오는 일을
Factory 클래스에 위임하여 내부 클래스에 대해 알 필요가 없도록 하는 것
- 클래스가 많고 복잡할 때 굳이 다 알 필요가 없다.
따라서 사용할 객체의 조건들만 인자로 넘겨주면, 이에 적절한 클래스를 찾아 객체를 생성해 넘겨주는 일을 Factory 클래스가 대신 한다.
- 협업에 있어서 다른 개발자에게 코드를 넘겨줄 때 보다 간단하게 넘겨줄 수 있다.
- 패턴을 이해할 필요 없이 필요한 패턴만 제공받을 수 있다.
▶️ Abstract-factory
Abstract-factory 패턴이란?
- 위에 Factory-method 패턴에
추상화
가 입혀진 버전이다.
- 여러 종류의 건설을 진행한다.
- 테마에 따라 여러 종류가 존재한다면 테마마다 공장을 만들어 관리한다.
- 어떤 클래스의 객체에서 특정 이벤트가 발생할 때 마다 연결된 다른 클래스에게 알려야하는 경우가 존재한다. 그런 상황에서 사용하면 유용한 패턴.
- 특정 이벤트에 반응하여 관련된 다른 클래스에 알려주는 중재자 역할을 한다.
▶️ Composite
Composite 패턴이란?
- 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴이다.
- 컴퓨터의 폴더 시스템에 비유할 수 있다.
- 폴더 안에는 파일도 들어갈 수 있고 다른 폴더들도 폴더 안에 들어갈 수 있다.
- 폴더와 파일은 각자 다른 파일이지만
이름 바꾸기 / 용량 구하기 / 삭제하기
등의 같은 명령어를 가진다.
== 일괄적인 관리가 가능하다!