본문 바로가기

전체 글43

디자인패턴 시리즈 7. 빌더 패턴 (Builder Pattern) 빌더 패턴 (Builder Pattern) 제품을 여러 단계로 나눠서 만들도록 제품 생산 단계를 캡슐화한다. 프로그래밍 할 때 가장 많이 쓰이는 때는 복잡한 객체를 생성하는 순간이다. 특히 선택적인(Optional) 속성이 많을 때 유용하다. 코드에 적용해보기 피자에는 토핑이 다양하게 들어간다. 기호에 따라 선호하거나 빼고 싶은 토핑이 있을 수도 있다. 또한 피자를 만드는 데에는 여러 단계와 다양한 절차를 거치게 된다. 이러한 과정을 거치며 객체를 만드는데 언뜻 팩토리 패턴과 유사하게 보일 수도 있다. 하지만 팩토리 패턴은 한 단계에서 모든 것을 처리한다는 점에서 다르다. 빌더를 이용하여 고기를 좋아하는 사람들을 위한 피자와 비건 피자를 만들어보겠다. public class Pizza { String n.. 2023. 1. 19.
디자인패턴 시리즈 6. 템플릿 메소드 패턴 (Template Method Pattern) 템플릿 메소드 패턴 (Template Method Pattern) 알고리즘의 골격을 정의한다. 자세히 설명하면 알고리즘의 일부 단계를 서브 클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하되 특정 단계를 서브 클래스에서 재정의할 수 있다. 코드에 적용해보기 커피와 홍차를 만드는 방법은 아주 유사하다. 물을 끓이고, 커피를 우리고, 컵에 따르고, 기호에 따라 설탕 혹은 우유를 첨가한다. 홍차는 물을 끓이고, 찻잎을 우리고, 컵에 따르고, 레몬을 추가한다. 전략 패턴에서도 배웠던 원칙인 "달라지는 부분과 달라지지 않는 부분을 분리한다" 라는 원칙에 따라 분리해보자. 물을 끓이고, 컵에 따르는 과정은 완전히 동일한 행위이다. public class Coffee { void prepareRecipe.. 2023. 1. 17.
디자인패턴 시리즈 5. 커맨드 패턴 (Command Pattern) 커맨드 패턴 (Command Pattern) 요청 내용을 객체로 캡슐화해서 객체를 서로 다른 요청에 따라 매개변수화할 수 있다. 실행될 다양한 기능들을 캡슐화하여 재사용성이 높은 클래스를 설계하는 패턴이다. 이러한 특징 덕분에 요청을 큐에 저장하거나 로그로 기록할 수 있다. 코드에 적용해보기 일명 기가지니라는 제품을 들어본 적이 있을 것이다. 집에 존재하는 IoT 기기를 어디에서나 쉽고 편하게 조회 및 제어할 수 있는 어플리케이션을 말한다. 하나의 어플리케이션으로 여러 제품의 on, off, 기타 기능 등을 조작할 수 있다. 지금부터 직접 이 어플리케이션을 만드는 작업을 커맨드 패턴을 이용하여 진행할 것이다. 위와 같이 회색 슬롯에 원하는 제품을 끼우고 on, off, 그리고 undo(취소)까지 조작할 .. 2023. 1. 17.
디자인패턴 시리즈 4. 팩토리 패턴 (Factory Pattern) 팩토리 패턴 (Factory Pattern) 팩토리 패턴은 추상 팩토리 패턴과 팩토리 메소드 패턴이 존재한다. 이 두가지 패턴은 팩토리 패턴으로 묶이지만 서로 다른 디자인 패턴이다. 팩토리 메소드 패턴은 객체를 생성할 때 필요한 인터페이스를 만들고, 어떤 클래스의 인스턴스를 만들지는 서브 클래스에서 결정한다. 즉, 인스턴스를 생성하는 과정을 서브 클래스에 위임하는 것이다. 코드에 적용해보기 Sandwich sandwich = new HamSandwich(); 앞선 디자인 패턴 글에서 위와 같은 new 연산자를 통한 인스턴스 생성(구상 클래스의 인스턴스) 과정을 많이 보았다. 인터페이스를 이용하여 코드를 유연하게 만들었지만 구상 클래스의 인스턴스를 만들어야 했다는 것은 여전하다. 햄 샌드위치, 베이컨 샌드.. 2023. 1. 16.
디자인패턴 시리즈 3. 데코레이터 패턴 (Decorator Pattern) 데코레이터 패턴 (Decorator Pattern) 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있다. 객체에 추가 요소를 동적으로 더 할 수 있다. 코드에 적용해보기 샌드위치 가게에서 주문을 한다고 하자. 예를 들면 토핑 주문 지옥이라는 서브웨이. 모든 샌드위치들은 Sandwich 추상 클래스의 서브클래스가 된다. price() 메소드는 추상 메소드이고 서브클래스는 이 메소드를 구현해야 한다. name 인스턴수 변수는 서브 클래스에서 정해지고 getName() 메소드를 통해서 호출해서 정해진 이름을 알 수 있다. 햄 샌드위치, 참치 샌드위치, blt 샌드위치에서는 가격을 반환하는 price() 메소드를 구현해야 한다. 하지만 햄, 참치 등은 기본 재료이고 여기에 에그마요, 베이컨, 양상추 .. 2023. 1. 13.
디자인패턴 시리즈 2. 싱글톤 패턴 (Singleton Pattern) 싱글톤 패턴 (Singleton Pattern) 클래스 인스턴스를 단 하나만 생성하고 그 인스턴스로의 전역 접근을 제공한다. 코드에 적용해보기 싱글톤 패턴의 첫인상은 클래스가 단 하나뿐인데 디자인패턴이라는 거창한 이름을 붙인 것만 같았다. 하지만 생각보다 많은 곳에서 필요로 하는 디자인패턴이다. 스레드 풀, 블루투스 장치를 위한 드라이버 등이 대표적인 예시이다. 스프링 Bean은 컨테이너가 싱글톤 스콥으로 관리하고 있다고 한다. 이런 객체를 쓸 때 인스턴스가 2개 이상이면 이상하게 작동하거나 불필요하게 자원을 낭비하게 된다. 가장 심각한 문제는 결과의 일관성이 사라진다는 것이다. 싱글턴 패턴에서 인스턴스를 하나만 생성하는 방법은 간단하다. public으로 생성자를 만드는 것이 일반적이지만 안타깝게도 pr.. 2023. 1. 12.