추상화
모델링은 '추상화'에 바탕을 둠 : 특정 관점에서 관련 있는 건 부각시키고, 관련 없는건 무시
어떤 영역에서 필요로 하는 속성/행위를 추출하는 작업 (관심 있는 부분에 집중 가능!)
캡슐화 : 관련 있는 것들 끼리 모아놓음
클래스는 캡슐화를 제공하는 수단으로, 서로 관 련있는 속성/메소드로 구성돼있다.
'요구사항의 변경'은 소프트웨어 개발의 골칫거리인데, 이에 대한 해결법은 요구사항 변경을 당연하다고 생각하고 이에 대비하는 것이다.
'캡슐화'를 통해 높은 응집도와 낮은 결합도를 갖는 설계를 한다!
결합도를 낮게 하려면? '정보 은닉(information hiding)' - private, public 등 이용
중요한 정보에 직접적으로 접근 하는 것이 X (허용된 것만 사용해 접근)
→ 정보 내용 변해도 외부에선 영향 받지 X
정보 은닉의 장점의 예로, 엔진과 운전방식 : 엔진의 교체와 운전 방식은 관련이 없다
일반화 : 여러 개체들이 가진 공통된 특성 부각시켜 하나의 개념/법칙으로 성립시키는 과정
예로, 아우디/벤츠/BMW을 일반화 개념을 사용하지 않으면 새로운 자동차가 나타났을 때 코드를 수정해야함 ⇒ OCP 위반!
일반화는 클래스 자체를 캡슐화 하여 변경에 대비할 수 있는 설계를 가능하게 함
⇒ 새로운 클래스 추가돼도 클라이언트는 영향 받지 X (새 자동차 추가돼도 기존 코드에 영향 없음)
⇒ 일반화를 속성/기능의 재사용 관점에서만 보는 건 극히 제한된 관점임!
void changeEngineOil (Car c) { → 자동차 개념 도입 → 일반화
c.changeEngineOil(); // c=벤츠, bmw, 기아 (자동차 종류 따라 수행연산 달라짐 → 다형성)
}
다형성 : 같은 연산 수행해도 c가 가리키는 실제 객체에 따라 수행되는 연산이 다름
⇒ 일반화 관계와 다형성은 항상 같이!
어떤 클래스의 일부 기능만을 사용하고 싶다면? '위임' 을 사용하라!
일반화는 필요 없는 기능까지 가져옴. '연관관계' 사용하기!
상속 규칙 (피터 코드의 상속 규칙 - 5가지 원칙 만족해야 함)
1. 자식 클래스-부모 클래스 사이는 '역할 수행' 관계가 아니어야 함
2. 한 클래스의 인스턴스는 다른 서브 클래스의 객체로 변환할 필요가 절대 없어야 함 (자식 클래스의 인스턴스는 다른 자식 클래스의 객체로 변환할 필요가 절대 없어야 함)
3. 자식 클래스가 부모 클래스의 책임을 무시하거나 재정의 하지 않고 '확장만' 수행해야 함
4. 자식 클래스가 단지 일부 기능을 재사용할 목적으로 유틸리티 역할을 수행하는 클래스를 상속하지 않아야 함
5. 자식 클래스가 역할, 트랜잭션, 디바이스 등을 특수화 해야 함
'Study > Design Pattern' 카테고리의 다른 글
Observer Pattern (0) | 2021.11.15 |
---|---|
Command Pattern (0) | 2021.11.15 |
Strategy Pattern (0) | 2021.11.15 |
빌더 패턴 (0) | 2021.11.15 |