본문 바로가기

JAVA/Design Patterns

(23)
디자인 패턴의 아름다움 #코드 설계 디자인 패턴의 아름다움 코드 설계를 배우는 이유 코드 설계에 대한 지식은 확장성과 가독성이 높아 유지보수가 용이한 고품질의 코드를 작성할때 필요하다. 고품질의 코드 작성 먼저 코드 설계에 대한 이론적인 지식을 갖춰야 한다. 복잡한 코드 개발 다루기 소프트웨어를 개발할때 만나는 어려움 2가지 매우 높은 수준의 기술이 필요한 경우 (자율주행, 비디오 인식, 높은 성능 등) 높은 수준의 기술이나 최신의 기술이 필요하지는 않지만 복잡한 비즈니스를 갖춘 대규모의 프로젝트 (물류, 금융, ERP 시스템등 개발에 많은 사람이 참여하는 경우) 대부분의 소프트웨어 엔지니어는 프로그래밍 언어, 개발도구, 그리고 개발 프레임워크에 익숙하며 프레임워크를 사용하여 비즈니스 요구사항에 따라 코드를 채우는 것이 일반적인 업무 비즈..
13. 디자인패턴 정리 디자인 패턴의 정의패턴- 특정 컨텍스트 내에서 주어진 문제에 대한 해결책이다. 컨텍스트- 패턴이 적용되는 상황을 뜻한다. 반복적으로 일어날 수 있는 상황이어야만 한다.문제- 그 컨텍스트 내에서 이루고자 하는 목적을 뜻한다. 하지만 컨텍스트 내에서 생길수 있는 제약조건도 문제에 포함된다.해결책- 우리가 찾아내야 하는것. 누구든지 적용해서 일련의 제약조건 내에서 목적을 달성할 수 있는 일반적인 디자인을 뜻한다. "어떤 컨텍스트 내에서 일련의 제약조건에 의해 영향을 받을 수 있는 문제에 봉착했다면, 그 제약조건 내에서 목적을 달성하기 위한 해결책을 찾아낼 수 있는 디자인을 적용하면된다." 정리스트래티지 패턴- 교환 가능한 행동을 캡슐화하고 위임을 통해서 어떤 행동을 할지를 결정한다. 옵저버 패턴- 상태가 변경..
12. 컴파운드 패턴 컴파운드 패턴 서로 다른 패턴을 섞어 쓰는 것으로 일련의 패턴을 함께 사용하여 다양한 디자인 문제를 해결하는 것 하나의 디자인 문제를 해결하기 위해 여러 패턴을 함께 사용하는 경우가 있다.반복적으로 생길 수 있는 일반적인 문제를 해결하기 위한 용도로 두개 이상의 패턴을 결합해서 사용하는 것 진행과정1. Quackable 인터페이스로 오리들을 만듬2. 거위도 Quackable로 사용가능하게 함(어댑터패턴)3. Quackable의 횟수를 카운터 추가 ( 데코레이터 패턴)4. QuackCounter로 장식되지 않는 Quackable 객체가 있을수 있지해서(추상 팩토리 패턴)5. 오리와 거위, Quackable 객체들을 관리하기 힘들기 시작(컴포지트 패턴) 오리떼 관리 (이터레이터 패턴)6. 소리났을대 연락받고..
11. 프록시 패턴 프록시 패턴 정의- 어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴- 다른 객체를 대변하는 객체를 만들어서 주 객체에 대한 접근을 제어할 수 있다. 프록시 패턴을 이용하면 원격 객체라든가 생성하기 힘든 객체, 보안이 중요한 객체와 같은 다른 객체에 대한 접근을 제어하는 대변자 객체를 만들수 있다. 프록시에 접근을 제어하는 몇가지 방법- 원격 프록시를 써서 원격 객체에 대한 접근을 제어할 수 있다.- 가상 프록시를 써서 생성하기 힘든 자원에 대한 접근을 제어할 수 있다.- 보호 프록시를 써서 접근 권한이 필요한 자원에 대한 접근을 제어할 수 있다. 원격 프록시의 역할원격객체에 대한 로컬 대변자 역할을 한다. 원격 객체(remote object)- 다른 자바 ..
10.스테이트 패턴 스테이트 패턴 정의- 객체의 내부상태가 바뀜에 따라서 객체의 행동을 바꿀수 있다.객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다. 설명->상태를 별도로 클래스로 캡슐화한 다음 현재 상태를 나타내는 객체에 행동을 위임하기 때문에, 내부 상태가 바뀜에 따라서 행동이 달라지게 된다. 클래스가 바뀌는 것 같은 결과를 얻는다는 것?클라이언트 입장에서 사용하는 객체의 행동이 완전히 달라질수 있다면 마치 그 객체가 다른 클래스로부터 만들어진 객체러럼 느껴지게된다. 다른 클래스로 변신하는게 아니고 구성을 통해서 여러 상태 객체를 바꿔가면서 사용하기 때문에 이런 결과를 얻을 수 있다. 예) 뽑기기계 package patterns.state; public class GumballMachine { final stat..
9.컴포지트 패턴 컴포지트 패턴=> 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다.- 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합객체(composite)를 똑같은 방법으로 다룰 수 있다. 객체의 구성과 개별 객체를 노드로 가지는 트리 형태로 객체를 구축할수 있다.이런 복잡구조(composite structure)를 사용하면 복합객체와 개별객체에 대해 똑같은 작업을 적용할 수 있다.즉, 대부분의 경우 복합객체와 개별객체를 구분할 필요가 없어진다. 중첩되어있는 메뉴 그룹과 메뉴 항목을 똑같은 구조내에서 처리할 수 있다.메뉴와 메뉴 항목을 같은 구조에 집어넣어서 부분-전체 계층구조를 생성할수 있다.부분-전체 계층구조란 부분(메뉴 및 메뉴항목)들이 모여있지만, 모든 것을 하나로 묶어서 전..
9.이터레이터 패턴 이터레이터 패턴 정의-컬렉션 구현방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해주는 방법을 제공해준다.-> 내부적인 구현방법을 외부로 노출시키지 않으면서도 집합체에 있는 모든 항목에 일일이 접근할 수 있다.또한 각 항목에 일일이 접근할수 있게 해주는 기능을 집합체가 아닌 반복자 객체에서 책임지게 된다는 것도 장점으로 작용한다. 그러면 집합체 인터페이스 및 구현이 간단해지고 각자 중요한 일만 잘 처리할 수 있으면 된다. 인터페이스 통합바뀌는 부분을 캡슐화하라. 예)식당과 팬케이크 하우스 합병 package patterns.iterator; public class MenuItem { String name; String description; boolean vegetari..
8.템플릿 메서드 패턴 템플릿 메서드 패턴 정의- 메서드에서 알고리즘의 골격을 정의한다.알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있다.템플릿 메서드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브 클래스에서 특정 단계를 재정의 할 수 있다. 알고리즘의 틀을 만들기 위한 것.틀(템플릿)이란 일련의 단계들로 알고리즘을 정의한 메서드이다.여러 단계 가운데 하나 이상의 추상 메서드로 정의되며, 그 추상 메서드는 서브클래스에서 구현된다.서브클래스에서 일부분을 구현할 수 있도록 하면서 알고리즘의 구조는 바꾸지 않아도 되도록 할 수 있다 예) 커피/차 주문공통적인 행동과 각각 다른 행동들을 분리하여 상위 추상클래스 만들어서 사용 package patterns.template; public class Coffee { vo..