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 객체지향 디자인패턴 2018.06.19 Chapter 02 객체지향 원리
JAVA 객체 지향 디자인패턴 - 객체지향 원리
By Sungbin, Song
JAVA 객체 지향 디자인패턴 - 객체지향 원리
- 137