-
1.1 모델링
모델의 역할
- 소프트웨어 모델을 통해 서로의 해석을 공유해 합의를 이루거나 해석의 타당성을 검토할 수 있다.
- 현재 소프트웨어 시스템 또는 앞으로 개발할 소프트웨어의 원하는 모습을 가시화한다.
- 시스템의 구조와 행위를 명세할 수 있으며 시스템을 구축하는 틀과 구축된 소프트웨어의 문서화 기능을 제공한다.
모델의 추상화
- 모델을 추상화(abstraction) 에 바탕을 두고 만들어져야 한다. 즉, 대상을 표현할 때 대상의 상세한 면을 그대로 다 표현하지 않고 특정 관점에서 관련이 있는 점은 부각시키고 관련이 없는 면은 무시한다.
1.2 UML
모델링을 하려면 시스템을 모델로 표현해주는 언어가 필요한데 대표적인 모델링 언어로 UML(Unified Modeling Language) 이 있다.
UML 다이어그램의 종류
다양한 관점에서 시스템을 모델링하기 위해, UML 2.0에서는 시스템의 구조와 동작을 표현하는 13개 다이어그램을 제공한다.1.3 클래스 다이어그램
클래스 다이어그램은 시간에 따라 변하지 않는 시스템의 정적인 면을 보여주는 대표적인 UML 구조 다이어그램이며 시스템을 구성하는 클래스 사이의 관계를 보여준다.
1.3.1 클래스
클래스란 동일한 속성과 행위를 수행하는 객체의 집합 혹은 객체를 생성하는 설계도로 간주할 수 있다.
클래스를 코드로 표현
class Cat { private name: string; public constructor(name: string) { this.name = name; } public meow(): void { console.log(`${this.name}: 냐오오오옹~`); } }
클래스를 UML로 표현
접근 제어자
접근 제어자는 속성과 연산의 가시화(visibility)를 정의한 것이다.접근 제어자 표시 설명 public + 어떤 클래스의 객체에서든 접근 가능 private - 이 클래스에서 생성된 객체들만 접근 가능 protected + 이 클래스와 동일 패키지에 있거나 상속 관계에 있는 하위 클래스의 객체들만 접근 가능 package ~ 동일 패키지에 있는 클래스의 객체들만 접근 가능 분석 단계 vs 설계 단계
- 분석 단계에서는 속성의 구체적인 타입 정보나 가시화 정보보다 어떤 것을 속성으로 하는지가 더 중요하다.
- 설계 단계에서는 바로 코드 생성이 가능할 수 있는 정도로 구체적인 타입 정보와 가시화 정보를 기술한다.
1.3.2 관계
클래스 하나로만 이루어지는 시스템은 존재하지 않고 여러 개의 클래스가 서로 긴밀한 관계를 맺어 기능을 수행한다. UML에서는 이 관계를 다음과 같이 5가지로 표현한다.
- 연관 관계
- 일반화 관계
- 집합 관계
- 의존 관계
- 실체화 관계
연관 관계
- 클래스들이 개념상 서로 연결되었음을 나타낸다.
- 실선이나 화살표로 표시한다.
- 두 클래스 사이의 연과 관계가 명확한 경우에는 연관 관계 이름을 사용하지 않아도 된다.
- 역할 이름은 실제 프로그램을 구현할 때 연관된 클래스의 객체들이 서로를 참조할 수 있는 속성의 이름으로 활용할 수 있다.
다중성
다중성은 연관된 객체의 개수를 나타낸다.다중성 표기 의미 1 1 1...* 1 이상 2...5 2 또는 3 또는 4 또는 5 1, 3..5 1 또는 3 또는 4또는 5 방향성
- 방향성에는 양방향과 단방향이 있다.
- 양방향은 두 클래스의 객체들이 서로의 존재를 인식한다는 의미이다.
- 단방향은 한쪽에서만 존재를 인식한다는 의미이다.
💡 존재를 인식하다는 의미는 참조할 수 있다는 의미이다.
💡 참조의 3가지 경우
- 클래스의 속성에서 참조할 때
- 연산의 인자로 사용될 때
- 메서드 내부의 지역 객체로 참조될 때
연관 클래스
- 연관 클래스는 연관 관계에 추가할 속성이나 행위가 있을 때 사용한다.
- 연관 관계를 나타내려고 연결하는 선 중앙에서 연관 클래스까지 점선을 사용해 연결한다.
재귀적 연관 관계
재귀적 연관 관계는 동일한 클래스에 속한 객체들 사이의 관계다.
일반화 관계
- 한 클래스가 다른 클래스를 포함하는 상위 개념일 때를 나타낸다.
- 객체지향 개념에서는 상속 관계라고 한다.
- 두 클래스를 연결하는 화살표의 끝에 빈삼각형 표시를 해 표현하며 삼각형 표시가 있는 쪽은 부모 클래스, 반대쪽은 자식 클래스를 나타낸다.
집합 관계
- 연관 관계의 특별 경우로 전체와 부분의 관계를 명확하게 명시하고자 할 때 사용한다.
- 집약과 합성 두 종류의 집합 관계가 존재한다.
집약 관계
- 부분을 나타내는 객체를 다른 객체와 공유할 수 있는 경우에 사용한다.
- 전체 객체의 라이프타임과 부분 객체의 라이프타임은 독립적이다. 즉, 전체 객체가 메모리에서 사라진다 해도 부분 객체는 사라지지 않는다.
- '전체'를 가리키는 클래스 방향에 빈 마름모로 표시한다.
class Computer { private md: MainBoard; private c: CPU; private m: Memory; private ps: PowerSupply; public constructor(mb: MainBoard, c: CPU, m: Memory, ps: PowerSupply) { this.md = mb; this.c = c; this.m = m; this.ps = ps; } }
합성 관계
- 부분을 나타내는 객체를 다른 객체와 공유할 수 없는 경우에 사용한다.
- 부분 객체의 라이프타임은 전체 객체의 라이프타임에 의존한다. 즉, 전체 객체가 없어지면 부분 객체도 없어진다.
- '전체'를 가리키는 클래스 방향에 채워진 마름모로 표시한다.
class Computer { private md: MainBoard; private c: CPU; private m: Memory; private ps: PowerSupply; public constructor() { this.md = new MainBoard(); this.c = new CPU(); this.m = new Memory(); this.ps = new PowerSupply(); } }
의존 관계
- 연관 관계와 같이 한 클래스가 다른 클래스에서 제공하는 기능을 사용할 때를 나타낸다. 차이점은 두 클래스의 관계가 한 메서드를 실행하는 동안과 같은 매우 짧은 시간만 유지된다는 점이다.
- 점선 화살표를 사용해 표시한다.
class Car { // ... public fillGas(p: GasPump) { p.getGas(amount); // ... } }
실체화 관계
- 책임들의 집합인 인터페이스와 이 책임들을 실제로 실현한 클래스들 사이의 관계를 나타낸다.
- 상속과 유사하게 빈 삼각형을 사용하며 머리에 있는 실선 대신 점선을 사용해 표시한다.
💡 인터페이스란?
인터페이스를 책임의 관점으로 볼 수 있다. 어떤 객체의 책임이란 객체가 해야 하는 일로서 해석할 수 있고 어떤 경우에는 객체가 할 수 있는 일로도 해석할 수 있다. 즉, 객체가 외부에 제공하는 서비스나 기능은 객체가 수행하는 책임으로 보는 것이다.
혹은 인터페이스를 어떤 공통되는 능력이 있는 것들을 대표하는 관점으로 볼 수 있다.