Java
-
행위 패턴 - 상태 패턴 (State Pattern)Java/디자인패턴 2024. 11. 9. 14:53
**상태 패턴 (State Pattern)**은 객체의 상태에 따라 행동을 변경하는 디자인 패턴입니다. 상태 패턴은 객체의 내부 상태가 바뀔 때 객체의 행동이 마치 클래스를 바꾸는 것처럼 변경되도록 합니다. 이를 통해 코드의 가독성과 유연성을 높일 수 있으며, 복잡한 조건문을 대체하는 데 유용합니다.예시 설명자판기를 예시로 들어보겠습니다. 자판기는 여러 상태를 가질 수 있습니다. 예를 들어 "동전 투입 대기", "음료 선택 대기", "음료 제공 중" 등의 상태가 있습니다. 상태 패턴을 사용하면 이러한 상태를 객체로 정의하고, 자판기의 행동이 상태에 따라 다르게 작동하도록 할 수 있습니다.JAVA로 상태 패턴 구현 예시다음은 자판기의 간단한 상태 패턴 예제입니다.State 인터페이스 - 자판기 상태에서 수..
-
생성 패턴 - Singleton 패턴Java/디자인패턴 2024. 11. 8. 16:19
Singleton 패턴은 객체의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴입니다. 주로 공유 자원(예: 데이터베이스 연결, 설정 파일)과 같은 경우에 사용됩니다. 이 패턴을 사용하면 애플리케이션 내에서 해당 클래스의 유일한 인스턴스에 접근할 수 있게 되어 자원 낭비를 줄이고, 전역적으로 관리해야 할 자원의 일관성을 유지할 수 있습니다.Singleton 패턴 구현 방식Java에서는 주로 다음과 같은 방식으로 Singleton 패턴을 구현합니다.Private 생성자: 외부에서 객체 생성을 방지합니다.Static 변수: Singleton 인스턴스를 저장하는 변수입니다.Static 메서드: 인스턴스를 반환하는 메서드로, 처음 호출 시에만 객체를 생성하고 이후에는 생성된 인스턴스를 반환합니다.Java..
-
템플릿 메소드 패턴(Template Method Pattern)Java/디자인패턴 2024. 11. 7. 16:49
템플릿 메소드 패턴(Template Method Pattern)은 객체지향 설계 패턴 중 하나로, 알고리즘의 뼈대를 정의하고, 세부 구현은 서브 클래스에서 결정하도록 하는 구조입니다. 즉, 상위 클래스에서 알고리즘의 일반적인 구조를 정의하고, 그 중 일부를 추상 메소드로 선언하여 하위 클래스에서 필요한 부분만 재정의(Override)하도록 유도합니다. 이 패턴은 코드의 재사용성을 높이고, 알고리즘의 변하지 않는 부분과 변해야 하는 부분을 분리하여 유지보수를 용이하게 합니다.템플릿 메소드 패턴을 사용하는 경우알고리즘의 큰 구조는 동일하지만, 세부 구현이 클래스에 따라 다를 때코드 중복을 줄이고 싶을 때알고리즘의 일부분만 하위 클래스에서 변경하도록 하고 싶을 때템플릿 메소드 패턴 예제 (Java)간단한 예제..
-
Behavioral Design Pattern - Strategy(전략) 파헤치기Java/디자인패턴 2024. 10. 25. 15:22
Strategy 패턴은 객체의 행위를 유연하게 변경할 수 있도록 하는 디자인 패턴 중 하나입니다. 이 패턴은 알고리즘 군(群)을 정의하고, 이 알고리즘을 캡슐화하여 필요에 따라 교체할 수 있도록 합니다. Strategy 패턴을 사용하면 객체의 행위(behavior)를 클래스로 캡슐화하여 동적으로 알고리즘을 교체할 수 있습니다. Strategy 패턴의 구조Context: 전략을 사용하는 클래스입니다. 특정 Strategy 인터페이스에 의존하고, 런타임에 적절한 Strategy 객체를 선택합니다.Strategy: 알고리즘을 캡슐화하는 인터페이스입니다. 다양한 알고리즘이 이 인터페이스를 구현하여 특정 행위를 정의합니다.Concrete Strategy: 구체적인 알고리즘을 구현하는 클래스입니다. Strate..
-
Structural Patterns - 파사드(Facade) 파헤치기Java/디자인패턴 2024. 10. 24. 14:14
파사드(Facade) PatternFacade 패턴은 복잡한 시스템을 단순화하여 사용자가 더 쉽게 접근할 수 있도록 하는 구조적 디자인 패턴입니다. 이 패턴은 여러 클래스나 서브시스템의 인터페이스를 통합하여 단일한 인터페이스를 제공함으로써, 클라이언트가 시스템의 복잡성을 이해하지 않고도 쉽게 사용할 수 있도록 합니다. 주요 특징간단한 인터페이스: 클라이언트는 복잡한 서브시스템의 세부사항을 알 필요 없이 간단한 메서드를 통해 기능을 사용할 수 있습니다.결합도 감소: Facade 패턴을 사용하면 클라이언트와 서브시스템 간의 결합도를 줄일 수 있어, 시스템의 유지보수와 확장이 용이해집니다.서브시스템의 보호: 클라이언트가 직접 서브시스템에 접근하지 않으므로, 서브시스템의 변경이 클라이언트에 미치는 영향을 줄일..
-
SOLID - Dependency inversion (의존성 역전법칙)파헤치기Java/디자인패턴 2024. 10. 22. 16:22
Dependency inversion**Dependency Inversion Principle (DIP)**는 SOLID 원칙 중 하나로, 고수준 모듈이 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다는 개념입니다. 즉, 상위 계층(High-level 클래스)이 하위 계층(Low-level 클래스)에서 세부 사항에 의존하지 않고, 둘 다 인터페이스나 추상 클래스와 같은 추상화에 의존해야 한다는 원칙입니다. DIP를 위배한 코드// Low-level classpublic class Fan { public void spin() { System.out.println("Fan is spinning"); } public void stop() { Syste..
-
SOLID - Interface segregation(인터페이스 분리법칙) 파헤치기Java/디자인패턴 2024. 10. 22. 16:19
Interface segregation**Interface Segregation Principle (ISP)**는 SOLID 원칙 중 하나로, 클라이언트는 사용하지 않는 메서드에 의존하지 않아야 한다는 개념입니다. 즉, 하나의 큰 인터페이스보다는 여러 개의 작은 인터페이스로 분리하여, 각 클래스가 실제로 필요한 기능만을 구현하도록 해야 한다는 원칙입니다. 문제점:위 코드에서는 Worker 인터페이스가 두 가지 책임(일하기와 먹기)을 모두 가지고 있습니다. 하지만, 로봇(Robot)은 먹는(eat()) 행동을 필요로 하지 않습니다. 이는 **Interface Segregation Principle (ISP)**를 위반하는 상황입니다. Robot 클래스는 eat() 메서드를 구현하지 않아야 하지만, 인터페이..
-
SOLID - Liskov substitution 리스코프 치환원칙 파헤치기Java/디자인패턴 2024. 10. 22. 15:27
Liskov substitution principle**Liskov Substitution Principle (LSP)**는 SOLID 원칙 중 하나로, 자식 클래스는 언제나 부모 클래스를 대체할 수 있어야 한다는 것을 의미합니다. 즉, 자식 클래스가 부모 클래스를 대체하더라도 프로그램의 동작이 일관되어야 한다는 것입니다. 자식 클래스가 부모 클래스에서 제공하는 메서드를 오버라이드할 때, 해당 메서드의 계약을 위반해서는 안 됩니다. LSP에 위배된 코드 1번// Parent class Birdpublic class Bird { public void fly() { System.out.println("Bird is flying"); }}// Child class Penguin tha..