[디자인패턴] 데코레이터 패턴(Decorator Pattern)이란 무엇인가?
2023. 3. 8. 15:46
Programming/Design Pattern
정의 데코레이터(Decorator)는 사전적으로 무언가를 꾸며준다는 의미를 가지고 있다. 이에 착안해 데코레이터 패턴의 사전적 정의를 살펴보면 다음과 같다. 객체에 추가 요소를 동적으로 더할 수 있도록 하는 패턴으로, 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있다. 데코레이터 패턴은 Java I/O 에서 대표적으로 적용되고 있는 디자인 패턴이다. 사전적 정의가 실제 구현에서 어떻게 사용되는 것인지 와 닿기 힘들다. 이에 관련된 문제 상황과 해결 방법을 아래 문단에서 자세하게 알아보자. 문제 상황 우리는 샐러드 가게에서 사용할 전산 시스템을 만드는 상황을 가정해 보자. 만약 아래와 같이 샐러드 주문 표가 있다고 할 때, 각 샐러드 조합에 대한 클래스를 만드려면 어떻게 해야 할까? 만약 조합..
[디자인패턴] 옵저버 패턴(Observer Pattern)이란 무엇인가?
2023. 3. 8. 11:58
Programming/Design Pattern
정의 정말 많이 쓰이는 디자인 패턴 중 하나인 옵저버 패턴은 아래와 같은 정의를 가지고 있다. 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로, 일대다(one-to-many) 의존성을 정의한다. 아래의 그림과 같이, 한 Subject가 자신의 상태가 바뀌었음을 다수의 Observer 들에게 통지(Notify)하는 방식을 가지고 있는 패턴이다. 옵저버 패턴은 RxJava, Swing 라이브러리 등 많은 곳에서 활용하고 있는 디자인 패턴이다. 문제 상황 한 신문사가 있고, 이 신문사에서 출간되는 신문을 구독하는 다수의 구독자가 있는 상황을 고려해 보자. 구독자들은 신문이 배달될 때마다 바로 신문을 읽고 싶은 상황이다. 이를 위의 그림과 같이 정리하면 ..
[디자인패턴] 전략 패턴(Strategy Pattern)이란 무엇인가?
2023. 3. 7. 19:45
Programming/Design Pattern
정의 이는 다음과 같은 의미를 가지고 있다. 어떤 문제를 해결하는 알고리즘을 클래스 별로 캡슐화해서, 필요에 따라 교체 가능하도록 하여 문제 상황마다 다른 전략(Strategy)을 세울 수 있게 하는 디자인 패턴 디자인 패턴을 접하는 많은 사람들이 그러하듯, 정의만 봐서는 어떤 내용인지 이해가 잘 되지 않는다. 아래와 같은 문제 상황과 예시를 보며 알아보자. 문제 상황 만약 객체 지향 프로그래밍을 이용해 다음과 같은 클래스를 작성해야 한다고 가정해 보자. Warrior(전사) 슈퍼 클래스를 만든다. 이 클래스는 공격 기능, 이동 기능이 있다. 이를 상속받는 서브 클래스들은 각각 다른 공격 기능, 이동 기능을 갖출 수 있다. 공격 기능에는 Slash, Arrow가 있고, 이동 기능에는 Walk, Ride가..
[RxJava] 생산자(Publisher)와 소비자(Consumer), 연산자(Operator)
2022. 11. 15. 18:33
Programming/Java
Backpressure Starategy (배압 기능) RxJava의 기본이 되는 Flowable, Observable 등을 다루기에 앞서 Backpressure Strategy를 이해해야 한다. Backpressure Strategy는 배압 기능이라고 번역되며, 이는 통지하는 데이터의 개수를 제어하는 기능이라고 생각하면 된다. 아래와 같은 상황을 보자. 위의 상황과 같이 만약 소비자의 입장에서 한 번에 처리할 수 있는 데이터가 5개로 제한된다고 한다면, 아무리 생산자가 많은 데이터를 통지할 수 있더라도 소비자에게 최대 5개의 데이터만 전달해야 할 것이다. 이럴 때 배압 기능을 이용해 데이터의 최대 전달량을 5로 설정할 수 있는 것이다. Flowable vs Observable RxJava에서의 대표적인..
[RxJava] Reactive Streams, RxJava란 무엇인가?
2022. 11. 15. 18:22
Programming/Java
RxJava란 무엇인가? RxJava는 자바에서 리액티브 프로그래밍(Reactive Programming)을 구현하는 데 사용하는 라이브러리이다. 리액티브 프로그래밍(Reactive Programming) 이란? 데이터가 통지될 때마다 관련 프로그램이 반응(Reaction)해 데이터를 처리하는 프로그래밍 방식.이 때, 통지되는 데이터의 흐름을 데이터 스트림(Data Stream) 이라고 한다. RxJava는 데이터를 통지하는 생산자를 생성하고, 통지한 데이터를 소비자가 받아 처리하는 방식을 취하고 있다. 이러한 방식은 디자인 패턴인 옵저버(Observer) 패턴을 확장한 구조라고 볼 수 있다. 아래와 같은 예시 코드를 참고하자. public static void main(String[] args) { F..
[C++] 해시(Hash) 자료구조란? (C++로 구현하기)
2021. 3. 23. 21:30
Programming/C│C++
해시(Hash) 자료구조란? 해시는 너무도 유명한 자료구조이기 때문에, 컴퓨터를 공부하는 분들이라면 누구나 한번쯤은 들어보셨을 것입니다. 이 자료구조는 왜 그렇게 중요한 것일까요? 아래의 상황을 보겠습니다. 3명의 사람 (김연아, 손흥민, 서장훈) 이 위와 같이 부탁을 했습니다. 그리고 이러한 기능을 C++ 를 사용해서 구현해달라고 했습니다. 파이썬과 다르게, 기본적으로 C++ 에서는 이런 기능을 지원하지 않습니다. 어떻게 기능을 구현해야 가장 효율적이고, 빠른 자료구조가 될까요? 답은, 각각의 이름(텍스트)에 대해서, 유일한 Key 값을 가지게 하는 것입니다. 만들어진 Key 값을 이용해서 자료에 접근한다면 O(1) 시간만에 접근할 수 있습니다. 아래와 같이 말입니다. 해시(Hash)의 동작원리 해시에..