본문 바로가기

전체 글128

오브젝트 15 - 디자인 패턴과 프레임워크 오브젝트 15 - 디자인 패턴과 프레임워크 디자인 패턴 : 소프트웨어 설계에서 반복적으로 발생하는 문제에 대해 반복적으로 적용할 수 있는 해결 방법 디자인 패턴의 목적은 설계를 재사용하는 것 프레임워크 : 설계와 코드를 함께 재사용하기 위한 것 프레임워크는 애플리케이션의 아키텍처를 구현 코드의 형태로 제공한다. 디자인 패턴과 프레임워크 모두 협력을 일관성 있게 만들기 위한 방법이다. 15.1 디자인 패턴과 설계 재사용 패턴이란 무엇인가? 패턴은 반복적으로 발생하는 문제와 해법의 쌍으로 정의된다. 패턴을 사용함으로써 이미 알려진 문제와 이에 대한 해법을 문서로 정리할 수 있으며, 이 지식을 다른 사람과 의사소통할 수 있다. 패턴은 추상적인 원칙과 실제 코드 작성 사이의 간극을 메워주며 실질적인 코드 작성을.. 2024. 4. 16.
오브젝트 14 - 일관성 있는 협력 오브젝트 14 - 일관성 있는 협력 14.1 핸드폰 과금 시스템 변경하기 14.1.1 기본 정책 확장 핸드폰 과금 시스템을 4가지 방식으로 확장해보자 새롭게 구현할 클래스 구조는 아래와 같다. 14.1.2 고정요금 방식 구현하기 고정 요금 방식은 기존의 일반요금제와 동일하므로 기존 RegularPolicy 클래스 이름을 FixedFeePolicy로 수정하면 된다. 14.1.3 시간대별 방식 구현하기 날짜별로 요금을 분리 후, 시간대별로 요금을 구해야한다. 시간대별 방식을 구현하는데 핵심은 규칙에 따라 통화 시간을 분할하는 방법을 결정하는 것이다. 이를 위해 DateTimeInterval 클래스를 추가하자 public class DateTimelnterval { private LocalDateTime fr.. 2024. 4. 15.
오브젝트 13 - 서브클래싱과 서브타이핑 오브젝트 13 - 서브클래싱과 서브타이핑 상속의 첫번째 용도는 타입 계층을 구현하는 것이다. 계층 안에서 부모 클래스는 일반적인 개념을 구현하고 자식 클래스는 특수한 개념을 구현한다. 상속의 두번째 용도는 코드 재사용이다. 간단한 선언만으로 부모 클래스의 코드를 재사용할 수 있다. 그러나 부모 클래스와 자식 클래스가 강결합 된다. 상속의 사용의 목표는 코드 재사용이 아닌 타입 계층을 구현하는 것이어야한다. 13.1 타입 13.1.1 개념 관점의 타입 개념 관점에서 타입이란 우리가 인지하는 세상의 사물의 종류를 의미한다. 어떤 대상이 타입으로 분류될 때 그 대상을 타입의 인스턴스라고 부른다. 일반적으로 타입의 인스턴스를 객체라고 부른다. 13.1.2 프로그래밍 언어 관점의 타입 프로그래밍 언어 관점에서 타.. 2024. 4. 9.
오브젝트 12 - 다형성 오브젝트 12 - 다형성 12.1 다형성 다형성이란 많은 형태를 가질 수 있는 능력을 의미한다. 컴퓨터 과학에서는 다형성을 하나의 추상 인터페이스에 대해 서로 다른 구현을 연결할 수 있는 능력으로 정의한다. 즉, 다형성은 여러 타입을 대상으로 동작할 수 있는 코드를 작성할 수 있는 방법이다. 객체 지향 프로그래밍에서 다형성은 아래와 같이 분류할 수 있다. 1. 오버로딩 다형성 하나의 클래스 안에 동일한 이름의 메서드가 존재하는 경우를 가리켜 오버로딩 다형성이라고 한다. 메서드 오버로딩을 사용하면 하나의 이름만 기억하면 된다. 이는 유사한 작업을 수행하는 메서드의 이름을 통일할 수 있어 기억해야 하는 이름의 수를 극적으로 줄일 수 있다. public class Money { public Money plus.. 2024. 4. 2.
오브젝트 11 - 합성과 유연한 설계 오브젝트 11 - 합성과 유연한 설계 상속은 부모 클래스와 자식 클래스를 연결해서 부모 클래스의 코드를 재사용한다. 합성은 전체를 표현하는 객체가 부분을 표현하는 객체를 포함해서 부분 객체의 코드를 재사용한다. 상속에서의 의존성은 컴파일타임에 해결된다. 합성에서의 의존성은 런타임에 해결된다. 11.1 상속을 합성으로 변경하기 코드 재사용을 위해 상속을 남용하면 아래와 같은 세가지 문제점에 직면한다. 불필요한 인터페이스 상속 문제 - 자식 클래스에게는 부적합한 부모 클래스의 오퍼레이션이 상속된다. 메서드 오버라이딩의 오작용 문제 - 자식 클래스가 부모 클래스의 메서드를 오버라이딩할 때 자식 클래스가 부모 클래스의 메서드 호출 방법에 영향을 받는다. 부모 클래스와 자식 클래스의 동시 수정 문제 - 부모 클래.. 2024. 3. 26.
오브젝트 10 - 상속과 코드 재사용 오브젝트 10 - 상속과 코드 재사용 10.1 상속과 중복 코드 10.1.1 DRY 원칙 (Don't Repeat Yourself) 중복 코드를 제거해야하는 가장 큰 이유는, 중복 코드는 변경을 방해한다. 중복 여부를 판단하는 기준은 변경이다. 요구사항이 변경됐을 때 두 코드를 함께 수정해야 한다면 이 코드는 중복이다. 신뢰할 수 있고 수정하기 쉬운 소프트웨어를 만드는 효과적인 방법 중 하나는 중복을 제거하는 것이다. 10.1.2 중복과 변경 중복코드 살펴보기 일반 요금제와 심야 할인 요금제가 필요하다. public class Phone { private Money amount; private Duration seconds; private List calls = new Arraylist(); public.. 2024. 3. 26.
오브젝트 09 - 유연한 설계 오브젝트 09 - 유연한 설계 9.4 의존성 역전 원칙 9.4.1 추상화와 의존성 역전 public class Movie { private AmountDiscountPolicy discountPolicy; } 상위 수준 클래스인 Movie가 하위 수준 클래스인 AmountDiscountPolicy에 의존하고 있다. 상위 수준의 클래스가 하위 수준의 클래스에 의존하면 하위 수준의 변경에 의해 상위 수준 클래스가 영향을 받는다. 의존성 방향은 상위에서 하위로 흘러야 한다. 위와 같은 코드는 클래스의 결합도가 높아지고 재사용성과 유연성이 저해된다. Movie와 AmountDiscountPolicy 모두 추상화에 의존하도록 수정해 문제를 해결할 수 있다. 하위 클래스 변경이 상위 클래스에 영향을 주는 것을 방지.. 2024. 3. 25.
오브젝트 07 - 객체 분해 오브젝트 07 - 객체 분해 가장 일반적인 추상화 방법은 한 번에 다뤄야 하는 문제의 크기를 줄이는 것이다. 사람들은 한 번에 해결하기 어려운 커다란 문제에 맞닥뜨릴 경우 해결 가능한 작은 문제로 나누는 경향이 있다. 이렇게 나눠진 문제들 역시 한 번에 해결하기 어려울 정도로 크다면 다시 더 작은 문제로 나눌 수 있다. 이처럼 큰 문제를 해결 가능한 작은 문제로 나누는 작업을 분해(decomposition)라고 부른다. 7.1 프로시저 추상화와 데이터 추상화 현대적인 프로그래밍 언어를 특징 짓는 중요한 두가지 추상화 메커니즘은 프로시저 추상화와 데이터 추상화다. 프로시저 추상화는 소프트웨어가 무엇을 해야 하는지를 추상화한다. 데이터 추상화는 소프트웨어가 무엇을 알아야 하는지를 추상화한다. 소프트웨어는 데.. 2024. 3. 5.
오브젝트 06 - 메시지와 인터페이스 06 오브젝트 - 메시지와 인터페이스 훌륭한 객체지향 코드를 얻기 위해서는 클래스가 아니라 객체를 지향해야 한다. 더 정확히는, 협력 안에서 객체가 수행하는 책임에 초점을 맞춰야 한다. 객체지향 애플리케이션의 가장 중요한 재료는 클래스가 아니라 객체들이 주고받는 메시지다. 6.1 협력과 메시지 6.1.1 클라이언트-서버 모델 협력은 어떤 객체가 다른 객체에게 무언가 요청할 때 시작된다. 객체가 다른 객체에게 접근할 수 있는 유일한 방법은 메시지를 전송하는 것뿐이다. 두 객체 사이의 협력 관계를 설명하기 위해 전통적으로 클라이언트-서버 모델이라는 메타포를 사용한다. 협력안에서 메시지를 전송하는 객체를 클라이언트, 메시지를 수신하는 객체를 서버라고 부른다. 객체는 협력에 참여하는 동안 클라이언트와 서버의 역.. 2024. 2. 26.
728x90
반응형