분류 전체보기 1341

Ch03. 객체지향 기본 원칙 - 표현적 차이 줄이기

알고리즘과 절차적인/객체지향 설계 절차적인 설계: 알고리즘의 각 단계를 단일 클래스 안에 실행 순서대로 배치객체지향 설계: 알고리즘의 각 단계를 책임 관점에서 여러 객체로 분배도메인 모델도메인 안에 존재하는 중요한 개념과 관계를 모아서 이해하기 쉽게 추상화시킨 것을 도메인 모델이라고 한다.여기서 추상화는 우리의 필요에 맞는 부분만 취하고 필요 없는 부분은 생략해서 단순화시킨 것을 의미한다.도메인 모델 안에 포함된 개념과 관계는 객체지향 설계에서 책임을 할당받을 객체의 이름과 관계에 대한 중요한 힌트를 제공한다.책임을 할당할 후보 객체를 찾을 떄 가장 먼저 참고할 수 있는 재료가 도메인 모델이 된다. 이유? 표현적 차이(도메인에 대한 개념적 모델과 소프트웨어 구현 사이의 거리)를 줄이기 때문표현적 차이를 ..

오브젝트 2024.10.01

Ch03. 객체지향 기본 원칙 - 책임 주도 설계

객체를 설계하기 위해서는 협력에 필요한 행동을 제일 먼저 결정하고 행동을 수행하기에 적합한 객체를 선택한 후에 객체의 행동을 구현하는데 필요한 데이터를 나중에 선택해야 한다. 객체지향 설계 흐름하나의 객체를 설계하기 위해서는 우선 설계를 위한 문맥이 필요하다(협력을 위한 문맥 결정) 객체가 다른 객체와 협력하기 위해 보내는 요청을 객체를 설계하기 위한 문맥으로 활용요청을 처리하기 위한 책임을 결정(필요한 책임 식별)책임을 수행하는데 적합한 객체를 선택(책임 수행 객체 선택)객체 안에 책임을 부여(책임 구현)클래스와 메서드를 이용해서 구현책임을 부연하는데 필요한 데이터를 결정하고 클래스의 필드로 정의(데이터 결정)책임객체지향에서는 협력에 참여하기 위해 한 객체가 다른 객체에게 제공하는 행동을 책임이라고 한..

오브젝트 2024.10.01

Ch03. 객체지향 기본 원칙 - 객체지향 설계 원칙

설계가 필요한 이유 : 요구사항이 변경될 때 코드를 쉽고 안전하게 수정하기 위해 필요하다. 객체지향의 설계 방식으로 변경한 이유 역시 코드를 쉽고 안전하게 수정하기 위해서이다. 즉, 객체지향 설계를 이해하기 위한 첫걸음은 객체지향의 모든 원칙은 변경을 중심에 두고 있다는 사실을 이해하는 것이다.객체지향 설계 원칙협력에 필요한 행동을 먼저 결정하고 행동에 적합한 객체를 나중에 선택하라객체의 행동을 먼저 구현하고 행동에 필요한 데이터를 나중에 선택하라협력에 필요한 행동을 먼저 결정하고 행동에 적합한 객체를 나중에 선택하라절차지향 방식에서의 설계(추측에 의한 설계)는 사용될 목록을 고려하지 않고 데이터를 설계하기 때문에 모든 경우에 사용 가능하도록 Getter와 Setter를 추가했다.겉으로는 필드를 캡슐화한..

오브젝트 2024.10.01

Ch02. 절차적인 설계 개선하기 - 절차에서 객체로

도메인 구조를 이용해서 의존성 제어하기Reservation Service가 Discount Policy와 Discount Condition 둘 중 하나에만 의존하도록 구조를 수정할인 정책과 할인 조건을 도메인에 표현된 구조에 따라 연결하고 ReservationService가 DiscountPolicy 정책만 참조하도록 구조를 조절하면 의존하는 객체의 수를 줄일 수 있다.Reservation Service는 이제 DiscountPolicy의 변경에만 영향을 받기 때문에 더 안정적인 구조를 만들 수 있다.의존성 관리DiscountPolicy가 DiscountCondition을 숨기는 캡슐화 경계를 형성한다.DiscountPolicy를 이용해 DiscountCondition을 캡슐화 했기 때문에 Reserva..

오브젝트 2024.09.29

Ch02. 절차적인 설계 개선하기 - 데이터와 프로세스 통합하기

데이터와 프로세스 통합다른 클래스의 데이터를 사용하여 의사 결정을 하거나 데이터를 제공한 클래스의 상태를 변경하는 로직이 있다면, 데이터를 보유한 클래스 쪽으로 옮겨야 한다.데이터를 사용하는 로직을 데이터를 보유한 클래스 쪽으로 옮기면 데이터가 수정될 때 변경의 영향 범위를 데이터 클래스 내부로 제한할 수 있게 된다.클래스 수정에 용이이처럼 데이터를 사용하는 로직을 데이터를 보유한 클래스 쪽으로 이동시키는 작업을 객체지향에서는 책임의 이동이라고 한다.데이터와 객체로직에 특성에 따라서 클래스의 인스턴스는 데이터가 될 수 있고, 객체가 될 수도 있다.로직이 클래스의 인스턴스를 수동적인 존재로 만든다면 클래스의 인스턴스는 데이터가 된다.로직이 클래스의 인스턴스를 능동적인 존재로 만든다면 클래스의 인스턴스는 객..

