정적 팩토리 메서드란 정적 팩토리 메서드는 클래스에서 인스턴스를 생성하는 용도로 생성자와 별도로 제공할 수 있는 또 다른 수단이다. 예를 들어 Boolean 클래스의 경우 아래와 같이 인스턴스를 생성할 수 있는 정적 팩토리 메서드를 제공한다. public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 정적 팩토리 메서드의 장점 그럼 생성자 대신 정적 팩토리 메서드를 사용할 때 어떤 장점이 있을까? 책에서는 크게 5가지를 제시한다. 이름을 가질 수 있다. 인스턴스를 생성하는 메서드가 이름을 가지게 되면 반환될 객체의 특성을 쉽고 정확하게 묘사할 수 있다는 장점이 생긴다. 예를 들어 BigInteger의 proba..
추상화 기법 추상화 -> 도메인의 복잡성을 단순화하고 직관적 멘탈 모델을 만드는 데 사용할 수 있는 가장 기본적인 인지 수단 추상화 기법들은 복잡성을 낮추기 위해 사물의 특정한 측면을 감춘다 동일한 추상화 기법을 프로그램의 분석, 설계, 구현 단계에 걸쳐 일관성 있게 적용할 수 있다는 것이 객체지향이 갖는 장점 1. 분류와 인스턴스화 개념과 범주 객체를 분류하고 범주로 묶는 것은 객체들의 특정 집합에 공통의 개념을 적용하는 것을 의미함 분류 -> 세상에 존재하는 객체에 개념(타입)을 적용하는 과정 즉, 객체를 타입(개념)과 연관시키는 것 타입 객체가 타입에 속하는지 검증하기 위해 필요한 타입의 정의 3가지 심볼(타입의 이름), 내연(타입의 정의), 외연(타입에 속하는 객체들의 집합) 외연과 집합 외연은 ..
객체지향 설계 안에 존재하는 세 가지 상호 연관된 관점 개념 관점 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현 실제 도메인의 규칙과 제약을 최대한 유사하게 반영 명세 관점 소프트웨어로 초점이 옮겨짐 살아 움직이는 객체들의 책임에 초점. 즉, 객체의 인터페이스를 바라보게 됨 '무엇'을 할 수 있는가에 초점 구현 관점 실제 작업을 수행하는 코드와 연관 객체의 책임을 '어떻게' 수행할 것인가에 초점을 두고 필요한 속성과 메서드를 클래스에 추가 위 3가지 관점은 시간 순이 아니며, 동일한 클래스를 세 가지 다른 방향에서 바라보는 것을 의미 하나의 클래스 안에 세 가지 관점을 모두 포함하면서도 각 관점에 대응되는 요소를 명확하고 깔끔하게 드러낼 수 있어야 한다! 도메인 모델 -> 최종 코드 구현 과정 ..
기능을 중심으로 구조를 종속시키는 적근법은 범용적이지 않고 재사용이 불가능하며 변경에 취약한 모델을 낳게 된다. 이와 달리 안정적인 구조를 중심으로 기능을 종속시키는 접근법은 범용적이고 재사용 가능하며 변경에 유연하게 대처할 수 있는 모델을 만든다. (중략) 자주 변경되는 기능이 아니라 안정적인 구조를 따라 역할, 책임, 협력을 구성하라. (p.180) 기능 설계 vs 구조 설계 성공적인 소프트웨어 -> 사용자가 원하는 새로운 기능을 빠르고 안정적으로 추가할 수 있다 이는 훌륭한 구조가 뒷받침되어 있기에 가능한 것 비록 최종 사용자들은 내부 구조를 볼 수 없지만, 좋은 설계는 사용자의 요구사항을 빠르게 반영할 수 있기에 중요하다 설계라는 행위를 중요하게 만드는 것은 변경에 대한 필요성이다 설계를 하는 목..
자율적인 책임 자율적 객체 -> 스스로의 의지와 판단에 따라 각자 맡은 책임을 수행하는 객체 객체가 책임을 자율적으로 수행하기 위해선 -> 객체에게 할당되는 책임이 자율적이어야 한다 상세한 수준의 책임은 협력의 최종 목표는 만족시킬지 몰라도 객체가 가져야 하는 선택의 자유를 크게 훼손한다 이런 경우, 자신의 판단이 아닌 외부의 명령에 의존하게 된다 책임은 자율성을 보장할 수 있도록 포괄적이고 추상적이면서도 할 일을 명확하게 명시하는 것이어야 한다 '어떻게'가 아닌, '무엇'을 책임으로 사용하라 너무 추상적인 책임 단, 협력의 의도를 명확하게 표현하지 못할 정도로 추상적인 책임 역시 문제다 책임은 협력에 참여하는 의도를 명확하게 설명할 수 있는 수준 안에서 추상적이어야 한다 책임의 적합성은 협력이 무엇인지..
객체지향에 갓 입문한 사람들의 가장 흔한 실수는 협력이라는 문맥을 고려하지 않은 채 객체가 가져야 할 행동부터 고민하기 시작한다는 것이다. 중요한 것은 개별 객체(의 행동이나 상태)가 아니라 객체들 사이에 이뤄지는 협력이다. 협력이 자리를 잡으면 저절로 객체의 행동이 드러나고 뒤이어 적절한 객체의 상태가 결정된다. (p.109) 협력 요청과 응답 협력은 한 사람이 다른 사람에게 도움을 요청할 때 시작됨 요청을 받은 사람은 지식 또는 서비스를 제공함으로서 요청에 응답 요청에 응답하는 과정에서 다시 다른 사람에게 요청을 보내야될 수도 있음 즉, 협력은 다수의 연쇄적인 요청 & 응답의 흐름으로 구성 어떤 사람이 특정한 요청을 받아들일 수 있는 이유는, 그 요청에 대해 적절한 방식으로 응답하는 데 필요한 지식과..
초기의 지하철 노선도는 실제와 유사한 물리적인 지형 위에 구불구불한 운행 노선과 불규칙적인 역 간의 거리를 사실적으로 묘사하고 있었다. 문제는 이렇게 사실적인 정보가 오히려 지하철을 이용하는 승객들로 하여금 노선도를 이해하기 어렵게 만들었다는 점이다. (p.73) 해리 벡은 승객이 꼭 알아야 하는 사실만을 정확하게 표현하고 몰라도 되는 정보는 무시함으로써 이해하기 쉽고 단순하며 목적에 부합하는 지하철 노선도를 창조해 낼 수 있었다. (p.75) 추상화를 통한 복잡성 극복 진정한 의미에서 추상화란 현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정 불필요한 부분을 무시해 현실에 존재하는 복잡성을 극복하는게 추상화의 목적 훌륭한 추상화는 목적에 부합하는 것이어야 한다 추상..
세상을 더 작은 객체로 분해하는 것은 본질적으로 세상이 포함하고 있는 복잡성을 극복하기 위한 인간의 작은 몸부림이다. 인간은 좀 더 단순한 객체들로 주변을 분해함으로써 자신이 몸담고 있는 세상을 이해하려고 노력한다. (p.41) 객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것이다. (중략) 현실 세계에서는 사람이 직접 주문 금액을 계산하지만 소프트웨어 세계에서는 주문 객체가 자신의 금액을 계산한다. (p.42) 객체의 정의 객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를 상태, 행동, 식별자를 지닌 실체로 보는 것이 가장 효과적이다. (p.47) 객체란 식별 가능한 개체 또는 사물이다 객체는 자동차처럼 만질 수 있는 구체적 사물일 수도..
서론 객체지향으로 향하는 4가지 걸음 클래스가 아니라 객체를 바라보는 것 개체를 독립적인 존재가 아니라 기능을 구현하기위해 협력하는 공동체의 존재로 바라보는 것 협력에 참여하는 객체들에게 적절한 역할과 책임을 부여하는 것 위 개념들을 사용하는 프로그래밍 언어라는 틀에 잘 담아내는 기술을 익히는 것 1장 실세계의 모방이라는 개념은 객체지향의 기반을 이루는 철학적인 개념을 설명하는 데는 적합하지만 유연하고 실용적인 관점에서 객체지향 분석, 설계를 설명하기에는 적합하지 않다. (중략) 객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다. 소프트웨어 개발자의 역할은 단순히 실세계를 소프트웨어 안으로 옮겨 담는 것이 아니라 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것..
람다식이란 람다식은 자바 8에서 추가된 문법으로 자바에서 함수형 프로그래밍을 지원하기 위해 도입되었다. 람다식 람다식은 메서드를 하나의 식 (Expression) 으로 표현한 것으로, 아래와 같이 작성된다. // 기존 메서드 int sum(int a, int b) { return a + b; } // 람다식 (a, b) -> a + b 위 코드에서 볼 수 있듯 람다식으로 메서드를 작성하면 이름이 사라지기 때문에 익명 함수 라고 부른다. 람다식을 사용하면 기존에 메서드를 작성하기 위해 클래스를 만들고, 메서드 시그니처를 작성하는 등의 과정 없이 단순히 식 (Expression) 하나만으로 메서드를 만들고 사용할 수 있다. 함수형 프로그래밍 함수형 프로그래밍에는 아래와 같은 큰 특징들이 있다. 1. 순수 함..