JAVA 객체지향
디자인패턴
2018.06.19
Chapter 02 객체지향 원리
2. 객체지향 원리
- 2.1 추상화
- 2.2 캡슐화
- 2.3 일반화 관계
- 2.4 다형성
- 2.5 피터 코드의 상속 규칙
2.1 추상화
- 어떤 영역에서 필요로 하는 속성이나 행동을 추출하는 작업
- 구체적인 사물들의 공통적인 특징을 파악해서 하나의 개념으로 다루는 수단
- 각 개체의 구체적인 개념에 의존하지 말고 추상적 개념에 의존해야 설계를 유연하게 변경할 수 있다.
2.2 캡슐화
- 응집도(cohesion)
- 클래스나 모듈 안의 요소들이 얼마나 밀접하게 관련되어 있는지 나타냄
- 결합도(coupling)
- 어떤 기능을 실행하는데 다른 클래스나 모듈들에 얼마나 의존적인지를 나타냄
높은 응집도, 낮은 결합도 일 때
요구사항 변경에 유연하게 대처 가능
2.2 캡슐화
- 낮은 결합도를 유지할 수 있도록 해주는 객체지향 설계 원리
- 정보 은닉을 통해 높은 응집도와 낮은 결합도를 갖음
- 정보은닉 - 알 필요가 없는 정보는 외부에서 접근 제한
- 결합이 많을 수록 문제가 많이 발생하므로 정보 은닉 필요
2.3 일반화
자동차
BMW
소나타
벤츠
일반화
특수화
- 여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정
- 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종
캡슐화
사람
-대리운전
2.3 일반화
- 'is a kind of 관계'
- 'is a kind of 관계'가 성립하지 않을 때 상속을 사용하면 불필요한 속성이나 연산도 물려받음
- 어떤 클래스의 일부 기능만 재사용하고 싶은 경우 '위임' 사용
- 위임 - 자신이 직접 실행하지 않고 다른 클래스의 객체가 실행하도록 하는 것
- 일반화 - 클래스 사이의 관계
- 위임 - 객체 사이의 관계
2.3 일반화
- 자식 클래스에 부모 클래스의 인스턴스를 참조하는 속성을 만든다. 이 속성 필드를 this로 초기화
- 서브 클래스에 정의된 각 메서드에 1번에서 만든 위임 속성 필드를 참조하도록 변경
- 서브 클래스에서 일반화 관계 선언을 제거하고 위임 속성 필드에 슈퍼 클래스의 객체를 생성해 대입
- 서브 클래스에서 사용된 슈퍼 클래스의 메서드에도 위임 메서드를 추가
- 컴파일 후 동작 확인
2.3 일반화
- A = A1 ∪ A2 ∪ A3
- A1 ∩ A2 ∩ A3 = Φ
집합론 관점으로 본 일반화 관계
A
A
A
A
{disjoint, complete}
- disjoint - 자식 클래스 객체가 동시에 두 클래스에 속할 수 없음
- complete - 자식 클래스의 객체에 해당하는 부모 클래스의 객체와 부모 클래스의 객체에 해당하는 자식 클래스의 객체가 하나만 존재
2.4 다형성
- 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
- 다형성은 일반화 관계와 함께 자식 클래스를 개별적으로 다룰 필요없이 한 번에 처리할 수 있게 하는 수단
- 다형성과 일반화 관계는 코드를 간결하게 하고 변화에도 유연하게 대처할 수 있음
2.5 피터 코드의 상속 규칙
- 자식 클래스와 부모 클래스 사이는 '역할 수행' 관계가 아니어야 한다.
- 한 클래스의 인스턴스는 다른 서브 클래스의 객체로 변환할 필요가 절대 없어야 한다.
- 자식 클래스가 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행해야 한다.
- 자식 클래스가 단지 일부 기능을 재사용할 목적으로 유틸리티 역할을 수행하는 클래스를 상속하지 않아야 한다.
- 자식 클래스가 '역할', '트랜잭션', '디바이스' 등을 특수화 해야한다.
상속의 오용을 막기 위해 상속의 사용을 엄격하게 제한하는 규칙
하나라도 만족하지 않으면 상속 사용해선 안된다.
JAVA 객체 지향 디자인패턴 - 객체지향 원리
By Sungbin, Song
JAVA 객체 지향 디자인패턴 - 객체지향 원리
- 164