Book
-
[헤드 퍼스트 디자인 패턴] 8장. 템플릿 메소드 패턴Book/헤드 퍼스트 디자인 패턴 2023. 6. 19. 11:54
8장. 템플릿 메소드 패턴: 알고리즘 캡슐화하기 커피와 차를 만드는 단계에는 중복된 부분이 많다. 두 클래스를 만든다고 할 때, 어떻게 하면 중복된 코드를 없앨 수 있을까? 이럴 때 우리는 템플릿 메소드 패턴을 사용할 수 있다. 템플릿 메소드 패턴의 정의 템플릿 페소드 패턴은 알고리즘의 골격을 정의한다. 템플릿 메소드를 사용하면 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하며서 알고리즘의 특정 단계를 서브클래스에서 재정의할 수도 있다. 간단하게 말하자면 템플릿 메소드 패턴은 알고리즘의 템플릿을 만든다. 템플릿이란, 일련의 단계로 알고리즘을 정의한 메소드이다. 여러 단계 가운데 하나 이상의 단계가 추상 메소드로 정의되며 그 추상 메소드는 서브클래스에서 구현된다. ..
-
[헤드 퍼스트 디자인 패턴] 5장 하나뿐인 특별한 객체 만들기: 싱글턴 패턴Book/헤드 퍼스트 디자인 패턴 2023. 5. 13. 00:14
5장. 싱글턴 패턴 본격적으로 들어가기 전에, 객체 인스턴스를 1개만 만드는 이유와 싱글턴 패턴의 사용 이유에 대해서 알아보자. 인스턴스를 하나만 만드는 경우는 무엇이 있을까? 하나만 있어도 잘 돌아가는 객체는 많다. 스레드 풀, 캐시, 대화 상자, 사용자 설정, 레지스트리 설정을 처리하는 객체, 로그 기록용 객체, 디바이스 드라이버 등이 그 예가 될 수 있다. 만일 이런 객체를 사용할 때 인스턴스가 2개 이상이면 프로그램이 이상하게 돌아간다든가, 자원을 불필요하게 잡아먹는다든가, 결과에 일관성이 없어진다든가 하는 심각한 문제가 발생할 수 있다. 그런데 우리는 여기서 '이러한 객체의 인스턴스를 만들 때 꼭 싱글턴 패턴을 사용해야 하는가?' 라는 질문이 생길 수 있다. 전역변수를 사용하거나 관행을 정해두는..
-
[헤드퍼스트 디자인패턴] 4장. 객체지향 빵 굽기: 팩토리 패턴Book/헤드 퍼스트 디자인 패턴 2023. 5. 5. 22:18
4장. 객체 지향 빵굽기: 팩토리 패턴 4장에 본격적으로 들어가기 전에, new 라는 키워드를 생각해보자. 우리는 앞으로 new 연산자를 만나면, 구상이라는 단어를 떠올려야 한다. new 를 사용하면 구상 클래스의 인스턴스가 만들어진다. 당연히 인터페이스가 아닌 특정 구현을 사용하는 것이다. 그런데, 우리는 앞에서 구상 클래스를 바탕으로 프로그래밍 하면 나중에 코드를 수정해야 할 가능성이 커지고, 유연성이 떨어지기 때문에 특정 구현을 바탕으로 프로그래밍 하지 않아야한다는 원칙을 배웠다. 그렇다면 new 에 어떤 문제가 있는 걸까? 인터페이스에 맞춰서 코딩하면 시스템에서 일어날 수 있는 여러 변화에 대응할 수 있다. 왜냐하면, 인터페이스를 바탕으로 만들어진 코드는 어떤 클래스든 특정 인터페이스만 구현하면 ..
-
[헤드퍼스트 디자인패턴] 3장. 객체 꾸미기 : 데코레이터 패턴Book/헤드 퍼스트 디자인 패턴 2023. 4. 29. 00:50
3장. 객체 꾸미기: 데코레이터 패턴 스타버즈 카페(가명)는 모두 알 것이다. 그 카페 사업을 시작 무렴 주문 시스템 클래스는 다음과 같이 구성되었다. 모든 서브 클래스에서 음료의 가격을 리턴하는 cost 메소드를 구현해야 한다. 고객이 커피를 주문할 때 우유나, 두유, 모카 같은 서브 메뉴를 추가하고 그 위에 휘핑을 얹기도 한다. 각각을 추가할 때마다 커피 가격이 올라가야 하기 때문에 주문 시스템을 구현할 때 이러한 점을 모두 고려해야한다. 그런데 여기서 문제가 발생했다. 점점 패턴이 커지면서 클래스가 '폭발'하게 된것이다. 각 서브 클래스의 cost()메소드는 첨가물도 포함해서 커피의 최종 가격을 계산한다. 그러면 '우리는 클래스가 이렇게까지 필요할 이유가 없고, 그냥 인스턴스 변수와 슈퍼 클래스 상..
-
[헤드퍼스트 디자인 패턴] 2장. 객체들에게 연락 돌리기, 옵저버 패턴Book/헤드 퍼스트 디자인 패턴 2023. 4. 14. 22:08
2장 객체들에게 연락 돌리기, 옵저버 패턴 본 글은 '헤드퍼스트 디자인 패턴' 책를 읽고 정리한 글입니다. 어떤 서비스를 만들어야 하나요? 2장에서 만나는 어플리케이션은 기상 모니터링 서비스입니다. 우리는 온도, 습도 기압을 추적하는 WeatherData 객체를 바탕으로 3개의 항목을 각각 현재 조건, 기상 통계, 그리고 간단한 기상 예보를 화면에 표시하는 애플리케이션을 만들어야합니다. 또한 이 항목들은 모두 최신 측정치를 수집할 때마다 실시간으로 갱신됩니다. 우선 외주가 들어온 것이기 때문에 납품처(Weather-O-Rama)에서 제공하는 부분을 살펴봐야합니다. 그러면 다시 한 번 만들어야하는 기상 모니터링 어플리케이션을 살펴봅시다. 이 시스템은 기상 스테이션(실제 기상 정보를 수집하는 물리 장비), ..
-
[헤드 퍼스트 디자인 패턴] 1장. 디자인 패턴 소개와 전략 패턴Book/헤드 퍼스트 디자인 패턴 2023. 3. 31. 21:27
1장. 디자인 패턴 소개와 전략 패턴 본 글은 '헤드 퍼스트 디자인 패턴' 도서를 읽고 정리한 글입니다. 1장에서는 오리 시뮬레이션 게임에 대하여 나온다. 조는 이 게임에서 헤엄도 치고 꽥꽥 소리도 내는 매우 다양한 오리를 구현해야한다. 이 시스템을 처음 디자인한 사람은 표준 객체지향 기법을 사용하여 Duck이라는 슈퍼클래스를 만든 다음, 그 클래스를 확장해서 서로 다른 종류의 오리를 만들었다. 이 때 조는 여태 없었던 새로운 오리의 행동인 '날기'를 할 수 있는 오리가 등장해야한다는 임무를 받았다. 조는 처음 개발되어 있던데로 fly() 라는 메소드를 Duck(상위 클래스)에 추가해서 모든 오리가 그 fly를 상속받게끔 구현하려고 했다. ❗️여기서 문제가 발생했다❗️ 고무 오리 마저 fly 클래스를 상..
-
Kotlin in Action : ch 11. DSL 만들기Book/Kotlin in Action 2023. 1. 25. 18:51
11. DSL 만들기 DSL은 영역 특화 언어(Domain-Specific Language)를 의미한다. 즉, 특정 도메인에 특화된 언어이다. "문제 영역의 해결에는 그 영역의 언어를 전제로 둬야하며, 거기에서 프로그래밍 솔루션을 꺼내는 것이 중요하다" 라고 말한 Dave Thomas가 한 말을 생각하면 이해하기 쉽다. 특정 언어의 문제 해결에는 그 영역에 맞는 특화된 도구를 사용하자라는 것이다. 아래에 DSL에 대해 더 자세히 나오니 지금은 이정도만 알고 넘어가자. 코틀린의 DSL 설계는 코틀린 언어의 여러 특성을 활용한다. 그 중 두가지 특성을 살펴보면 수신 객체 지정 람다 수신 객체 지정 람다를 사용하면 코드 블록에서 이름(변수)가 가리키는 대상을 정할 수 있었다. 이러한 방식을 변경해서 DSL 구..
-
Kotlin in Action: ch 10. 애노테이션과 리플렉션Book/Kotlin in Action 2023. 1. 20. 09:23
어떤 함수를 호출하려면 그 함수가 정의된 클래스의 이름과 함수 이름, 파라미터 이름 등을 알아야만 했다. 애노테이션과 리플렉션을 사용하면 그런 제약을 벗어나서 미리 알지 못하는 임의의 클래스를 다룰 수 있다. 애노테이션을 사용하면 라이브러리가 요구하는 의미를 클래스에게 부여할 수 있고, 리플렉션을 사용하면 실행 시점에 컴파일러 내부 구조를 분석할 수 있다. 10.1 애노테이션 선언과 적용 애노테이션을 사용하면 추가 메타데이터를 선언과 연결할 수 있다. 메타데이터는 애노테이션 구성 방식에 따라 소스 코드, 컴파일된 클래스 파일 또는 런타임 시 작업하는 도구에서 액세스할 수 있다. 메타데이터란 애플리케이션이 처리해야 할 데이터가 아니라, 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지 알..