일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 유연한 설계
- 행동 호환성
- 객체 생성 사용 분리
- 다형성
- 명령-쿼리 분리
- 설계 재사용
- OCP
- 오브젝트
- 믹스인
- iSP
- 책임주도설계
- 런타임 의존성
- Swift#flatMap#map#Monad#함수형 프로그래밍#Optional
- 알고리즘
- 합성
- 서브 타이핑
- dip
- 컴파일 타임 의존성
- OOP
- 메서드를 통한 해결
- 하향식 접근
- 의존성
- 일관성 있는 협력
- 상속
- 유여난 설계
- 추상화
- '기존 설계 재사용
- 상속 조합 폭발적 증가
- 객체지향
- Apple # HIG #iOS15 #iOS14 #Human #Interface #Guidelines #Apple developer # Apple human interface guidelines
Archives
- Today
- Total
도니의 iOS 프로그래밍 세상
[오브젝트 2회독] 7장 - 객체 분해 본문
- 문제 해결에 필요한 핵심만 남기는 작업을 추상화
- 이때, 큰 문제를 해결 가능한 작은 문제로 나누는 작업을 분해라고 함
1. 프로시저 추상화와 데이터 추상화
프로시저 추상화
- s/w가 무엇을 해야 하는지 추상화
- 기능 분해(알고리즘 분해)
데이터 추상화
- s/w가 무엇을 알아야 할지 추상화
- 타입 추상화(abstract data type)
- 데이터를 중심으로 프로시저를 추상화(Object-oriendted)
2. 프로시저 추상화와 기능 분해
- 전통적인 하항식 접근 방법을 따름
- 시스템을 구성하는 가장 최상위 기능을 정의하고, 작은 하위 기능으로 분해
- 하향식 접근 시스템의 예시
- 직원 급여 계산 시스템(main 함수) - 전역 변수 저장 직원 기본급 정보를 얻음 - 세율을 입력받음 - 이를 통해 급여를 계산함
하향식 접근의 문제점
- 기능 추가시에 메인 함수를 빈번하게 수정해야 함
- 직원 전체 급여를 계산하는 기능이 필요하다면? main함수가 수정되어야 함
- 이렇듯 새로운 기능 추가에 대해 대응하기 어려운 구조
- 하향식 분해는 함수의 실행 순서가 초기 설계에 고정되어 있어, 결합도가 높고 유연성 및 재사용성이 저하
하향식 접근이 유용할 때
- 설계가 안정화되어 있을 때 다양한 측면을 논리적으로 설명하고 문서화 하기 용이함
3. 모듈
기능을 기반으로 시스템을 분해하는 것이 아닌, 변경의 방향성에 맞춰서 시스템을 분해
정보 은닉과 모듈
- 정보 은닉이란 모듈 단위로 분해 하기 위해 시스템에서 자주 변경되는 부분을 상대적으로 덜 변경되는 안정적인 인터페이스 뒤로 감추는 것
- 모듈은 서브 프로그램이 아닌 각 책임의 할당으로 내부 작업을 가능한 적게 노출하는 인터페이스를 선택
- 모듈은 복잡성과 변경 가능성을 감춰야 함
- 모듈은 이를 위해 감춰야 할 비밀들을 방어막으로 감싼다(비밀 = 내부 구현, 방어막 = public interface)
모듈의 장점과 한계
- 변경을 기준으로 모듈을 분리하여 높은 응집도를 유지함
- 모듈간 public interface로 소통하여 낮은 결합도를 유지
4. 데이터 추상화와 추상 데이터 타입
추상 데이터 타입
- 추상 객체의 클래스 정의, 추상 객체에 사용할 수 있는 오퍼레이션 정의
→ 간단하게 말해, 객체에서 데이터와 그 데이터에 수행할 수 있는 연산을 추상적으로 정의한 타입
5. 클래스
클래스는 ADT인가?
- 클래스는 ADT라고 볼 순 없음(상속과 다형성을 지원하기 때문)
- ADT는 여러가지 타입이 공존하여 분기문을 통해서 구분(Swift에서는 Struct, enum으로 보는게 맞을거 같다)
변경을 기준으로 ADT와 클래스를 선택
- 특정 기능을 추가하기 위해
- ADT에서는 분기문을 추가 및 관련 코드 전체를 전수검사 후 추가
- 다형성은 새로운 타입을 추가
- 다형성의 장점은 OCP 즉 새로운 타입을 추가하기 위해 기존 코드의 수정을 필요로 하지 않음
- 단점은 한가지 기능 추가를 위해 모든 타입에 영향이 감
- ADT의 장점은 새로운 오퍼레이션 추가시 해당 타입에만 추가하면 됨
- 새로운 타입 추가를 위한 분기문등 모든 코드에 영향을 준다.
- 따라서 각 장점을 참고하여 ADT를 사용할지, 다형성을 선택할지 결정하면 됨
결론
- 문제 핵심만을 남기는 추상화 작업
- 문제를 해결하기 위한 하향식 접근은 기존 설계가 완성된 뒤 유용
- 하향식 접근의 단점은 시간을 기준으로 강한 결합도가 형성되어 유연한 설계가 되지 않음(상위 함수 → 하위 함수의 실행 순서 고착화)
- 모듈은 기능을 기준으로 분해하는 것이 아닌, 변경을 기준으로 분해 해야 함
- 변경을 기준으로 분해하여 높은 응집도를 가짐
- 모듈간 소통은 public interface를 기준으로 통신하여, 낮은 결합도를 가짐
- ADT는 데이터와 수행할 수 있는 연산을 추상적으로 정의한 타입
- 클래스와 ADT의 차이점은 상속과 다형성으로, ADT는 swift에서 Struct와 Enum보는게 좋을 것 같음(
- ADT의 단점은 타입을 내부 변수등으로 구분하여 분기문으로 처리함
- 이로인해 타입을 추가할 때 모든 코드에 영향이 감
- 하지만 한가지 기능의 오퍼레이션을 추가할 때 ADT내부에서만 코드 수정이 이루어짐
- 다형성을 위해 클래스를 사용하면, 타입을 추가할 때 기존 코드에 영향이 가지 않음
- 이를 우린 OCP(Open-closed-principle)라고 한다.
- 추가 기능을 위한 오퍼레이션 추가시, 모든 타입에 영향을 미친다.
- 결국 다형성을 사용할 건지, 분기문 처리를 할건지 trade-off를 보고 결정하는 게 중요
'OOP' 카테고리의 다른 글
[오브젝트 2회독] 9장 - 유연한 설계 (2) | 2024.11.19 |
---|---|
[오브젝트 2회독] 8장 - 의존성 관리하기 (0) | 2024.11.19 |
[오브젝트 2회독] 6장 - 메시지와 인터페이스 (0) | 2024.11.19 |
[오브젝트 2회독] 5장 - 책임 할당하기 (0) | 2024.11.19 |
[오브젝트 2회독] 4장 - 설계 품질과 트레이드 오프 (0) | 2024.11.19 |
Comments