정리 이번 장의 목표 포함 다형성의 관점에서 런타임에 상속 계층 안에서 적절한 메서드를 선택하는 방법을 이해하는 것이다. 다형성 하나의 추상 인터페이스에 대해 코드를 작성하고 이 추상 인터페이스에 대해 서로 다른 구현을 연결할 수 있는 능력이다[Czarnecki00]. 다형성은 런타임에 메시지를 처리하기에 적합한 메서드를 동적으로 탐색하는 과정을 통해 구현되며, 상속이 이런 메서드를 찾기 위한 일종의 탐색 경로를 클래스 계층의 형태로 구현하기 위한 방법이다. 객체지향 프로그래밍에서 사용하는 다형성은 다음으로 분류된다. 유니버셜 다형성 매개변수 다형성 포함 다형성(a.k.a. 서브타입 다형성) 임시 다형성 오버로딩 다형성 강제 다형성 매개변수 다형성 클래스의 인스턴스 변수나 메서드의 매개변수 타입을 임의의..
독서/오브젝트(조영호 저)
정리 객체지향 설계란 의존성을 관리하는 것이고 객체가 변화를 받아들일 수 있게 의존성을 정리하는 기술이라고 할 수 있다[Metz12]. 변경과 의존성 의존성이란 의존하고 있는 대상의 변경에 영향을 받을 수 있는 가능성이다. 어떤 객체가 협력하기 위해 다른 객체를 필요로 할 때 두 객체 사이에 의존성이 존재하게 된다. 의존성은 실행 시점과 구현 시점에 서로 다른 의미를 가진다. 실행 시점: 의존하는 객체가 정상적으로 동작하기 위해서는 실행 시에 의존 대상 객체가 반드시 존재해야 한다. 구현 시점: 의존 대상 객체가 변경될 경우 의존하는 객체도 함께 변경된다. 의존성은 방향성을 가지며 항상 단방향이다. EX) PeriodCondition - - -> Screening Screening이 변경되면 Period..
정리 프로그래밍 패러다임은 프로그래밍을 구성하기 위해 사용하는 추상화의 종류와 이 추상화를 이용해 소프트웨어를 분해하는 방법의 두 가지 요소로 결정된다. 따라서 모든 프로그래밍 패러다임은 추상화와 분해의 관점에서 설명된다. 프로시저 추상화 소프트웨어가 무엇을 해야 하는지를 추상화한다. 데이터 추상화 소프트웨어가 무엇을 알아야 하는지를 추상화한다. 시스템을 분해하는 방법을 결정하려면 먼저 프로시저 추상화를 중심으로 할 것인지, 데이터 추상화를 중심으로 할 것인지를 결정해야 한다.[Meyer00]. 프로시저 추상화를 선택 →기능 분해(알고리즘 분해)를 해야 함. 데이터 추상화를 선택 데이터 중심으로 타입을 추상화(추상 데이터 타입) 데이터 중심으로 프로시저를 추상화(객체지향) 객체지향 패러다임은 역할과 책임..
정리 메시지 객체가 독립적으로 수행할 수 있는 것보다 더 큰 책임을 수행하기 위해서는 다른 객체와 협력해야 한다는 것이고, 이를 가능케하는 매개체가 바로 메시지이다. 메시지 전송(메시지 패싱) 한 객체가 다른 객체에게 도움을 요청하는 것. 메시지 = 오퍼레이션명 + 인자 메시지 전송 = 오퍼레이션명 + 인자 + 메시지 수신자 메시지 수신자는 누가 메시지를 전송하는지 알 필요가 없다. 단지 메시지가 도착했다는 사실만 알면 된다. 이로써 메시지 전송자와 메시지 수신자가 느슨하게 결합될 수 있게 한다. 또한, 메시지 수신자는 메시지를 처리하기 위해 필요한 메서드를 스스로 결졍할 수 있는 자율권을 누린다. 객체는 메시지와 메서드라는 두 가지 서로 다른 개념을 실행 시점에 연결해야 하기 때문에 컴파일 시점과 실행..
정리 데이터보다 행동을 먼저 결정하라 클라이언트의 관점에서 객체가 수행하는 행동이란 곧 객체의 책임을 의미한다. 협력이라는 문맥 안에서 책임을 결정하라 협력을 시작하는 주체는 메시지 전송자이기 때문에 협력에 적합한 책임이란 메시지 수신자가 아니라 메시지 전송자에게 적합한 책임을 의미한다. 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 해야 한다.[Metz12] 객체를 가지고 있기 때문에 메시지를 보내는 것이 아니라 메시지를 전송하기 때문에 객체를 갖게 된 것이다.[Metz12] 메시지는 클라이언트의 의도를 표현하며, 객체를 결정하기 전에 객체가 수신할 메시지를 먼저 결정한다. 메시지를 수신하기로 결정된 객체는 메시지를 처리할 ‘책임’을 할당받게 된다. 책임 주도 설계 시스템이 사용자에게 ..
정리 상태 중심의 설계를 보면서 책임 주도 설계와의 차이를 캡슐화, 응집도, 결합도를 사용해 확인하며 통찰얻기. 데이터 중심의 설계는 객체가 포함해야 하는 데이터에 집중한다. 따라서 책임 중심 설계가 ‘책임이 무엇인가’를 묻는 것으로 시작한다면 데이터 중심 설계는 객체가 내부에 저장해야 하는 ‘데이터가 무엇인가’를 묻는 것으로 시작한다. 훌륭한 객체 지향 설계는 데이터가 아니라 책임에 초점을 맞춰야 한다. 상태를 객체 분할의 중심축으로 삼으면 구현에 대한 세부사항이 객체의 인터페이스에 스며들어 캡슐화의 원칙이 무너진다. 객체를 설계하기 위한 가장 기본적인 아이디어는 변경의 정도에 따라 구현과 인터페이스를 분리하고 외부에서는 인터페이스에만 의존하도록 관계를 조절하는 것. 구현: 변경될 가능성이 높은 부분 ..
정리 객체지향 패러다임 관점에서 핵심은 역할, 책임, 협력이다. 협력: 객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호 작용. 책임: 객체가 협력에 참여하기 위해 수행하는 로직. 역할: 객체들이 협력 안에서 수행하는 책임들이 모여 객체가 수행하는 것. 협력이란 어떤 객체가 다른 객체에게 무엇인가를 요청하는 것이다. 한 객체는 어떤 것이 필요할 때 다른 객체에게 전적으로 위임하거나 서로 협력한다. 즉, 두 객체가 상호작용을 통해 더 큰 책임을 수행하는 것이다. 객체 사이의 협력을 설계할 때는 객체를 서로 분리된 인스턴스가 아닌 협력하는 파트너로 인식해야 한다.[Wirfs-Brock03] 메시지 전송은 객체 사이의 협력을 위해 사용할 수 있는 유일한 커뮤니케이션 수단이다. 메시지 전송 → 메시지 ..
정리 영화 예매 시스템 목적 : 영화 예매를 더 쉽고 빠르게 개념 : 영화 상영을 위한 예매 시스템 할인 규칙 할인 정책 금액 할인 정책(할인액) 비율 할인 정책(할인율) 할인 조건 순번 조건 기간 조건 public class Screening { private Movie movie; private int sequence; private LocalDateTime whenScreened; public Screening(Movie movie, int sequence, LocalDateTime whenScreened){ this.movie = movie; this.sequence = sequence; this.whenScreened = whenScreened; } public LocalDateTime getS..