헤드퍼스트 디자인패턴 3. 데코레이터 패턴
스터디2024. 10. 22. 13:02헤드퍼스트 디자인패턴 3. 데코레이터 패턴

요약이 장에서 소개한 디자인 원칙OCP(Open-Closed Principle) 개방 폐쇄 원칙모순이라고 여겨지지만, 코드를 변경하지 않아도 시스템을 확장하게 해주는 객체지향 기법이 존재데코레이터 패턴객체에 추가 요소를 동적으로 더할 수 있게 해주는 패턴데코레이터를 사용해 서브 클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있음문제 상황아래와 같은 커피 전문점의 주문 시스템이 존재한다. 위 시스템에 메뉴를 추가하게 되면,, 아래와 같은 상황이 펼쳐진다.주로 다음과 변경 사항이 발생했다.첨가물 (우유, 휘핑 등) 의 추가첨가물 가격 변동베이스가 되는 메뉴 자체의 추가메뉴 변동이러한 문제를 데코레이터 패턴을 사용해 해결해보자.데코레이터 패턴을 사용하면 위와 같이 구조를 설계할 수 있다. 인터페이스인 ..

헤드퍼스트 디자인패턴 2. 옵저버 패턴
스터디2024. 10. 9. 09:04헤드퍼스트 디자인패턴 2. 옵저버 패턴

