CS/디자인 패턴
디자인 패턴 공부
Ynghan
2023. 10. 10. 19:43
디자인 패턴 소개
디자인패턴 정의 3가지 부분
"문맥에서 문제의 해결책"이다.
- Context : 적용되는 패턴이 반복적으로 적용되야 하는 상황이다.
- Problem : 문맥에서 이루려고 하는 목표, 문맥에서 발생하는 모든 제약조건을 포함한다.
- Solution : 문제를 해결하기 위해 적용 가능한 일반적인 디자인
패턴의 레벨
- Architectural pattern
- 전체적인 골격 구조와 조직에 영향을 미친다.
- Design pattern
- 하위 시스템이나 컴포넌트 또는 이들간의 관계를 세분화한다.
- 전체적인 구조에는 영향을 주지않는다.
- Coding pattern
- 낮은 레벨의 패턴
UML Review
1. Use Case Diagram
- use case diagram은 use case와 actors의 이름과 그들 사이의 관계를 보여줍니다.
- Use case
: 행위자가 목표를 달성하기 위해 시스템을 사용하는 방법을 설명하는 관련 성공 및 실패 시나리오 - Actor
: 사람, 컴퓨터, 조직 등의 행동을 하는 무엇
- Use case
2. Class Diagram(★)
- 시스템의 클래스들 사이의 관계, 동작, 속성 등을 보여준다.
- Domain model
- Design class diagram(DCD)
- 클래스, 인터페이스, 공동 작업 그리고 그들 사이의 관계(의존, 상속, 관계, 구현) 등을 보여준다.
- 시스템의 정적인 뷰를 나타낸다.
3. Object Diagram
- 실세계의 개체들간의 관계를 탐사하는 것에 유용하다.
4. Sequence Diagram
- 시간 순서를 기반으로 한 객체들의 공동 작업
5. Communication Diagram
- use case의 동적 동작을 모델링하는데 사용된다.
Relationships
- Dependency 의존
- 하나의 클래스에 변화가 있으면 다른 클래스에도 변화가 가는 것
- 한 클래스의 메소드가 다른 클래스의 개체를 인자로 받아 그 메소드를 사용할 경우
- 한 클래스의 메소드 내부에서 다른 클래스의 객체를 생성해 그 메소드를 사용하는 경우
- 하나의 클래스에 변화가 있으면 다른 클래스에도 변화가 가는 것
- Associations 연관
- 하나의 객체가 다른 객체와 연관관계에 있다는 것을 의미하며
특정 클래스의 인스턴스가 작업을 수행하기 위해서는 다른 클래스를 알아야 한다. - 표기법
- 다중도
- 이름
- 방향성
- 하나의 객체가 다른 객체와 연관관계에 있다는 것을 의미하며
- Aggregation 집합
- 두 클래스가 전체-부분 관계에 있는 것을 말한다.
- Composition 포함
- 두 클래스가 부분-전체 관계에 있는 것을 말한다.
- 부분의 생명주기가 전체에 영향을 받는다. 집합관계보다 더 강한 연관관계를 가진다.
- Generalization Relationships 일반화
- 대표적으로 객체지향에서 상속관계를 말한다.
- 실선과 화살표 사용
- Realization Relationships 실체화
- 인터페이스와 실제 구현된 일반 클래스간의 관계를 말한다.
- 존재하는 객체에 대한 오버라이딩을 말하지만 실체화 관계에서는 존재하는 행동에 대한 구현을 말한다.
Object-Oriented Paradigm Review
Data Abstraction
- Abstract Data Type(ADT)
- 데이터 및 관련 연산을 단일 구문 단위로 캡슐화
- 단일 구문 단위
- 프로그램 구성, 수정 가능성 및 별도의 컴파일을 향상
- 캡슐화
- 신뢰성 향상
- 데이터 표현을 숨김으로써, 사용자 코드는 유형의 객체에 직접 접근할 수 없거나 표현에 의존할 수 없으므로 사용자 코드에 영향을 주지 않고 표현을 변경할 수 있습니다.
Object-Oriented Paradigm
Class = ADT + Inheritance + Polymorphism
- 재사용성 및 유연성 향상
Polymorphism
- 다른 클래스에서 다른 방식으로 작업을 수행할 수 있는 객체 지향 소프트웨어의 속성
- 같은 이름의 다수의 메소들를 요구한다.
- 어떤 것을 실행할지는 변수 안에 있는 객체에 따라 달라진다.
- 많은 if-else 또는 switch 구문을 줄인다.
Method Overloading
1.
class X {
void methodA(int num) {
System.out.println("methodA: " + num);
}
void methodA(int num1, int num2) {
System.out.println("methodA: " + num1 + ", " + num2);
}
double methodA(double num) {
System.out.println("methodA: " + num);
return num;
}
}
public class test {
public static void main (String args []) {
X Obj = new X();
double result;
Obj.method(20);
Obj.method(20, 30);
result = Obj.methodA(5.5);
System.out.println("Answer is: " + result);
}
}
2.
public class X {
public void methodA() {
System.out.println("hello, I'm methodA of class X");
}
}
public class Y extends X {
public void methodA() {
System.out.println("hello, I'm methodA of class Y");
}
}
public class Z {
public static void main(String args []) {
X obj1 = new X();
X obj2 = new Y();
obj1.methodA();
obj2.methodA();
}
}
(Run-time)Polymorphism
추상 클래스와 추상 메서드(자바)
- 추상 메소드는 정의를 포함하지 않는다.
- abstract 키워드로 정의된 추상 클래스이다.
- 클래스는 적어도 하나의 추상 메소드를 가져야한다.
- 추상 클래스는 인스턴스가 될 수 없다.
- 하지만 그것의 자손이 참조하여 다형성을 구현 가능하다.
abstract class Animal {
private String name;
abstract public void say();
}
class Cat extends Animal {
private void meow() { ... }
public void say() { meow(); }
}
abstract class Canine extends Animal {
protected bool likeBones;
}
class Dog extends Canine {
private void bark() { ... }
public void say() { bark(); }
}
Animal a = null;
Dog baduki = new Dog();
Cat nabi = new Cat();
a = baduki; a.say();
a = nabi; a.say();
Animal c1 = new Animal(); //Compile Error!
Animal c2 = new Cat();
Cat c3 = new Animal(); //Compile Error!
Cat c4 = new Cat();
Animal d1 = new Canine(); //Compile Error!
Animal d2 = new Dog();
Canine d3 = new Dog();
Canine d4 = new Cat(); //Compile Error!
Dog d5 = new Canine(); //Compile Error!
Dog d6 = new Dog();