전체 글 (76) 썸네일형 리스트형 [구조 관련 디자인 패턴] 7가지 한번에 비교 - ⓭ GoF 구조 패턴 학습 기록 ⓭ — 어댑터 & 브리지 & 컴포지트 & 데코레이터 & 퍼사드 & 플라이웨이트 & 프록시들어가며구조 패턴 7개는 다 "감싼다" 는 공통점이 있어서 서로 헷갈린다. 그래서 한 페이지에 놓고 비교했다. 패턴한 줄감싸는 목적어댑터인터페이스 모양을 바꿔 끼운다모양이 안 맞아서브리지따로 늘어나는 두 갈래를 분리한다한쪽을 늘려도 다른 쪽이 안 딸려오게컴포지트폴더도 파일처럼 다룬다안에 몇 개가 들었는지 안 보이게데코레이터감싸서 기능을 덧붙인다기능을 더하려고퍼사드복잡한 절차를 창구 하나로쓰기 쉽게 하려고플라이웨이트같은 값은 공유한다메모리를 아끼려고프록시대리로 세운다접근을 통제하려고아래 코드와 출력은 JDK 21 환경에서 실제로 컴파일하고 실행한 결과다.1. 어댑터 — 모양만 바꿔 끼운다고칠.. [객체 생성 관련 디자인 패턴] 5가지 한번에 비교 - ⓬ GoF 생성 패턴 학습 기록 ⓬ — 싱글턴 & 팩토리 메서드 & 추상 팩토리 & 빌더 & 프로토타입들어가며행동 패턴을 다 보고 생성 패턴으로 넘어왔다. 5개인데 하나씩 보면 서로 헷갈리기 쉬워서 한 페이지에 묶어 비교했다.패턴한 줄언제싱글턴인스턴스를 하나만 둔다설정, 커넥션 풀처럼 하나면 되는 것팩토리 메서드무엇을 만들지를 서브클래스가 정한다생성 절차는 같고 만들 대상만 다를 때추상 팩토리관련 부품 묶음을 함께 만든다부품 조합이 어긋나면 안 될 때빌더파라미터가 많은 객체를 단계별로 만든다필드 5개 이상, 선택 항목이 많을 때프로토타입기존 객체를 복사해서 만든다새로 만드는 비용이 클 때, 템플릿 복제아래 코드와 출력은 JDK 21, Kotlin 2.1.0 환경에서 실제로 컴파일하고 실행한 결과다.1. 싱글.. [행동 관련 디자인 패턴] 비지터 패턴(Visitor) - ⓫ GoF 행동 패턴 학습 기록 ⓫들어가며타입마다 다른 처리를, 타입 밖으로 빼내는 방식.instanceof로 갈라지는 코드가 여러 곳에 흩어져 있다면 이 패턴의 자리다. 앞의 패턴들보다 손을 더 봐야한다.아래 코드와 출력은 JDK 21, Kotlin 2.1.0 환경에서 실제로 컴파일하고 실행한 결과다.1. 문제 — instanceof 체인이 연산마다 복사된다도형별로 면적과 SVG를 구한다고 하자.static double area(Shape s) { if (s instanceof Circle c) return Math.PI * c.r() * c.r(); else if (s instanceof Rect r) return r.w() * r.h(); throw new IllegalArgumentE.. [행동 관련 디자인 패턴] 템플릿 메서드(Template Method)와 템플릿 콜백 - ❿ GoF 행동 패턴 학습 기록 ❿들어가며절차는 고정해두고, 몇 줄만 바꿔 끼우는 방식.try-catch 껍데기는 똑같은데 안쪽 몇 줄만 다른 코드가 있다면 이 패턴을 활용하자.아래 코드와 출력은 JDK 21, Kotlin 2.1.0, Spring 6.1 환경에서 실제로 컴파일하고 실행한 결과이다.1. 문제 — 껍데기가 복붙된다같은 껍데기 코드가 한줄 짜리 코드 때문에 계속 사용될 경우.List findAll() { Connection con = null; try { con = getConnection(); Statement st = con.createStatement(); return st.execute("SELECT * FROM users"); .. [행동 관련 디자인 패턴] 전략 패턴(Strategy) - ❾ GoF 행동 패턴 학습 기록 ❾들어가며바뀌는 부분만 인터페이스로 빼서, 밖에서 골라 끼우는 방식.상태 패턴(❽)이 "상태를 객체로"였다면, 전략은 "정책(알고리즘)을 객체로 ! 구조는 둘이 같고 차이는 상태냐 정책이냐.아래 코드와 출력은 JDK 21, Kotlin 2.1.0, Spring 6.1 환경에서 실제로 컴파일하고 실행한 결과다.1. 문제 — 정책이 늘어날 때마다 if문이 늘어난다회원 등급별 할인을 계산하는 코드다.int discount(String grade, int price) { if (grade.equals("일반")) return price; else if (grade.equals("실버")) return price - price * 5 / 100; else if.. [행동 관련 디자인 패턴] 상태 패턴(State) - ❽ GoF 행동 패턴 학습 기록 ❽들어가며상태 패턴 요약if로 상태를 검사하는 대신, 상태를 객체로 만들어 그 객체에게 물어보는 방식. 아래 코드와 출력은 JDK 21, Kotlin 2.1.0 환경에서 실제로 컴파일하고 실행한 결과다.1. 신호등으로 보기신호등은 빨강 → 초록 → 노랑 → 빨강 순서로 돌아가고, 색마다 행동에 대한 패턴이 다르다.IF — 상태를 '값'으로 두기class LightIf { String color = "빨강"; void next() { if (color.equals("빨강")) color = "초록"; else if (color.equals("초록")) color = "노랑"; else if (color.equals("노랑")) c.. [행동 관련 디자인 패턴] 옵저버 패턴(Observer) - ❼ GoF 행동 패턴 학습 기록 ❼들어가며이번 공부에서 나온 의문.이벤트 리스너도 옵저버인가? (맞다)그럼 브로커는 뭐고, 리스너 인터페이스를 만들면 그게 브로커인가? (아니다)이벤트 리스너가 커밋을 확인할 수 있는 건 어떻게 되는 건가?코드는 전부 실제로 컴파일하고 실행해서 출력을 확인했다. (JDK 21 / Kotlin 2.1.0 / Spring 6.1)1. 한 줄 정의와 문제상태가 바뀌면 관심 있는 객체들에게 자동으로 알린다."자동으로"가 핵심이다. 구독자가 계속 물어보는(폴링) 대신 발행자가 밀어주는 구조로 뒤집는 것이다. 패턴 없이 짜면 아래와 같다.// ① 폴링 — 구독자가 계속 물어본다while (true) { List messages = server.getMessages("공지"); .. [행동 관련 디자인 패턴] 메멘토 패턴(Memento) - ❻ GoF 행동 패턴 학습 기록 ❻ — "복원했는데 일부만 복원된다?"들어가며메멘토는 구조가 단순하다. 상태를 스냅샷 형식으로 저장했다가 되돌린다. 그런데 정리하면서 의문이 생겼다.스냅샷 뜨면 다 메멘토인가? (아님)커맨드 undo랑 뭐가 다른가? (접근 방식이 정반대)코드는 전부 실제로 컴파일하고 실행해서 출력을 확인했다. (JDK 21 / Kotlin 2.1.0)1. 한 줄 정의와 세개의 역할캡슐화를 유지하면서 객체 내부 상태를 외부에 저장하는 방법."캡슐화를 유지하면서"가 포인트다. 저장/복원만 하는 거면 getter를 사용해라.역할정체예제에서Originator상태의 주인. 저장/복원을 직접 함GameMemento저장된 스냅샷. 불변SaveCaretaker스냅샷을 보관만 함. 내용은 모름History2.. 이전 1 2 3 4 ··· 10 다음