전체 글
-
[디자인패턴] 비지터패턴기타/북스터디 2023. 1. 29. 09:58
1. 비지터패턴(Visitor Pattern)이란? 비지터패턴이란 기존 코드를 건드리지않고 새로운 기능을 추가할 때에 사용하는 패턴이다. Element는 기존에 존재하는 객체로 변하지 않는 객체이다. Visitor는 추가하고자 하는 기능을 가지고 있는 객체이다. 비지터패턴을 적용하기 위해서는 우리가 추가하고자하는 기능을 구현하기 위해 기존에 존재하는 객체인 Elment에 accpt(Visitor)라는 메서드를 추가해주어야한다. accpt(Visitor) 메서드 안에서는 Visitor.visit(this);로 자기 자신(Element구현객체)을 넘겨준다. 2. 비지터패턴 적용 전 코드 Shape라는 인터페이스가 있고 Shape를 구현하는 Rectangle과 Triangle이 있다고 가정해보자. public..
-
[디자인패턴] 메멘토패턴기타/북스터디 2023. 1. 29. 08:58
1. 메멘토패턴(memento pattern)이란? 메멘토패턴은 객체 내부의 상태를 외부에 저장을 하고 저장된 상태를 다시 복원하고자 할 때에 사용하는 패턴이다. 메멘토패턴을 사용함으로써 객체의 모든 정보를 외부로 노출시키지 않고 캡슐화를 지킬 수 있다. Originator는 본래의 상태를 가지고 있고 상태를 저장하고 복원하고 싶어하는 객체이다. Memento는 immutable한 객체로 일정 시점의 Originator 내부정보를 가지고 있다. CareTaker는 Originator의 내부정보를 Memento type으로 가지고 있고 복원을 할 수 있는 객체이다. 2. 메멘토패턴을 사용하지 않은 코드 게임의 현재 스테이지와 캐릭터의 정보를 가지고 있는 클래스가 있다고 가정해보자. public class ..
-
[이펙티브 자바] 아이템24. 멤버 클래스는 되도록 static으로 만들라기타/북스터디 2023. 1. 9. 12:05
1. 멤버 클래스는 무엇일까? 해당 아이템에 대해 정리하기 전에 큰 키워드인 멤버 클래스가 무엇인지 알아보자. 멤버라는 의미는 어떠한 클래스를 구성하는 요소를 의미하고 그에 따라 멤버 클래스는 어떠한 클래스를 구성하는 요소인데 그게 클래스형태인 것이다. 클래스의 멤버에는 아래와 같이 필드, 메서드, 클래스 등이 있을 수 있다. public class OuterClass { // 멤버 필드(혹은 변수) private String name; // 멤버 메서드 public void foo() { } // 멤버 클래스 public Class InnerClass { } } 더보기 (보통 비정적 멤버 클래스를 그냥 통상적으로 멤버 클래스라고 부르지만 여기서는 더 큰 의미로 해석해봤다.) - 참고자료: https:/..
-
[디자인패턴] 프록시패턴기타/북스터디 2023. 1. 8. 12:02
1. 프록시패턴(Proxy Pattern)이란? 프록시패턴은 특정한 객체의 오퍼레이션들을 접근하기 전에 프록시객체를 먼저 거치고 난 후에 접근하는 패턴이다. 프록시패턴을 적용함으로써, 클라이언트입장에서는 원래 쓰려는 객체를 직접 쓰는게 아닌 프록시객체를 거쳐서 쓰는 구조가 된다. 프록시패턴을 사용함으로서 달라지는 점은 기존코드를 건드리지 않고 프록시에 로직을 추가하여 실제 객체 접근제어, 초기화 지연, 로깅, 캐싱 등을 활용할 수 있다. 2. 프록시패턴을 적용하고자하는 상황을 가정해보자. 아래 코드는 정수기에서 물을 내려주는 것을 구현한 간단한 코드이다. public class WaterFountainService { public void comesOut() { System.out.println("물이 ..
-
[이펙티브 자바] 아이템12. toString을 항상 재정의하라기타/북스터디 2023. 1. 2. 22:00
toString메서드는 Object클래스 정의된 public method이다. 간단히 toString이 어떠한 값을 반환하는지보면 클래스의 이름@hascode를 16진수로 변환한 값을 반환해주고 있다. 실제로 코드를 작성하여 toString을 실행시켜보면 아래와 같은 결과가 나오는 것을 알 수 있다. package Item12; // 모든 클래스는 직접 extends를 통해 Object클래스 상속을 선언해주지 않아도 // 기본적으로 Object 클래스를 상속한다. public class Foo { private String name; private int code; public Foo(String name, int code) { this.name = name; this.code = code; } publ..
-
[디자인패턴] 커맨드패턴기타/북스터디 2022. 12. 25. 08:30
1. 커맨드패턴(Command Pattern)이란? 커맨드패턴이란 요청을 캡슐화하여 호출자(invoker)와 수신자(receiver)를 분리하는 패턴이다. 요청 자체를 커맨드에 캡슐화하는 것으로 커맨드 안에서는 reeciver는 누구인지, receiver는 어떠한 일을 해야하는지 등 요청을 수행하기 위한 모든 작업을 내제하고 있는 것이다. 호출자(invoker)는 캡슐화된 커맨드를 가지고 있어 execute()라는 매서드를 호출만 하면 되는 구조이다. 커맨드패턴을 사용함으로서 요청을 객체로 캡슐화해서 객체를 서로 다른 요청에 따라 매개변수화할 수 있다. 또한, 호출자(invoker)입장에서는 받은 요청이 어떠한 과정으로 처리되는지 전혀 신경을 쓸 필요가 없어진다. 2. 커맨드패턴이 필요한 상황은 언제일까..
-
[이펙티브 자바] 아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라기타/북스터디 2022. 12. 12. 21:18
1. 왜 생성자에 매개변수가 많으면 빌더를 고려해야할까? 많은 매개변수를 가지고 있는 생성자에서 선택적 매개변수가 많다면 적절히 대응하기 어렵다. -> 선택적 매개변수에 의미있는 값을 넣어주는 것이 아니라면 null, empty string, 0등의 값을 넣어줘야한다. 생성자를 호출하는 client단에서 불필요한 값을 넣어주는 것 외에 해결할 수 있는 방법은 무엇일까? 점증적 생성자 패턴(telescoping constructor pattern)을 떠올릴 수 있다. 점증적 생성자 패턴(telescoping constructor pattern)이란? 생성자를 필수 매개변수 1개만 받는 생성자, 필수 매개변수 1개와 선택 매개변수 1개를 받는 생성자, 선택 매개변수 2개를 받는 생성자 등에 형태로 매개변수 ..
-
[디자인패턴] 데코레이터 패턴기타/북스터디 2022. 12. 11. 13:51
데코레이터 패턴이란? 데코레이퍼 패턴이란 기존 코드를 변경하지 않고 부가기능을 추가하는 패턴으로 상속이 아닌 위임을 사용해서 보다 유연하게 부가기능을 추가할 수 있도록 해준다. 우리는 코드를 설계할 때에 보통 공통된 역할을 하는 클래스들이 보인다면 슈퍼클래스를 선언하여 상속을 받는 서브클래스들을 만드는 구조를 먼저 떠올린다. 하지만, 상속을 무분별하게 사용한다면 문제가 발생할 수 있다. 헤드퍼스트 디자인 패턴에 나온 예시를 보면, Beverage라는 슈퍼클래스가 있고 이를 상속받는 구체적인 음료들이 서브클래스들로 선언되어있다. 추후에 여러가지 조합을 통해 나오는 새로운 음료들도 출시가 된다면 우리는 계속 상속받는 서브클래스들을 생산해내야할 것이다. 코드를 보며 데코레이터 패턴이 필요한 상황과 데코레이터 ..