[오브젝트] 15장_디자인 패턴과 프레임워크

  1. 디자인 패턴
    특정한 변경을 일관성있게 다룰 수 있는 협력 텝플릿 제공한다.
    설계를 재사용하는 것이 목적이다.

  2. 프레임워크
    특정한 변경을 일관성 있게 다룰 수 있는 확장 가능한 코드 템플릿을 제공한다.
    설계와 코드를 함께 재사용하기 위한 것이 목적이다.

디자인 패턴과 설계 재사용

소프트웨어 패턴

패턴의 특징은,

  1. 반복적으로 발생하는 문제와 해법의 쌍으로 정의된다.
  2. 이미 알려진 문제와 이에 대한 해법을 문서로 정리할 수 있고, 다른 사람과 의사소통 가능하다.
  3. 추상적인 원칙과 실제 코드 작성 사이의 간극을 메워준다. 실질적인 코드 작성을 돕는다.
  4. 패턴은 실무에서 탄생했다.

마틴 파울러에 의하면, 패턴은 하나의 실무 컨텍스트에서 유용하게 사용해왔고 다른 실무 컨텍스트에도 유용할 것이라고 예상되는 아이디어다.
프로젝트 조직을 구성하는 방법, 프로젝트 일정을 추정하는 방법 등 반복적인 규칙을 발견할 수 있는 모든 영역이 패턴의 대상이다.

패턴 분류

  1. 디자인 패턴
    일반적인 설계 문제를 해결한다.
    협력하는 컴포넌트들 사이에서 반복적으로 발생하는 구조를 서술한다.

  2. 아키텍쳐 패턴
    디자인 패턴의 상위에 있다.
    소프트웨어의 전체적인 구조를 결정한다.

  3. 이디엄
    디자인 패턴의 하위에 있다.
    특정 프로그래밍 언어에만 국한된 하위 레벨 패턴이다.
    예를 들어, C++ 의 COUNT POINT 이디엄은 자바에서는 유용하지 않다.

  4. 분석 패턴
    도메인 내의 개념적인 문제를 해결한다.

패턴과 책임-주도 설계

객체지향 설계에서 중요한 일을 다시 정리해보자.
바로, 올바른 책임을 올바른 객체에게 할당하고 객체 간의 유연한 협력 관계를 구축하는 것이다.

Read more

[카프카] 8장_카프카 스트림즈 API

카프카 스트림즈 API 를 통해 스트림을 처리하는 방법을 정리한다.

기본 개념

스트림 프로세싱과 배치 프로세싱

오늘날 데이터 분석 시스템은 스트림 처리 시스템과 배치 처리 시스템을 모두 갖추어서 실시간과 정확성을 보장한다.

  1. 스트림 프로세싱
    데이터들이 지속적으로 유입되고 나가는 과정에서 데이터에 대한 분석이나 질의를 수행하는 것이다.
    데이터가 분석 시스템이나 프로그램에 도달하자마자 처리를 해서 실시간 분석이라고도 한다.

  2. 배치 처리
    이미 저장된 데이터를 기반으로 분석이나 질의를 수행하고 특정 시간에 처리하는 것이다.

스티름 프로세싱의 장점은,

  1. 이벤트 발생, 분석, 조치에 지연시간이 없기 때문에, 최신의 데이터를 반영한다.
  2. 데이터 저장 후 분석을 하지 않으므로, 정적 분석보다 더 많은 데이터를 분석할 수 있다.
  3. 시간에 따라 지속적으로 유입되는 데이터 분석에 최적화되어 있다.
  4. 대규모 공유 데이터베이스에 대한 요구를 줄일 수 있어 인프라에 독립적으로 수행될 수 있다.

상태 기반 스트림 처리, 무상태 스트림 처리

  1. 상태 기반 스트림 처리
    이전 스트림을 처리한 결과를 참조하는 방식의 처리이다.
    애플리케이션에서 각각의 이벤트를 처리하고 결과를 저장할 상태 저장소가 필요하다.

  2. 무상태 스트림 처리
    이전 스트림의 처리 결과와 관계 없이, 현재 애플리케이션에 도달한 스트림만을 기준으로 처리한다.

카프카 스트림즈의 특징과 개념

Read more

[오브젝트] 14장_일관성 있는 협력

핸드폰 과금 시스템 변경하기

기본 정책 확장

  1. 고정 요금 방식 (ex) 10초당 18원
  2. 시간대별 방식 (ex) 00시-19시 : 10초당 19월, 19시-24시 : 10초당 15원
  3. 요일별 방식 (ex) 평일 : 10초당 38원, 공휴일 : 10초당 19원
  4. 구간별 방식 (ex) 초기 1분 : 10초당 50원, 초기 1분 이후 : 10초당 20원

