닭발개발

[오브젝트] 20일차. 250-263pg | 변경과 의존성 본문

책책책 책을 읽읍시다‼ ver.개발/[ 오브젝트: 코드로 이해하는 객체지향 설계 ]

[오브젝트] 20일차. 250-263pg | 변경과 의존성

D269 2023. 7. 18. 18:35
728x90

 

20일차.

 
오브젝트: 코드로 이해하는 객체지향 설계[4주차_화요일]
250-263pg
 
 

#요약 

**Chapter 07. 객체 분해** 

01. 프로시저 추상화와 데이터 추상화

02. 프로시저 추상화와 기능 분해

03. 모듈

04. 데이터 추상화와 추상 데이터 타입
05. 클래스
1) 클래스는 추상 데이터 타입인가?
2) 추상 데이터 타입에서 클래스로 변경하기

3) 변경을 기준으로 선택하라
- 타입을 기준으로 절차를 추상화하지 않았다면 객체지향 분해가 아님.
- 클래스가 추상 데이터 타입의 개념을 따랐는지 보려면 클래스 내부에 인스턴스의 타입을 표현하는 변수가 있는지 보면 됨.
- 인스턴스 변수에 저장된 값을 기반으로 메서드 내에서 타입을 명시적으로 구분하는 방식은 객체지향 위반임.
- 객체지향에서는 타입 변수를 이용한 조건문을 다형성으로 대체함.
- 클라이언트가 객체 타입을 확인하고 메서드 호출하는 게 아니라 객체가 메소드를 선택함.
- 개방-폐쇄 원칙(Open-Closed Principle, OCP) : 기존 코드에 아무런 영향도 미치지 않고 새로운 객체 유형과 행위를 추가할 수 있는 객체지향의 특성
- 새로운 타입을 빈번하게 추가해야 한다면 객체지향 클래스 구조가 더 유용
- 새로운 오퍼레이션을 빈번하게 추가해야 한다면 추상 데이터 타입이 더 유용
- 데이터 주도 설계 : 추상 데이터 타입의 접근법을 객체지향 설계에 구현한 것.

4) 협력이 중요하다
- 협력 문맥을 고려하지 않고 객체를 고립시킨 채 오퍼레이션의 구현 방식을 타입별로 분배하는 것은 잘못된 접근법임.

 

 




**Chapter 08. 의존성 관리하기** 
- 작고 응집도 높은 객체 : 책임의 초점이 명확하고 한 가지 일만 잘 하는 객체
- 작고 응집도 높은 객체들은 단독으로 수행할 수 없기 때문에 다른 객체들에게 도움 요청

- 충분히 협력적이면서도 유연한 객체를 만들기 위해 의존성을 관리하는 방법 알아보기

 

01. 의존성 이해하기

1) 변경과 의존성

- 실행시점 : 의존하는 객체가 정상적으로 동작하기 위해서는 실행시에 의존 대상

- 구현시점 : 의존 대상 객체가 변경될 경우 의존하는 객체도 함께 변경

- 어떤 객체가 예정된 작업을 정상적으로 수행하기 위해 다른 객체를 필요로 하는 경우 두 객체 사이에 의존성이 존재한다고 말함.

- 의존성은 항상 단방향.

- UML과 의존성 : 이번 장에서 UML은 두 요소 사이에 존재할 수 있는 다양한 관계의 하나로 '의존 관계'를 정의, 의존성은 두 요소 사이에 변경에 의해 영향을 주고받는 힘의 역학 관계가 존재. 

 

2) 의존성 전이

- 의존성은 함께 변경될 수 있는 가능성을 의미해서 모든 경우에 의존성이 전이되지는 않음.

- 의존성이 실제로 전이될지는 변경의 방향과 캡슐화의 정도에 따라 달라짐.

- 직접 의존성(Direct dependency) : 한 요소가 다른 요소에 직접 의존하는 경우

- 간접 의존성(Indirect dependency) : 직접적인 관계는 존재하지 않지만 의존성 전이에 의해 영향이 전파되는 경우

- 클래스 말고도 변경과 관련있는 어떤 것에도 의존성 개념을 적용할 수 있음

- 의존성 : 의존하고 있는 대상의 변경에 영향을 받을 수 있는 가능성

 

3) 런타임 의존성과 컴파일타임 의존성

- 런타임 : 애플리케이션이 실행되는 시점

- 컴파일 타임 : 작성된 코드를 컴파일하는 시점, 문맥에 따라서는 코드 그 자체

- 컴파일 타임 의존성 : 시간보다 우리가 작성한 코드의 구조를 중요하게 생각함.

- 객체지향 애플리케이션에서 런타임의 주인공은 객체

- 코드 관점에서 주인공은 클래스

- 유연하고 재사용 가능한 설계를 위해서는 동일한 소스코드 구조를 가지고 다양한 실행구조를 만들 수 있어야 한다.

- 컴파일 타임 구조와 런타임 구조 사이의 거리가 멀면 멀수록 설계가 유연해지고 재사용 가능해짐.

 

4) 컨텍스트 독립성

- 구체 클래스에 대해 의존하는 것은 클래스의 인스턴스가 어떤 문맥에서 사용될 것인지를 구체적으로 명시하는 것과 같다.

- 컨텍스트 독립성 : 클래스가 사용될 특정한 문맥에 대해 최소한의 가정만으로 이뤄져 있다면 다른 문맥에서 재사용하기가 더 수월해짐.

- 유연한 설계를 위해서 가능한 한 자신이 실행될 컨텍스트에 대한 구체적인 정보를 최대한 적게 알아야 함.

 

5) 의존성 해결하기

- 컴파일타임 의존성은 구체적인 런타임 의존성으로 대체되어야 한다.

- 의존성 해결 : 컴파일타임 의존성을 실행 컨텍스트에  맞는 적절한 런타임 의존성으로 교체하는 것

 

 

 

 

728x90
반응형