Concepts/Design Pattern22 구조 패턴 - 프록시(Proxy) - 참조: GoF의 디자인패턴 - 참조: https://refactoring.guru/design-patterns/proxy - 프록시 패턴 다른이름으로 대리자(Surrogate) 라고도 하며 다른 객체에 대한 접근을 제어하기 위한 역할을 한다. - 문제점 많은 시스템의 리소스를 소비하는 객체가 있다고 가정하자. 해당 객체가 특정 시점이 되면 사용되겠지만 언제나 필요한건 아니다. 이때 흔히 알고 있는 Lazy loading 기법을 사용할 수 있다. 정말 필요한 시점에만 해당 객체를 생성하고, 해당 객체의 모든 클라이언트는 초기화 코드를 수행하면 된다. 하지만 이런 방식으로 구현하면 코드의 중복이 너무 많이 나타난다. 이런 코드를 해당 객체에 직접 넣는 방법도 있지만 만약 해당 클래스가 3rd-party .. 2021. 5. 20. 구조 패턴 - 플라이급(Flyweight) - 참조: https://refactoring.guru/design-patterns/flyweight - 플라이급(Flyweight) GoF의 디자인 패턴에서는 공유를 통해 많은 수의 소립 객체들을 효과적으로 지원한다고 되어있다. 대략적으로 의미는 알것 같기도 한데 뭔가 확실하게 와닿지는 않는다. 개인적으로는 refactoring.guru의 설명이 더 명료하고 와닿는다고 생각한다. refactoring.guru 에서는 "플라이급 패턴은 각 객체에서 데이터를 다루는 대신 객체들의 공통되는 상태를 공유하여 RAM을 확보하는 디자인 패턴이다." 라고 정의하고 있다. - 시나리오 플레이어가 맵을 돌아다니면서 서로 쏘는 게임을 만든다고 가정하자. 많은 양의 총알, 미사일, 파편들이 온 맵에 흩뿌려질것이다. 이 게.. 2021. 5. 19. 구조 패턴 - 퍼사드(Facade) - 참조: GoF의 디자인 패턴 - 참조: https://refactoring.guru/design-patterns/facade - God object: https://en.wikipedia.org/wiki/God_object - 퍼사드(Facade) 패턴 퍼사드(Facade) 는 용어 부터 낯설게 느껴지는것 같아 사전적 정의부터 살펴보는게 좋겠다. Facade는 정면, 표면이라는 뜻으로 이를 알면 왜 패턴의 이름이 퍼사드인지 알 수 있다. 퍼사드 패턴은 라이브러리나 프레임워크 혹은 클래스들의 집합과 같은 서브시스템을 사용하기 쉽도록 하나의 간편한 인터페이스를 제공하는 패턴이다. - 시나리오 비디오 파일을 사용자가 요청한 format 으로 변경해주는 응용프로그램이 있다고 가정하자. 비디오 파일 포맷 변환.. 2021. 5. 12. 구조 패턴 - 장식자(Decorator) - 참조: GoF의 디자인 패턴 - 다른 패턴과의 관계: https://refactoring.guru/design-patterns/decorator - 장식자(Decorator) 아마 한번쯤은 들어봤을법한 랩퍼(Wrapper) 라고도 불리우는 패턴이다. 객체에 동적으로 새로운 책임을 추가할 수 있게 한다. 기능을 추가하려면 서브 클래스를 생성하는것보다 융통성 있는 방법을 제공한다. - 시나리오 GUI 툴킷이 있다고 가정해보자. 모든 사용자 UI 요소에는 필요 없지만, 어떤 특정 사용자 UI 요소에만 스크롤링이나 테두리 같은 속성을 추가할 필요가 있다고 해보자. Text 를 출력하는 서비스를 제공하는 TextView 클래스가 있다고 가정하자. 이 TextView에 스크롤 기능이나 두꺼운 테두리가 필요하다면.. 2021. 5. 11. 구조 패턴 - 복합체(Composite) - 참조: GoF의 디자인 패턴 - Composite pattern 안전성: https://en.wikipedia.org/wiki/Composite_pattern#Java - 복합체(Composite) 패턴 부분과 전체의 계층을 표현하기 위해 객체들을 모아 트리구조를 형성한다. 개별객체와 복합객체를 동일하게 다룰 수 있도록 한다. - 시나리오 PPT 문서를 작성하다보면 작은 요소들을(예를 들면 선, 텍스트, 도형들) 하나의 큰 요소로 만들고 난 후, 이를 수월하게 다루기 위해서 그룹화(Grouping)를 할때가 있다. 그룹화를 하면 한 번의 클릭으로 여러 요소들을 한꺼번에 선택하여 작업이 훨씬 수월하다. 작은 요소들을 클래스로 이 작은 요소들이 모인것을 컨테이너라고 할 때, 이를 코드로 구현하려면 해당 .. 2021. 5. 6. 구조 패턴 - 가교(Bridge) - 참조: GoF의 디자인 패턴 - 가교(Bridge) 패턴 가교(Bridge) 패턴은 다른 이름으로 핸들/구현부(Handle/Body) 라고도 불리우며, 구현부에서 추상적인 부분을 을 분리하여 독립적으로 다양성을 가질 수 있도록 한다. - 시나리오 보통 하나의 추상적 개념에 대해 여러 가지 구현을 해야할 때, 대부분 상속을 통해 처리한다. 코드에서 추상적인 개념을 인터페이스로 정의하고, 클래스들이 이를 구현하게 처리하는 방식일것이다. 상속은 잘 사용하면 좋은 기법이 되지만 구현부가 추상적 개념에 강하게 종속된다. 추상적 개념과 구현을 분리해서 재사용이 불가능해지거나 확장하기가 쉽지 않다. 이식성이 있는 Window를 추상적 개념으로 보고 이를 UI 툴킷을 써서 구현하는 예를 생각해보자. 이 Window.. 2021. 5. 1. 구조 패턴 - 적응자(Adapter) - 참조: GoF의 디자인 패턴 - 적응자(Adapter) 패턴 적응자 패턴은 다른 이름으로 래퍼(Wrapper)라고 불리우는 패턴이다. 클래스의 인터페이스를 사용자가 원하는 형태로 변환(적응)시킨다. 이렇게 변환(적응)을 통해서 일치하지 않는 인터페이스를 갖는 클래스들이 함께 동작할 수 있도록 한다. - 시나리오 그림 편집기가 있다고 가정해보자. 그림판의 주요한 추상적 개념은 그래픽 객체들이다. 이런 공통 그래픽 요소에 대한 인터페이스는 추상 클래스인 Shape 에 정의되어 있다. 그리고 각 그래픽 요소인 선과 다각형은 각각 LineShape, PolygonShape 과 같은 클래스로 개발해야 한다. 위와 같이 간단한 도형도 있겠지만 TextShape는 텍스트처리시 버퍼관리와 같이 다른 그래픽 요소에 .. 2021. 4. 23. 객체 생성 패턴- 단일체 - 참조: GoF의 디자인 패턴 - 참조: Effective Java 2/E - 단일체(Singleton) 패턴 단일체 패턴은 한 개의 클래스 인스턴스만을 갖도록 보장하며, 이에 대해 접근점을 제공한다. 보통 단일체 패턴의 예로는 창 관리자나 파일 시스템과 같은 예가 있다. 가장 단순하게 구현하려면 전역 변수를 선언하면 되지만 이 방식은 문제가 상당히 많다. 단일체 패턴을 구현할 때에는 클래스가 자체적으로 인스턴스 접근방법을 관리하도록 한다. 위의 그림은 단일체 패턴의 구조를 UML로 나타낸것이다. 단일체 패턴은 참여자가 1개밖에 존재하지 않는다. Singleton: Instance() 연산을 정의하여, 유일한 인스턴스로 접근할 수 있도록 한다. 이때 Instance는 클래스 연산(static)이다. 단.. 2021. 4. 12. 객체 생성 패턴- 프로토타입 - 참조: GoF의 디자인 패턴 - 참조(refactoring.guru): https://refactoring.guru/design-patterns/prototype - 참조(refactoring.guru - java example): https://refactoring.guru/design-patterns/prototype/java/example - 프로토타입(Prototype) 패턴, 원형 패턴 원형이 되는 인스턴스를 사용하여 생성할 객체의 종류를 명시하고, 이렇게 만든 견본 인스턴스를 복사하여 새로운 객체를 생성한다. 또한 코드가 클래스에 의존하지 않고, 객체를 복사할 수 있다. 시나리오: 그래픽을 편집하는 프레임워크가 있다고 해보자. 이 프레임워크를 기반으로 음표, 쉼표, 보표(악보의 5줄)를 표.. 2021. 2. 25. 객체 생성 패턴- 팩토리 메소드 - 참조: GoF의 디자인 패턴 - Template method: https://en.wikipedia.org/wiki/Template_method_pattern - 팩토리 메소드 객체를 생성하기 위한 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내린다. 팩토리 메소드의 예제를 검색하면 흔히 메소드의 매개변수의 타입에 따라 반환하는 객체가 다른 예제가 많이 나온다. 그래서 흔히 객체를 매개변수타입에 따라 다르게 반환하는것이 팩토리 메소드라고 생각한다. 물론 나도 예전에는 그렇게 생각했다. 하지만 위의 정의를 다시한번 생각해보면 팩토리 메소드의 핵심은 매개변수에 따라 다른 인스턴스를 반환하는것이 아님을 알 수 있다. 이 패턴의 주요핵심은 어떤 인스턴스를 생성할지에 .. 2021. 2. 21. 이전 1 2 3 다음