2.1 추상화
추상화란 어떤 영역에서 필요로 하는 속성이나 행동을 추출하는 작업을 의미한다.
각 개체의 구체적인 개념에 의존하지 말고 추상적 개념에 의존해야 설계를 유연하게 변경할 수 있다.
2.2 캡슐화.
요구사항 변경에 대처하는 고전적인 설계 원리
1. 응집도(cohesion) : 클래스나 모듈 안의 요소가 얼마나 밀접하게 관련되어 있는 지를 나타냄
2. 결합도(coupling) : 어떤 기능을 실행하는데 다른 클래스나 모듈에 얼마나 의존적인지를 나타냄.
높은 응집도와 낮은 결합도를 유지할 수 있도록 설계해야 요구사항 변경에 유연하게 대처할 수 있다.
캡슐화는 낮은 결합도를 유지할 수 있도록 해주는 객체지향 설계 원리이다.
정보 은닉
외부에서 내부 변수에 접근할 경우 예기치 못한 문제가 발생할 수도 있고, 내부 자료구조 등을 바꾸게 될 경우 외부 코드도 수정해야하는 문제가 있다. 이를 위해서 하나의 코드 내에서 외부로 노출시킬 필요 없는 것은 private으로 내부에서만 들고 있도록 한다.
아래에서 보면 print할 때 직접 접근해서 데이터를 가져오는 것을 확인할 수 있는데.. 이러면 no!!
ArrayStack st = new ArrayStack(10);
st.push(20);
System.out.println(st.itemArray.get(st.itemArray.size() - 1));
다음과 같이 사용할 수 있도록 하고 구현도 이에 맞게 변수를 private으로 바꾸고 메서드만 public으로 공개한다.
ArrayStack st = new ArrayStack(10);
st.push(20);
System.out.println(st.peek());
2.3 일반화 관계
일반화 관계는 객체지향 프로그래밍 관점에서 상속 관계라 불린다. 거기에 더하여 일반화 관계는 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종이다.
두 자식 클래스 사이에 is a kind of 관계가 성립하지 않을 때
상속을 사용하면 불필요한 속성이나 연산도 물려받게 된다.
위임(Delegation)
어떤 클래스의 일부 기능만 재사용하고 싶을 때 사용한다.
위임을 통해 일반화를 대신하는 과정
1. 자식 클래스에 부모 클래스의 인스턴스를 참조하는 속성을 만든다. 이 속성 필드를 this로 초기화한다.
2. 서브 클래스에 정의된 각 메서드에 1번에서 만든 위임 속성 필드를 참조하도록 변경한다.
3. 서브 클래스에서 일반화 관계 선언을 제거하고 위임 속성 필드에 슈퍼 클래스의 객체를 생성해 대입한다.
4. 서브 클래스에서 사용된 슈퍼 클래스의 메서드에도 위임 메서드를 추가한다.
5. 컴파일 후 동작 확인.
ㅇ..ㅇ 그냥 엄청 비슷한데 필요한 기능만 고른거 하나 더 만드는 느낌..
public class MyStack<String> {
private ArrayList<String> arList = new ArrayList<String>();
public void push(String element) {
arList.add(element);
}
public String pop() {
return arList.remove(arList.size() - 1);
}
public boolean isEmpty() {
return arList.isEmpty();
}
public int size() {
return arList.size();
}
}
2.3.3 집합론 관점으로 본 일반화 관계...(..)
인스턴스가 동시에 여러 클래스에 속할 수 있는 것을 다중 분류라 한다.
동적 분류(dynamic classification)는 한 클래스의 인스턴스가 다른 클래스의 인스턴스로 할당될 수 있음을 의미하며 '<<동적>>'이라는 스테레오 타입을 사용해 표현한다.
2.4 다형성(polymorphism) - 변화에 유연하게 대처할 수 있게 해준다.
서로 다른 클래스의 객체가 같은 메세지를 받았을 때 각자의 방식으로 동작하는 능력이다. 일반화 관계와 마찬가지로 자식 클래스를 개별적으로 다룰 필요 없이 한 번에 처리할 수 있게 하는 수단을 제공한다.
상속 vs 정적 메서드
정적 메서드는 상속을 통해서 오버라이드 되지 않는다.
2.5 피터 코드의 상속 규칙
피터 코드는 상속 오용을 막기 위해 상속의 사용을 엄격하게 제한하는 규칙을 만들었다.
1. 자식 클래스와 부모 클래스 사이는 역할 수행 관계가 아니어야 한다.
2. 한 클래스의 인스턴스는 다른 서브 클래스의 객체로 변환할 필요가 절대 없어야 한다.
3. 자식 클래스가 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행해야 한다.
4. 자식 클래스가 단지 일부 기능을 재사용할 목적으로 유틸리티 역할을 수행하는 클래스를 상속하지 않아야 한다...(왠지.. 내 코드에 있는 것 같은 느낌.)
5. 자식 클래스가 역할, 트랜잭션, 디바이스 등을 특수화 해야 한다.
사람과 운전자, 사람과 회사원을 예로 들어서 설명했는데 ㅇ.ㅇ 이해된다. 운전자는 사람이 운전하는 역할. 회사원은 사람이 회사에서 일하는 역할.. 이므로 1번 위배.
회사원은 운전자가 되기도 하기 때문에 2번 위배.
공부내용 정리다보니.. 정신없긴하네요 ㅎ.ㅎ
JAVA 객체지향 디자인 패턴 - 교보문고
UML과 GoF 디자인 패턴 핵심 10가지로 배우는 | 이 책이 제시하는 핵심 내용객체지향 이론과 UML을 통해 GoF 디자인 패턴의 핵심 10가지를 배운다.이 책의 특징과 장점5단계 학습법으로 디자인 패턴을
www.kyobobook.co.kr
'Java > Java 객체지향 디자인 패턴' 카테고리의 다른 글
[Java 객체 지향 디자인 패턴] 6. 싱글턴 패턴 - Singleton Pattern : 단하나! 비동기 시 주의 (0) | 2022.02.23 |
---|---|
[Java 객체 지향 디자인 패턴] 5. 스트래티지 패턴 - Strategy Pattern~! 전략 패턴~! (0) | 2022.02.23 |
[Java 객체 지향 디자인 패턴] 4. 디자인 패턴 - 바퀴를 다시 발명하지 말라~! (0) | 2022.02.16 |
[Java 객체 지향 디자인 패턴] 3. SOLID 원칙(SRP, OCP, LSP, DIP, ISP) (0) | 2022.02.08 |
[Java 객체 지향 디자인 패턴] 1. 객체지향 모델링 (0) | 2022.01.25 |
댓글