1. 설계의 이해
요구 분석과 설계의 차이
2. 설계의 원리
분할과 정복
•
소프트웨어를 모듈 단위로 분할하여 개발
추상화
•
자신에게 필요한 특징만 표현한 것
◦
복잡한 현상을 간단히 이해할 수 있게 도와주는 강력한 도구
•
객체지향 설계에서 추상화는 유사한 특성을 가진 것끼리 그룹화 한 뒤 공통점을 뽑아 이름을 붙이는 것
1) 과정 추상화
상세 부분은 생략하고 전체 흐름만 파악할 수 있는 알고리즘 형태로 작성하는 것
2) 데이터 추상화
데이터와 데이터 구조를 감추는 것. 대표적으로 Class가 있음
데이터와 메서드를 클래스 형태로 캡슐화 해서 숨겨놓고 사용자에게는 꼭 필요한 기능만 사용할 수 있게 개방한 구조
3) 제어 추상화
프로그래밍 언어에서 쓰는 제어 구조를 추상화하는 것
기계어 → 어셈 → 고급 언어 등으로 추상화 하는 것
캡슐화
•
추상화를 통해 문제를 쉽게 개념화
•
객체 제공자와 객체 이용자를 명확히 분리
•
메서드의 구현 방법이 바뀌어도 사용자에게는 영향이 미치지 않아 사용하기 쉬움
•
메서드의 기능만 알면 객체를 쉽게 사용할 수 있다
•
객체 내 자료구조나 알고리즘이 바뀌어도 다른 객체에 미치는 영향이 적다
•
캡슐화로 객체 사이의 독립성이 구조적으로 보장된다.
•
객체 내부의 자료구조를 변경해도 그 객체와 인터페이스로 통신하는 사용자에게는 영향을 주지 않으므로 부담 없이 자료구조를 변경할 수 있다.
•
프로그램을 개발할 때 다른 모듈의 구현 내용은 자세히 알 필요 없이 제공하는 기능만 알면 되므로 사용자가 모듈을 이해하기 쉽다.
•
모듈 내의 데이터와 알고리즘을 변경하기 쉬우므로 기능을 추가하기도 쉽다.
정보 은닉
•
외부에서 객체의 내부를 들여다볼 수 없다는 개념
•
public, +, 공개 : 시스템의 모든 클래스가 접근 가능
•
private, -, 은닉 : 같은 시스템 내의 다른 클래스가 직접 접근할 수 없고 해당 클래스의 메서드를 통해서만 접근할 수 있다.
•
protected, #, 부분 공개 : 해당 클래스의 메서드와 클래스를 상속받은 하위 클래스만 접근할 수 있다.
상속
상위 클래스의 모든 것을 하위 클래스가 물려받아 사용하는 것
다형성
하나 이상의 형태를 갖는 것
1) 오버로딩 (중복 정의)
•
연산자 중복 정의
•
메서드 중복 정의 : 한 클래스 안에서 이름이 같은 메서드를 중복해서 사용, 매개변수의 개수나 자료형 등으로 구분
2) 오버라이딩 (재정의)
•
메서드 오버라이딩 : 상위 클래스에서 정의한 메서드는 무시하고 하위 클래스에서 다시 정의하여 사용하는 것.
•
리스코프 교체 원칙 : 상위 클래스의 객체는 언제나 하위 클래스의 객체로 교체할 수 있어야 한다.
◦
리스코프 교체 원칙을 지키기 위해 상위 클래스를 추상 클래스로 정의
3. 모듈화
•
모듈의 특징
◦
다른 것과 구별되는 독립적인 기능을 갖는 단위
◦
유일한 이름
◦
모듈에서 다른 모듈 호출 가능
◦
다른 프로그램에서도 모듈 호출 가능
•
모듈화의 원칙
◦
모듈간의 결합은 느슨하게 한다.
◦
모듈 내 구성 요소간의 응집은 강하게 한다.
•
모듈화의 장점
◦
복잡도가 감소한다
◦
문제를 이해하기 쉽게 만든다
◦
변경하기 쉽고 변경으로 인한 영향도 적다
◦
유지보수가 용이하다
◦
프로그램을 효율적으로 관리할 수 있다
◦
오류로 인한 파급 효과를 최소화 할 수 있다
◦
설계 및 코드를 재사용할 수 있다
•
모듈 간 관계
◦
호출 관계
◦
데이터 전달 관계
◦
제어 관계
모듈 평가 기준 1: 응집도
응집도는 모듈 내부에 존재하는 구성 요소 사이의 밀접한 정도, 즉 하나의 모듈 안에서 구성 요소 간에 똘똘 뭉쳐 있는 정도로 평가한다.
1) 기능적 응집
단일 기능의 요소가 하나의 모듈을 구성
2) 순차적 응집
요소 1의 출력을 요소 2의 입력으로 사용하므로 두 요소가 하나의 모듈로 구성된 경우이다.
3) 교환적 응집
같은 입력을 사용하는 구성 요소가 하나의 모듈로 구성
같은 출력을 구성요소가 만들어낼 때
순차적 응집보다 응집력이 약함
4) 절차적 응집
순서가 정해진 몇개의 구성 요소가 하나의 모듈로 구성된 경우
한 요소의 출력이 입력으로 들어가지 않고 그냥 순서대로 실행됨
응집도가 순차적 응집보다 낮음
5) 시간적 응집
모듈 내 구성 요소의 기능이 각기 다르다. 같은 시간대에 실행된다는 이유로 하나의 모듈로 구성
6) 논리적 응집
모듈간에 공통점이 있거나 관련된 임무가 존재하거나 기능이 비슷해서 하나의 모듈로 구성된 경우
7) 우연적 응집
걍 아무거나 모듈로 만든것, 응집도가 낮음
모듈 평가 기준 2: 결합도
모듈과 모듈 사이의 관계에서 관련 정도를 나타냄
모듈간의 관련이 적을수록 상호 의존성이 줄어 모듈의 독립성이 높아지고 독립성이 높아지면 모듈간의 영향이 적어 좋은 설계가 된다.
1) 데이터 결합
필요한 데이터만 주고 받는 관계
2) 스탬프 결합
정보를 교환할 때 필요한 정보만 주고받을 수 없고 필요 없는 것 까지 전체를 주고받아야 하는 경우
구조체를 주고 받거나 클래스를 주고 받거나...
3) 제어 결합
제어 플래그를 교환하여 모듈의 작동에 간섭하는 관계
4) 공통 결합
전역 변수를 공통으로 사용하는 것
5) 내용 결합
모듈간에 인터페이스를 사용하지 않고 직접 왔다 갔다 하는 것
상대 모듈의 데이터를 직접 변경할 수 있음
4. 사용자 인터페이스 설계
사용자 인터페이스 설계 지침
•
사용법을 배우기 쉽다
•
사용하기 편리하다
•
사용자가 데이터입력을 제어할 수 있어야 한다
•
사용자의 입력에 반응해야 한다.
•
도움말을 제공해야 한다
•
일관성을 유지해야 한다
•
입력 작업은 최소로 해야 한다
•
효율성을 고려해야 한다
•
사용자 오류에 대한 되돌리기 기능을 제공해야 한다
•
삭제 또는 취소 버튼 클릭 시 재확인을 요구해야 한다
•
사용하기 쉽게 직관적이어야 한다