고정 요금 방식 구현하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class FixedFeePolicy extends BasicRatePolicy {
private Money amount;
private Duration duration;

public FixedFeePolicy(Money amount, Duration duration) {
this.amount = amount;
this.duration = duration;
}

@Override
protected Money calculateCallFee(Call call) {
return amount.times(call.getDuration().getSeconds() / seconds.getSeconds());
}
}

시간대별 방식 구현하기

아래 클래스에서 가장 중요한 것은, 시간에 따라 서로 다른 요금 규칙을 정의하는 방법을 결정하는 것이다.
이를 위해 서로 다른 List 를 가질 수 있다.
같은 규칙에 포함된 요소들은 List 의 동일한 인덱스에 위치한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class TimeOfDayDiscountPolicy extends BasicRatePolicy {
private List<LocalTime> starts = new ArrayList<>();
private List<LocalTime> ends = new ArrayList<>();
private List<LocalTime> duration = new ArrayList<>();
private List<Money> amounts = new ArrayList<>();

@Override
protected Money calculateCallFee(Call call) {
...
}

...
}

요일별 방식 구현하기

Read more

[오브젝트] 13장_서브클래싱과 서브타이핑

상속의 두가지 용도는 다음과 같다.

  1. 타입 계층 구현

    동일한 메세지에 대해 서로 다르게 행동할 수 있는 다형적인 객체를 구현하기 위해서는 객체의 행동을 기반으로 타입 계층을 구성해야한다.

  2. 코드 재사용

    부모 클래스와 자식 클래스가 강하게 결합되기 때문에 변경하기 어려운 코드를 얻게 된다.

01 타입

타입을 세 가지 관점으로 정리하자.

개념 관점의 타입
  1. 타입

    우리가 인지하는 세상의 사물의 종류를 의미한다.

    자바, 루비, C 를 프로그래밍 언어로가 부를 때, 이것들을 프로그래밍 언어라는 타입으로 분류하고 있는 것이다.

  2. 인스턴스

    어떤 대상이 타입으로 분류될 때 그 대상을 타입의 인스턴스라고 한다.

    자바, 루비, C 는 프로그래밍 언어의 인스턴스이다.

프로그래밍 언어 관점의 타입

하드웨어는 데이터를 0과 1로 구성된 일련의 비트 조합으로 취급한다.

프로그래밍 언어 관점의 타입은, 비트 묶음에 의미를 부여하기 위해 정의된 제약과 규칙을 의미한다.

타입은 두가지 목적으로 사용된다.

Read more

[오브젝트] 12장_다형성

상속의 진정한 목적은 코드 재사용이 아니라 다형성을 위한 서브타입 계층을 구축 하는 것이다.

상속의 관점에서 다형성이 구현되는 기술적인 메커니즘을 정리한다.

01 다형성

다형성(Polymorphism) 은 다음 둘의 합성어이다. 즉, 많은 형태를 가질 수 있는 능력이다.

  • ploy : 많은
  • morph : 형태

다형성은 다음과 같이 분류될 수 있다. 이번장은 포함 다형성에 대해 다룬다.

  • 유니버셜 다형성

    • 매개변수 다형성

      클래스의 인스턴스 변수나 메서드의 매개변수 타입을 임의의 타입으로 선언한 후 사용하는 시점에 구체적인 타입으로 지정하는 방식.

      ex) List 인터페이스는 컬렉션에 보관할 요소의 타입을 임의의 타입 T로 지정하고 있으며 실제 인스턴스를 생성하는 시점에 T 를 구체적인 타입으로 지정

    • 포함 다형성 (서브타입 다형성)

      메세지가 동일해도 수신한 객체의 타입에 따라 실제로 수행되는 행동이 달라지는 능력.

  • 임시 다형성

    • 오버로딩 다형성

      하나의 클래스 안에 동일한 이름의 메서드가 존재하는 경우.

    • 강제 다형성

      자동적인 타입 변환이나 사용자가 직접 구현한 타입 변환을 이용해 동일한 연산자를 다양한 타입에 사용할수 있는 방식.

      ex) 이항 연산자인 ‘+’ 는 피연산자가 하나는 정수형이고 다른 하나는 문자열인 경우, 정수형 피연산자는 문자열 타입으로 강제 형변환

02 상속의 양면성

  1. 데이터 관점의 상속

    부모 클래스에서 정의한 모든 데이터를 자식 클래스의 인스턴스에 자동으로 포함한다.

  2. 행동 관점의 상속

    데이터뿐만 아니라 부모 클래스에서 정의한 일부 메서드 역시 자동으로 자식 클래스에 포함한다.

    외부의 객체가 부모 클래스의 인스턴스에 전송할 수 있는 모든 메세지는 자식 클래스의 인스턴스에도 전송할 수 있다.

상속을 사용한 강의 평가
Read more