도입이 장에서 소개한 디자인 원칙상호작용하는 객체 사이에는 가능하면 느슨한 결합을 사용해야 한다.옵저버 패턴한 객체의상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고, 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의하는 패턴기상 모니터링 서비스 만들기요구사항기상 스테이션이 습도, 온도, 기압을 측정타사에서 제공하는 WeatherData 객체를 통해 측정 값을 얻을 수 있음최신 측정 값을 반영한 3가지 종류의 디스플레이(현재 상태, 예보 등)를 만들어어 함최초 구현 코드public void measurementsChanged() { float temp = getTemperature(); float humidity = getHimidity(); float pressure = ge..

헤드퍼스트 디자인패턴 1. 전략 패턴
스터디2024. 10. 3. 10:29헤드퍼스트 디자인패턴 1. 전략 패턴

도입소프트웨어 개발 불변의 진리어떤 프로그래밍 언어로 어떤 개발을 하든 변하지 않는 것은 소프트웨어는 변화한다는 사실이 장에서 소개한 디자인 원칙들이 원칙들을 지키는 방향으로 오리 시뮬레이션 게임을 리팩토링한다애플리케이션에서 달라지는 부분을 찾아내 캡슐화하고, 달라지지 않는 부분과 분리한다코드 변경 과정에서 의도치 않게 발생하는 일을 줄이며 시스템의 유연성을 향상시킬 수 있다구현보다는 인터페이스에 맞춰서 프로그래밍한다구현체를 참조하거나, 클라이언트에서 직접 구현하지 않는다클라이언트는 인터페이스만 참조다시말하면, ‘상위 형식에 맞춰서 프로그래밍한다’ 는 뜻상속보다는 구성(composition)을 활용한다오리 시뮬레이션 게임에 추가된 요구사항다른 게임회사를 날려버리기 위해 Duck 을 날 수 있게 만들어라!..

[이펙티브 자바] Item 23 - 태그 달린 클래스보다는 클래스 계층구조를 활용하라
스터디/자바2023. 6. 20. 21:39[이펙티브 자바] Item 23 - 태그 달린 클래스보다는 클래스 계층구조를 활용하라

태그 달린 클래스 아래와 같이 내부적으로 특정 필드 (태그 역할)을 갖고 이 필드에 값에 따라 다른 동작을 수행하는 클래스를 책에선 '태그 달린 클래스'라고 표현하고 있다. public class Figure { public enum Shape {RECTANGLE, CIRCLE}; private final Shape shape; // 태그 // RECTANGLE용 필드 private double length; private double width; // CIRCLE용 필드 private double radius; // RECTANGLE용 생성자 public Figure(double length, width) { ... } // CIRCLE용 생성자 public Figure(double radius) { ..

[이펙티브 자바] Item 22 - 인터페이스는 타입을 정의하는 용도로만 사용하라
스터디/자바2023. 6. 20. 20:41[이펙티브 자바] Item 22 - 인터페이스는 타입을 정의하는 용도로만 사용하라

인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입의 역할을 수행한다. Item 22는 인터페이스를 오직 이 용도로만 사용하라고 조언한다. 예를 들어 아래와 같이 아무런 메서드가 선언되어 있지 않은 인터페이스에 상수만 선언해 사용하면 안 된다. (상수 인터페이스 패턴) public interface SomeConstants { int VALUE_ONE = 0; int VALUE_TWO = 1; } 이러한 용도로 인터페이스를 사용하게 되면 내부 구현이 외부로 그대로 노출되는 것이므로 (인터페이스의 상수는 무조건 public static final) 지양해야 한다. 인터페이스의 목적에 맞지 않는 사용법이라고 할 수 있을 것 같다. 또한 상수를 편하게 사용하기 위해 클라이언트가 인터페이스를 구..

[이펙티브 자바] Item 19 - 상속을 고려해 설계하고 문서화하라 그러지 않았다면 상속을 금지하라
스터디/자바2023. 6. 20. 19:08[이펙티브 자바] Item 19 - 상속을 고려해 설계하고 문서화하라 그러지 않았다면 상속을 금지하라

상속을 위한 문서화 상속을 위한 문서화란 상속이 가능한 클래스의 재정의 가능 메서드에 해당 메서드를 내부적으로 어떻게 이용하고 있는지, 그래서 어떤 식으로 동작하도록 구현되어야 하는지 문서로 남겨두는 것을 말한다. 이렇게 해야 하는 이유는 클래스를 상속받아 구현된 클래스에서 해당 메서드를 부모 클래스에서의 의도와 다르게 구현할 경우 의도치 않은 동작으로 이어질 수 있기 때문이다. 자바 API에서는 이러한 문서를 Implementation Requirements (코드에선 @ImplSpec)라는 항목으로 문서화하여 제공하고 있다. 아래는 AbstractCollection.remove() 메서드 일부이다. 이를 통해 Abstract iterator()가 반환하는 Iterator의 remove() 동작을 임의..

[이펙티브 자바] Item 13 - clone 재정의는 주의해서 진행하라
스터디/자바2023. 6. 19. 20:30[이펙티브 자바] Item 13 - clone 재정의는 주의해서 진행하라

아이템 13에서는 객체의 복제를 위해 사용하는 Object.clone() 메서드를 제대로 재정의하기 위해서는 어떻게 해야 하는지에 대해 설명하고 있다. 또한, Object.clone() 이 동작하도록 하기 위해 구현해야 하는 Cloneable 인터페이스의 문제점에 대해 이야기하고 결론적으로는 새로운 인터페이스/클래스는 절대 Cloneable을 확장/구현하면 안 되고, 객체의 복제 기능을 구현하기 위해서는 생성자와 팩토리를 사용해야 한다는 조언을 하고 있다. Object.clone()과 Cloneable의 동작 방식 먼저 이 메서드의 동작 방식에 대해 알아보자. 일반적인 경우와 달리 이 메서드는 선언은 Object 클래스에 되어있지만 빈 인터페이스인 Cloneable을 구현해야만 제대로 작동하도록 설계되어..

[이펙티브 자바] Item 10 - equals는 일반 규약을 지켜 재정의하라
스터디/자바2023. 6. 8. 21:46[이펙티브 자바] Item 10 - equals는 일반 규약을 지켜 재정의하라

아이템 10번은 equals를 재정의할 때 지켜야 할 규칙들과 주의해야 하는 점들에 대해 설명하고 있다. 자바에서 equals()를 재정의하지 않으면 오직 자기 자신의 인스턴스와만 같게 되기 때문에 필요한 경우 equals() 메서드를 재정의해서 사용해야 한다. 책에서는 equals가 만족해야 하는 규칙들 모두에 대해 상황을 제시해 예제 코드로 설명하고 있지만 이를 모두 정리할 필요는 없을 것 같아 중요한 내용만 옮겼으니 자세한 내용은 책을 참고하시길 바랍니다. equals가 필요 없는 상황 equals() 를 재정의해서 불필요한 문제가 발생할 수도 있으므로 아래의 경우에 해당된다면 equals()를 아예 재정의하지 않는 것도 좋은 방법이다. 이 경우 기본 Object.equals() 가 호출되어 (주소..

[이펙티브 자바] Item 7 - 다 쓴 객체 참조를 해제하라
스터디/자바2023. 5. 23. 12:18[이펙티브 자바] Item 7 - 다 쓴 객체 참조를 해제하라

개요 자바는 가비지 컬렉터가 있으므로 메모리 관리에 전혀 신경쓰지 않아도 된다고 생각하지만 이는 사실이 아니다! 예를 들어 스택을 아래와 같이 구현하면 지속적인 메모리 누수가 발생해 프로그램이 종료될 수도 있다. public class Stack { private Object[] elements; private int size = 0; // 생성자 public void push(Object obj) { ensureCapacity(); // 배열이 모자라면 늘리기 elements[size++] = obj; } public Object pop() { if (size == 0) { throw new EmptyStackException(); } return elements[--size]; } } 위와 같은 스택..

[이펙티브 자바] Item 4 - 인스턴스화를 막으려거든 private 생성자를 사용하라
스터디/자바2023. 5. 17. 21:23[이펙티브 자바] Item 4 - 인스턴스화를 막으려거든 private 생성자를 사용하라

개요 정적 메서드와 정적 필드만을 담은 클래스는 객체 지향적으로 보이지 않긴하지만 자바 API의 Arrays나 Collections가 그런 것처럼 특정 인터페이스를 구현하는 객체의 정적 팩토리 메서드를 넣어둘 수도 있고 (자바 8부터는 인터페이스에서도 가능) 상속이 불가능한 final 클래스와 관련된 메서드를 구현하고 모아둘 때도 사용한다. 이러한 클래스는 인스턴스로 만들어 쓰려고 설계한게 아니다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다. 컴파일 전 public class UtilClass { private static int value = 0; public static int getValue() { return value; } } 컴파일 후 public class ..

image