반응형

Pattern

    Enum - 규칙 35 작명 패턴 대신 어노테이션을 사용하라.

    만약 특정 작업을 수행할 메서드를 구별하는데 메서드 이름을 사용한다고 가정해보자. 만약 testRoute라는 메서드를 tsetRoute라고 잘못 기입했다면? 이는 실행되지 않을 것이다. 이렇게 이름을 통해서 특정 기능을 실행하게 한다면, 오타와 같이 특수상황에서 실행이 되지 않았다는 것을 알기 어려울 뿐만아니라, 사용하기에도 네이밍 규칙을 지켜야하기 때문에 좋은 방법이 아니다. 이를 해결하기 위해서 사용하는 방법이 자바 1.5버전에 나온 어노테이션이다. 어노테이션을 이용하게 되면 실행될 메소드 지정하기 수월할 뿐 아니라 해당 메서드 안에서 예외가 발생하면 메서드가 실패한 것으로 지정하기도 편하다. 어노테이션 만들기 어노테이션 선언부 위에 존재하는 Retention, Target이라는 어노테이션들은 메타-..

    객체의 생성과 삭제 - 규칙 3 private 생성자나 enum 자료형은 싱글톤 패턴을 따르도록 설계하라.

    1234567891011121314package practice; public class SingleTone {public static SingleTone INSTANCE; public static synchronized SingleTone getInstance() {if ( INSTANCE == null ) {INSTANCE = new SingleTone();}return INSTANCE;} private SingleTone() {}}Colored by Color Scriptercs 기존에 싱글톤 패턴을 사용할 때 다음과 같이 생성해 주었다. 하지만 이런 형태로 만들 시 private 생성자를 생성하였다 해도 java reflection 성질을 이용하여 객체를 생성 할 수있다. 그리고 INSTANCE ..

    객체의 생성과 삭제 - 규칙 2 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라

    기존의 생성자로 많은 인자를 넣어 생성자를 추가하려고 하는 경우에는 다음과 같이 점층적 생성자 패턴을 자주 사용한다. 1234567891011121314151617181920점층적 생성자 패턴public class Wedul { private String teamName; private String teamReader; private int memberCnt; public Wedul(String teamName) { this(teamName, "", 0); } public Wedul(String teamName, String teamReader) { this(teamName, teamReader, 0); } public Wedul(String teamName, String teamReader, int m..

    스트래티지 패턴 (Strategy Pattern)

    공통적인 특징을 가진 객체를 만들 경우 우리는 대게 다음과 같이 추상클래스나 인터페이스를 만들어 놓고, 그 것을 상속받아 객체를 구현한다.1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465// 추상 클래스package com.wedul.study.strategy; public abstract class Animals { public Animals() {} private String name; public Animals(String name) { this.name = name; } public void eat() { System.out.pri..

    싱글톤 패턴 (Singleton Pattern)

    대게 공용으로 사용하는 유틸성 클래스의 경우 하나의 공용 인스턴스 객체를 생성하고 필요로 할 때마다, 해당 이스턴스 객체에 접근 하여 사용한다. 이를 싱글톤 패턴이라고 한다. 싱글톤 패턴 - 하나의 인스턴스만을 생성하는 책임이 있으며, getInstance 메소드를 통해 모든 클라이언트에게 동일한 인스턴스를 반환한다. 12345678910111213// 유틸성 클래스의 경우 인스턴스 객체를 만들거나 상속을 할 필요가 없으므로 final과 private 생성자를 만든다.public final class Util { private Utill () {} private Util util = null; public static Util getUtil() { if (util == null ) { util = new..

    스테이트 패턴 (state pattern)

    스테이트 패턴 객체의 상태를 효율적으로 관리 할 수 있도록 스테이트 패턴을 알아보자 많은 개체들은 상태값이 변경됨에 따라 다른 일을 수행하게 된다. 이를 객체에 어떤 동작이 수행될 때마다 상태를 확인하고 그에 맞는 동작이 수행되도록 하는 경우 코드가 지저분해지고, 많은 switch, if문을 가지게 될 것이다. 이것을 스테이트 패턴을 이용하여 공통의 상태 인터페이스를 만든 후 각 상태에 따른 객체를 생성한 후 상세한 동작을 상태 객체에서 수행하도록 설정하는 것이다. 문제의 상황의 예를 살펴보자 기존의 객체의 상태값이 있는 경우 다음의 자동차 객체처럼 하는 경우가 있다. 1234567891011121314151617181920212223public class Car { private int ON = 1; ..

    커맨드 패턴 (command pattern)

    커맨드 패턴은 이벤트가 발생되었을 때 실행될 기능이 다양하면서도 변경이 필요한 경우에 이벤트를 발생시키는 클래스는 변경하지 않고 재사용하고자 할 때 유용하다. 다음 예를 살펴보자 자동차의 시동버튼이 눌러졌을 때 시동이 켜지도록 설계해보자. 12345678910111213141516171819202122232425262728// 버튼 클래스public class Button { private Engine engine; public Button(Engine engine) { this.engine = engine; } public void on() { engine.execute(); } } // execute 인터페이스public interface Execute { void execute();} // 엔진 p..

    커맨드 패턴 (command pattern)

    커맨드 패턴은 이벤트가 발생되었을 때 실행될 기능이 다양하면서도 변경이 필요한 경우에 이벤트를 발생시키는 클래스는 변경하지 않고 재사용하고자 할 때 유용하다. 다음 예를 살펴보자 자동차의 시동버튼이 눌러졌을 때 시동이 켜지도록 설계해보자. 12345678910111213141516171819202122232425262728// 버튼 클래스public class Button { private Engine engine; public Button(Engine engine) { this.engine = engine; } public void on() { engine.execute(); } } // execute 인터페이스public interface Execute { void execute();} // 엔진 p..

    데코레이트 패턴 (Decorator Pattern)

    데코레이트 패턴은 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우에 각 추가 기능을 Decorator 클래스로 정의한 후 필요한 Decorator 객체를 조합함으로써 추가 기능을 설계하는 방식이다. 문제가 되는 예를 확인해보자. 만약 음식을 할 때, 준비를 해는 클래스 ReadyDish가 있다고 해보자. 생선 음식을 준비해야할 때는 ReadyDish 클래스에서 하는 ready() 메소드가 필요하며, 생선클래스를 위한 메소드 readyForFish()메소드가 필요하다. 그럴경우 기본적인 기능은 ReadyDish 클래스에 정의하고 추가적인 기능은 다음과 같이 하위클래스로서 상속받아서 진행할 수도 있다. 12345678910111213141516171819202122package decorator; pu..

    팩토리 메서드 패턴 (Factory method)

    팩토리 메서드 패턴은 객체의 생성 코드를 별도의 클래스/메서드로 분리하는 패턴이다. 이로써 특정 기능의 구현은 개별 클래스를 통해서 제공을 하도록 설계를 하면서 호출하는 메서드 코드의 중복된 코드 발생과 기능 변경으로 인해 자주 변경되지 않도록 하기 위해서 사용하는데 효과적이다. 다음 예를 살펴보자. 여러 엘레베이터 조작을위해 다음과 같이 구성이 되어있다고 가정해보자. 엘레베이터의 층수를 관리하는 ElevatorManager 클래스 각 엘레베이터 클래스 ElevatorController 클래스 스케줄 클래스 ThroughputScheduler 클래스 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748..

반응형