CS/디자인 패턴

디자인 패턴 공부

Ynghan 2023. 10. 10. 19:43

디자인 패턴 소개

디자인패턴 정의 3가지 부분

"문맥에서 문제의 해결책"이다.

  • Context : 적용되는 패턴이 반복적으로 적용되야 하는 상황이다.
  • Problem : 문맥에서 이루려고 하는 목표, 문맥에서 발생하는 모든 제약조건을 포함한다.
  • Solution : 문제를 해결하기 위해 적용 가능한 일반적인 디자인

패턴의 레벨

  • Architectural pattern
    • 전체적인 골격 구조와 조직에 영향을 미친다.
  • Design pattern 
    • 하위 시스템이나 컴포넌트 또는 이들간의 관계를 세분화한다.
    • 전체적인 구조에는 영향을 주지않는다.
  • Coding pattern 
    • 낮은 레벨의 패턴

UML Review

Class Diagram / Use Case Diagram / State Machine Diagram / Sequence Diagram 중요!

1. Use Case Diagram

  • use case diagram은 use case와 actors의 이름과 그들 사이의 관계를 보여줍니다.
    • Use case
      : 행위자가 목표를 달성하기 위해 시스템을 사용하는 방법을 설명하는 관련 성공 및 실패 시나리오
    • Actor
      : 사람, 컴퓨터, 조직 등의 행동을 하는 무엇 

2. Class Diagram(★)

  • 시스템의 클래스들 사이의 관계, 동작, 속성 등을 보여준다.
    • Domain model
    • Design class diagram(DCD)
  • 클래스, 인터페이스, 공동 작업 그리고 그들 사이의 관계(의존, 상속, 관계, 구현) 등을 보여준다.
  • 시스템의 정적인 뷰를 나타낸다.

3. Object Diagram

  • 실세계의 개체들간의 관계를 탐사하는 것에 유용하다.

4. Sequence Diagram

  • 시간 순서를 기반으로 한 객체들의 공동 작업

5. Communication Diagram

  • use case의 동적 동작을 모델링하는데 사용된다.

Relationships

  • Dependency 의존
    • 하나의 클래스에 변화가 있으면 다른 클래스에도 변화가 가는 것
      1. 한 클래스의 메소드가 다른 클래스의 개체를 인자로 받아 그 메소드를 사용할 경우
      2. 한 클래스의 메소드 내부에서 다른 클래스의 객체를 생성해 그 메소드를 사용하는 경우
  • Associations 연관
    • 하나의 객체가 다른 객체와 연관관계에 있다는 것을 의미하며
      특정 클래스의 인스턴스가 작업을 수행하기 위해서는 다른 클래스를 알아야 한다.
    • 표기법
      1. 다중도
      2. 이름
      3. 방향성
  • 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();