Book

    13. 코드로 이해하는 합성(2/2) | 오브젝트 11장

    13. 코드로 이해하는 합성(2/2) | 오브젝트 11장

    3. 합성 관계로 변경하기 상속 관계는 컴파일타임에 결정되고 고정되기 때문에 코드를 실행하는 도중에는 변경할 수 없다. 따라서 여러 기능을 조합해야 하는 설계의 경우 클래스 폭발 문제가 발생하게 된다. 합성은 컴파일타임 관계를 런타임 관계로 변경함으로써 이 문제를 해결한다. 컴파일타임 의존성과 런타임 의존성의 거리가 멀수록 설계가 유연하다. 상속은 컴파일타임 의존성과 런타임 의존성을 동일하게 만든다. 합성은 퍼블릭 인터페이스를 사용하여 두 의존성을 다르게 만들 수 있다. 두 의존성의 거리가 멀수록 설계의 복잡도는 상승하지만, 변경에 따르는 고통이 커지고 있다면 유연성을 택하는 것이 좋다. 합성을 사용하면 구현 시점에 정책들의 관계를 고정시킬 필요가 없으며 실행 시점에 유연하게 변경할 수 있다. 상속: 조..

    12. 코드로 이해하는 합성(1/2) | 오브젝트 11장

    12. 코드로 이해하는 합성(1/2) | 오브젝트 11장

    코드 재사용 기법 상속: 부모 클래스와 자식 클래스를 연결해서 부모 클래스의 코드를 재사용 두 객체 사이의 의존성은 컴파일타임에 해결된다. is-a 관계 합성: 전체를 표현하는 객체가 부분을 표현하는 객체를 포함해서 부분 객체의 코드를 재사용 두 객체 사이의 의존성은 런타임에 해결된다. has-a 관계 합성은 상속과 달리 구현에 의존하지 않는다. 합성은 구현이 아닌 퍼블릭 인터페이스에 의존한다. 상속 관계는 코드 작성 시점에 결정한 후 변경이 불가능한 정적인 관계이지만, 합성 관계는 실행 시점에 동적으로 변경할 수 있는 동적인 관계다. 상속은 부모 클래스 안에 구현된 코드 자체를 재사용하지만, 합성은 포함되는 객체의 퍼블릭 인터페이스를 재사용한다. 1. 상속을 합성으로 변경하기 상속을 남용했을 때의 문제..

    11. 코드로 이해하는 상속과 코드 재사용 | 오브젝트 10장

    11. 코드로 이해하는 상속과 코드 재사용 | 오브젝트 10장

    코드를 재사용하는 방법 전통적인 패러다임: 코드를 복사한 후 수정 객체지향 패러다임: 새로운 클래스 추가 상속: 클래스를 재사용하기 위해 새로운 클래스를 추가하는 가장 대표적인 방법 합성: 새로운 클래스의 인스턴스 안에 기존 클래스의 인스턴스를 포함시키는 방법 1. 상속과 중복 코드 DRY (반복하지 마라) 원칙 Once and Only Once 원칙 또는 Single-Point Control 원칙이라고도 부른다. 코드 안에 중복이 있어서는 안 된다는 것이다. 한 달에 한 번씩 가입자별로 전화 요금을 계산하는 코드를 예시로 보자. class Call { private from: number; private to: number; constructor(from: number, to: number) { thi..

    10. 코드로 이해하는 유연한 설계 | 오브젝트 9장

    10. 코드로 이해하는 유연한 설계 | 오브젝트 9장

    8장에서 살펴본 의존성 관리 기법들을 원칙이라는 관점에서 정리해보자. 1. 개방-폐쇄 원칙 소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다. 확장에 대해 열려 있다 애플리케이션의 요구사항이 변경될 때 새로운 '동작'을 추가해서 기능을 확장할 수 있다. 수정에 대해 닫혀 있다 기존 '코드'를 수정하지 않고도 동작을 추가하거나 변경할 수 있다. 컴파일타임 의존성을 고정시키고 런타임 의존성을 변경하라 컴파일타임 의존성: 코드에서 드러나는 클래스들 사이의 관계 런타임 의존성: 실행 시에 협력에 참여하는 객체들 사이의 관계 할인 정책 설계의 경우, 확장에 대해 열려 있다 새로운 할인 정책을 추가해서 기능을 확장할 수 있도록 허용한다. 수정에 대해 닫혀..

    어떻게 살아야 할 것인가 | "인생의 태도"를 읽고

    어떻게 살아야 할 것인가 | "인생의 태도"를 읽고

    웨인 다이어는 유명한 심리학자다. 수많은 저서 중 들어본 책들은 많았다. 하지만 한 번도 읽어보지는 않았다. 평소 "치유물"로 불리는 자기 계발서 서적을 좋아하지는 않는 편이라 더 그랬던 것 같다. 마냥 느려도 괜찮다느니, 모두가 각자의 길을 걸어가고 있을 뿐이라느니 그런 식상한 말을 듣고 싶지는 않았다. 내 안의 궁금증은 "내가 과연 잘 살고 있는 것일까?"가 아닌, "궁극적으로 내가 어떻게 살아야 하는 것일까?"였다. 서점을 거닐며 책을 앞 뒤로 뒤집으며 표지를 구경했다. 내 시선을 사로잡는 문구가 나오길 바랐다. 그런 점에서 이 책은 내 마음을 끌었다고 할 수 있다. '나이, 직업, 재산, 관계까지 그 모든 것이 사라졌을 때 과연 나는 누구일까?' 그 문장을 읽은 찰나의 순간 내 머릿속엔 아무것도 ..

    인생의 중심 잡기 | "역사의 쓸모"를 읽고

    인생의 중심 잡기 | "역사의 쓸모"를 읽고

    서점을 구경하다 갑자기 교양서적을 사고 싶은 마음이 들어 교양 베스트셀러 항목 쪽으로 걸어갔다. 맨 위에 올려진 책들을 둘러보았다. 익숙한 얼굴이 들어간 책 띠지가 시선을 사로잡았다. 최태성 선생님이었다. 최태성 선생님은 내 마음속 은사로 자리 잡고 계신 분이다. 고등학생 시절 어떤 한국사 강의를 들을지 몰라 헤매던 와중 기대 없이 들어간 EBS에서 오히려 빛을 발견하게 해 준 분이다. "꿈은 명사가 아닌 동사여야 한다"는 말씀으로 그 시절 내 마음을 울렸던 분. 역시나 그 내용도 이 책에 쓰여 있었다. 망설임 없이 책을 집어 계산대로 향했다. 난 역사 지식에 참 약한 사람이다. 어릴 때는 역사 만화책을 읽었고 수험생 시절에도 한국사 강의를 열심히 듣고 좋은 성적도 받았지만, 현재 내 머릿속에 남은 건 ..

    9. 코드로 이해하는 의존성 관리 | 오브젝트 8장

    9. 코드로 이해하는 의존성 관리 | 오브젝트 8장

    협력은 필수적이지만 과도한 협력은 과도한 의존성을 낳아 애플리케이션을 수정하기 어렵게 만든다. 1. 의존성 이해하기 변경과 의존성 의존성은 실행 시점과 구현 시점에 서로 다른 의미를 가진다. 실행 시점: 의존하는 객체가 정상적으로 동작하기 위해서는 실행 시에 의존 대상 객체가 반드시 존재해야 함 구현 시점: 의존 대상 객체가 변경될 경우 의존하는 객체도 함께 변경됨 class PeriodCondition implements DiscountCondition { private dayOfWeek: DayOfWeek; private startTime: LocalTime; private endTime: LocalTime; public isSatisfiedBy(screening: Screening): boolean..

    8. 객체에게 로직을 분배하는 방법, 객체 분해 | 오브젝트 7장

    8. 객체에게 로직을 분배하는 방법, 객체 분해 | 오브젝트 7장

    실제로 문제를 해결하기 위해 사용하는 저장소는 장기 기억이 아닌 단기 기억이다. 문제 해결에 필요한 요소의 수가 단기 기억의 용량을 초과하는 순간 인지 과부하가 발생한다. 인지 과부화를 방지하기 위해 불필요한 정보를 제거하고 현재의 문제 해결에 필요한 핵심만 남기는 작업이 추상화다. 가장 일반적인 추상화 방법은 한 번에 다뤄야 하는 문제의 크기를 줄이는 것이다. 큰 문제를 해결 가능한 작은 문제로 나누는 작업이 분해다. 추상화를 더 큰 규모의 추상화로 압축시킴으로써 단기 기억의 한계를 초월할 수 있다. 1. 프로시저 추상화와 데이터 추상화 프로그래밍 패러다임은 다음 두 가지로 결정된다. 프로그래밍을 구성하기 위해 사용하는 추상화의 종류 이 추상화를 이용해 소프트웨어를 분해하는 방법 모든 프로그래밍 패러다..