목록전체 글 (33)
기록하자..
JVM, JDK, JRE의 차이 JVM(Java Virtual Machine) 자바 바이트 코드를 어떻게 실행하는지에 대한 표준 스펙이라고 생각할 수 있다. 자바의 가상 머신으로 자바 바이트 코드(.class)를 OS에 특화된 코드로 변환하여 실행하는 것에 대한 표준이고 구현체이다. 이렇기 때문에 OS에 의존적이라 할 수 있고, 특정 플랫폼에 종속적이라고 할 수 있다. 그리고 이러한 JVM을 구현하는게 여러 벤더(Oracle, 아마존, Azul...)에 따라 다 르다. 또 JVM은 Java만의 것이 아닌 것이 되었다. Kotlin, JRuby, Jython, Scala... 등등이 사용할 수 있다. JRE(Java Runtime Environment) JVM과 라이브러리를 더한 것이라고 생각할 수 있다...
템플릿 메서드 패턴 메서드의 알고리즘의 골격을 정의하며 알고리즘의 일부 단계는 하위 클래스에서 구현할 수 있다. 이 패턴은 알고리즘의 구조를 변경하지 않고 하위 클래스에서 알고리즘의 일부 단계를 변경할 수 있게 해준다. Head First Design Pattern에서는 커피와 차(tea)를 만드는 과정을 비교하며 이 패턴을 설명하고 있다. public class Coffee { public void prepareRecipe() { boilWater(); brewCoffeeGrinds(); pourInCup(); addSugarAndMilk(); } public void boilWater() {} public void brewCoffeeGrinds() {} public void pourInCup() {}..
어댑터 패턴 어댑터 패턴을 사용하고자 하는 경우는 다음과 같다. 기존 클래스를 사용하고 싶은데 해당 클래스가 제공하는 인터페이스가 필요한 인터페이스와 다른 경우 객체가 어떤 공통 인터페이스를 가지고 있지 않은 클래스들과 상호작용을 해야하는 경우 기존 여러 하위 클래스가 제공하고 있지 않은 어떤 공통 기능을 추가하고 싶지만 이 기능을 상위 클래스에 추가할 수 없는 경우 '이미 제공되어 있는 것'과 '필요한 것'의 차이를 없애줄 수 있는 패턴이다. Head First Design Pattern에서 Duck 인터페이스와 Turkey 인터페이스를 예로 들며 설명하고 있다. public class TurkeyAdapter implements Duck { private Turkey turkey; public Tur..
명령 패턴 요청을 객체로 캡슐화 해주며 파라미터를 통해 다양한 요청을 처리할 수 있도록 해준다. 요청을 큐에 유지 요청을 저장 요청 취소(undo) 기능 제공 연산 수행을 요청하는 객체와 그 요청을 실제 수행하는 객체의 연결을 느슨하게 해준다. 기존의 작업 수행 VS 명령 패턴 Sender ~ Receiver를 통한 명령 수행 Sender ~ Invoker/Command Manager ~ Receiver Sender : 명령의 실행 요청, 명령 객체의 생성/등록 Invoker/Command Manager : 등록되어 있는 명령 객체를 Receiver에게 전달 Receiver : 명령 실행 기존 Sender의 작업 수행 방식의 코드이다. public class Sender { void bar(Receive..
Factory Pattern 생성 패턴들은 어떤 구체적 클래스의 인스턴스가 생성되는지 캡슐화해주며, 언제, 누가, 어떻게 생성하는지도 숨겨줄 수 있음. **Head First Design Pattern 의 예제를 가져왔습니다.** 피자가게를 운영하고 있고 피자 가게의 주인답게 다음과 같은 코드를 만들었다고 하자. public class PizzaStore { public Pizza orderPizza() { Pizza pizza = new Pizza(); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } } 피자의 종류가 다양해진다면 어떻게 해야할까? public Pizza orderPizza(String type) { Pi..
장식 패턴? 객체에 동적으로 새로운 행위를 추가할 수 있도록 해주는 패턴 Head First Design Pattern에서.. Beverage라는 클래스와 이를 상속받는 여러 음료 클래스들을 예시로 들고 있다. 커피를 주문할 때 모카를 추가하거나 휘핑크림 등을 추가하기도 한다. 이럴 때 추가 토핑들마다 가격이 달라지기 때문에 주문 시스템에서도 이를 고려해야 한다. 그렇다면 모든 조합을 Beverage를 상속하는 클래스들로 만드는 것이 바람직할까? 조합이 너무 많아질 경우에는 클래스가 너무 많아져 클래스 폭발 문제가 발생할 수 있다. 그렇다면 이는 어떻게 해결할 수 있을까? 해결책? 토핑에 대한 인스턴스 변수와 이를 알아내거나 설정하기위한 getter/setter 메서드를 사용한다. 하지만 이는 토핑의 가..
ObserverPattern 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 자동으로 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의 객체가 관심 있어하는 사건의 발생을 알려주어야 할 때 사용한다. 관찰하는 객체가 능동적으로 관찰하는 것이 아니라 관찰 대상으로부터 어떤 사건이 발생했을 때 수동적으로 알려주기를 기다린다. 관찰자가 관찰대상에게서 정보를 가져오는 방법은 2가지가 있다. Polling : 관찰자가 주기적으로 관찰대상을 관찰해 변화가 있으면 가져온다. 관찰자를 관찰대상에 등록 : 정보가 갱신될 때마다 관찰자에게 통보해준다. observer pattern은 두 번째 방식이라고 할 수 있다. /** Head First Design에서 문제를 가..
Strategy Pattern 전략 패턴에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 전략을 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다. /** Head First Design에서의 문제를 가져왔다. **/ 문제의 시작 /** 기존 오리 시뮬레이션 프로그램 **/ 오리 시뮬레이션 프로그램을 개선하기 위해 fly 기능을 추가하고 싶다고 한다. 어떻게 할 수 있을까? 방법 1. 상속의 활용 만약 Duck을 상속받는 RubberDuck이 존재한다면 어떻게 해야할까? 상속의 문제점은 자식은 취사 선택을 할 수 없다는 것이다. 부모에 정의된 모든 메서드가 모든 자식에 적합하지 않을 수가 있다. 이를 해결하기 위해서는 quack()메서드는 "..