본문 바로가기

분류 전체보기48

[오브젝트] 11장. 합성과 유연한 설계 상속의 문제점 상속 관계는 is-a관계이다. 불필요한 인터페이스 상속 문제 메서드 오버라이딩의 오작용 문제 부모 클래스와 자식 클래스의 동시 수정 문제 -> 상속은 부모 클래스와 자식 클래스의 결합도를 높인다. 상속의 대안 : 합성 합성 관계는 has-a관계이다. 상속으로 인한 조합의 폭발적인 증가 ex) 기본정책과 부가정책 조합하기 상속으로 구현하게 되면 새로운 정책을 추가하기 어려워진다. 새로운 정책을 추가하기 위해서는 불필요한 많은 클래스를 상속 계층 안에 추가해야 한다. 상속의 남용으로 하나의 기능을 추가하기 위해 필요 이상으로 많은 수의 클래스를 추가해야 하는 경우를 클래스 폭발 문제라고 하낟. 클래스 폭발 문제는 자식 클래스가 부모 클래스의 구현에 강하게 결합되도록 강요하는 상속의 근본적인 한.. 2023. 9. 23.
[오브젝트] 9장 유연한 설계 이번 장에서는 유연한 설계를 위한 기법들에 대해 알아보았다. 01 개방 폐쇄 원칙 OCP? 확장에는 열려있고, 수정에는 닫혀있다. = 애플리케이션의 요구사항에 대해 기존 코드의 수정없이 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있다. OCP을 지키는 법 컴파일 의존성을 고정하고, 런타임 의존성은 변경하도록 설계하기 추상화에 의존하여 설계하기 = 변하지 않는 부분은 고정하고, 변하는 부분은 생략한다. 02 생성 사용 분리 => 객체를 생성하고, 사용하는 코드를 분리하라. Factory 사용하기 : 오로지 객체 생성의 책임만을 가지는 Factory를 생성하자. 팩토리를 통해 객체를 생성하는 코드를 분리할 수 있다. 순수 가공물(Pure Fabrication)에게 책임 할당하기 : 도메인 개념을.. 2023. 9. 9.
[모던 자바 인 액션] 13장 디폴트 메서드 디폴트 메서드란? 진화하는 API가 호환성을 유지하는 방법 디폴트 메서드의 활용 패턴 해결 규칙 정적 메서드와 인터페이스 자바는 인터페이스, 인터페이스의 인스턴스를 활용할 수 있는 정적 메서드를 제공하는 유틸리티 클래스를 제공한다. ex) Collections는 Collection객체를 활용할 수 있는 유틸리티 클래스이다. 자바 8에서 인터페이스에 직접 정적 메서드를 작성할 수 있으므로 유틸리티 클래스를 없애도 되지만, 과거 버전과의 호환성때문에 유틸리티 클래스를 남겨두었다. 🍎 변화하는 API 인터페이스에 새로운 메서드를 추가하면 바이너리 호환성은 유지된다. 바이너리 호환성? 인터페이스에 새로 추가된 메서드를 호출하지만 않으면 새로운 메서드의 구현없이도 기존 클래스는 잘 동작한다. 하지만 하나의 구현체.. 2023. 8. 25.
[오브젝트] 5장. 책임 할당하기 이 장에서는 책임 주도 설계를 해보며, 객체지향 설계에서 가장 중요한 적절한 객체에게 적절한 책임을 할당하는 것에 대해 배웠다. 책임 할당은 일종의 트레이드오프 활동이다. 즉, 책임을 할당하는데는 다양한 방법이 존재하며, 최선의 방법은 상황과 문맥에 따라 달라진다. GRASP 패턴은 적절한 책임을 할당하는 방법을 제시한다. 01 책임 주도 설계를 향해 앞서 4장에서 데이터 주도 설계에 대해 알아보았다. 데이터 주도 설계에서 책임 중심 설계로 전환하기 위해서는 다음의 두 원칙을 따라야 한다. 데이터보다 행동을 먼저 결정하라. 협력이라는 문맥 안에서 책임을 결정하라. 책임 주도 설계 1. 제공해야 하는 기능인 시스템 책임을 파악한다. 2. 그 책임을 더 작은 책임으로 분할한다. 3. 분할된 책임을 적절한 객.. 2023. 8. 12.
[모던 자바 인 액션] 10장. 도메인 전용 언어 🍎도메인 전용 언어, DSL 프로그래밍 언어도 결국 언어다. 의도가 정확하게 전달되어야 한다. DSL은 특정 비즈니스 도메인의 문제를 해결하기 위해 만든 언어이다. 장점 : API는 캡슐화, 반복 x, 간결한 코드, 가독성, 유지보수 추상화, 관심사분리 단점 : 설계의 어려움, 개발 비용 등 메서드 체인을 보통 플루언트 스타일이라고 부른다.DSL 분류 내부 DSL 자바로 구현한 DSL. 자바는 엄격한 문법과,유연성이 떨어지는 문법 때문에 DSL를 만들기에 적합하지 않았지만, 람다와 메서드 참조의 등장으로 어느 정도의 문제는 해결되었다. 다중 DSL JVM을 사용하는 언어와 자바를 합쳐서 구현한 DSL. 스칼라는 커링, 임의 변환 등 DSL 개발에 필요한 여러 특성을 갖췄다. 문법적 잡음이 없고, 누구나 .. 2023. 8. 12.
[오브젝트] 04_설계 품질과 트레이드오프 4장에서는 기존에 객체지향 설계로 만들었던 영화 예매 시스템을 데이터 중심 설계로 다시 설계한다. 이 설계를 통해 품질이 나쁜 코드를 보고, 캡슐화, 응집도, 결합도에 대해 자세히 다룬다. 01 데이터 중심의 영화 예매 시스템 설계 시 두 가지로 나눌 수 있다. 데이터 중심의 설계 : 이는 상태에 초점을 맞추며 객체를 독립된 데이터 덩어리로 바라본다. 책임 중심의 설계 : 이는 행동에 초점을 맞추며 객체를 협력하는 공동체의 일원으로 바라본다. 훌륭한 객체지향 설계는 데이터가 아닌 책임에 초점을 맞춰야 한다. 그것이 변경이 더 용이하기 때문이다. 상태는 구현에 속하므로 변하기 쉽다. 따라서 상태에 초점을 맟추면 구현이 객체의 인터페이스에 스며들게 되어 캡슐화 원칙이 무너진다. 이는 곧 상태의 변경이 인터페.. 2023. 8. 5.