오브젝트 2024.09.29

Ch02. 절차적인 설계 개선하기 - 변경과 의존성

절차적인 설계의 문제점데이터를 구현한 코드를 수정에 취약하다.절차적인 방식에서는 여러 프로세스가 데이터를 공유하기 때문에 데이터가 바뀌면 데이터에 의존하는 하나 이상의 프로세스가 동시에 수정되는 문제가 발생한다.조합조건이 추가가 된다면, 할인 조건을 처리하는 프로세스가 수정이 되어야 한다.조합 조건이 추가가 되어 데이터인 DiscountCondition이 수정이 되어야 하고, 그 영향으로 데이터를 사용하는 프로세스가 수정이 되어야 한다.코드개선 작업 진행 시에도 프로세스가 수정이 되어야 한다(ex. 시간 범위 수정)DiscountCondition의 startTime, endTime 필드를 명시적인 시간 범위를 지정하는 interval이라는 필드로 변경 시, 이를 사용하고 있는 프로세스에서도 수정이 되어야..

오브젝트 2024.09.29

Ch02. 절차적인 설계 개선하기 - 절차적인 설계

절차적프로그램을 구성하는 데이터와 프로세스를 개별적인 모듈로 분류해서 구현하는 방식을 의미절차적인 방식으로 코드를 작성할 때는 데이터를 먼저 정의하고 데이터를 사용하는 프로세스를 나중에 설계한다.데이터를 저장할 클래스대부분의 시스템은 데이터를 관계형 데이터베이스에 저장하기 때문에 테이블과 컬럼, 테이블 사이의 관계를 이용해서 데이터와의 관계를 정의한다.객체지향 언어에서는 데이터를 객체 안에 보관하기 때문에 클래스를 이용해서 데이터를 저장할 코드를 구현할 수 있다.클래스는 일반적으로 테이블당 하나씩 추가하고 테이블의 컬럼별로 하나의 필드를 대응시키는 방식으로 구현한다.private 키워드를 통해 다른 클래스가 해당 필드를 직접 접근하는 것을 막을 수 있다(캡슐화)public 메서드를 통해 필드를 간접적으로..

오브젝트 2024.09.29

Ch12. 스레드 풀과 Executor 프레임워크 - Executor 프레임워크와 ExecutorService

Executor 프레임워크의 주요 구성 요소 Executor 인터페이스public interface Executor { /** * Executes the given command at some time in the future. The command * may execute in a new thread, in a pooled thread, or in the calling * thread, at the discretion of the {@code Executor} implementation. * * @param command the runnable task * @throws RejectedExecutionException if this task cannot..

Ch12. 스레드 풀과 Executor 프레임워크 - 스레드를 직접 사용할 때의 문제

실무에서 스레드를 직접 생성해서 사용하면 다음과 같은 3가지 문제가 있다.스레드 생성 시간으로 인한 성능 문제스레드 관리 문제Runnable 인터페이스의 불편함스레드 생성 시간으로 인한 성능 문제스레드를 사용하려면 먼저 스레드를 생성해야 한다. 그런데 스레드는 다음과 같은 이유로 매우 무겁다.메모리 할당 각 스레드는 자신만의 호출 스택(call stack)을 가지고 있어야 한다. 이 호출 스택은 스레드가 실행되는 동안 사용하는 메모리 공간이다. 따라서 스레드를 생성할 때는 이 호출 스택을 위한 메모리를 할당해야 한다.운영체제 자원 사용스레드를 생성하는 작업은 운영체제 커널 수준에서 이루어지며, 시스템 콜(system call)을 통해 처리된다. 이는 CPU와 메모리 리소스를 소모하는 작업이다.운영체제 스..

Ch01. 영화 예매 도메인

도메인: 사용자가 프로그램을 사용하는 주제 영역 -> 소프트웨어로 구현할 요구사항의 범위모든 요구사항은 코드로 구현할 수 없으며, 불필요한 요구사항을 제외한 영역을 도메인이라고 한다.예) 배달 음식위와 같은 음식 배달 과정이 존재한다면, 이중 애플리케이션에 구현해야 할 항목을 선택해야 한다.선택된 요구사항들이 도메인이 된다.다음으로 요구사항을 분석해야 하며, 도메인 안에 중요한 개념들을 기반으로 객체들을 식별할 수 있다.영화 예매 도메인핵심 도메인은 영화이며, 상영(사용자들이 특정 시간에 영화를 볼 수 있는 정보), 할인 정책(금액 할인 정책: 동일 금액 할인/비율 할인 정책: 영화 정가 금액 대비 일정 비율 할인), 할인 조건(순서 조건: 회차 기준 할인 여부 결정, 기간 조건: 상영 시작 시간 기준 ..

오브젝트 2024.09.15