앞서, 프로그램의 실행화면을 구상했고, 설계 / 개발 환경 및 사용된 Tool 들을 정의했으니, 이제는 StarUML 을 사용하여 진행한 설계 부분 내용을 말씀드릴 차례입니다.


[DigitalClockForDesktop 의 Use Case Diagram]


사용자와 DigitalClock 앱, 그리고 OS 간의 상호작용을 그림으로 나타내어 보면, 위과 같은 Use Case Diagram 을 만들 수 있습니다. Use Case Diagram 의 특성상, 개발자가 아닌 사용자나 기획자들도 프로그램이 제공하는 기능이나, 그 기능이 어떻게 연결되어 있는지를 쉽게 파악할 수 있습니다. 위의 그림을 보면, 사용자에게 제공되어야 할 기능은 앱 입장에서는 "가져온 시각을 출력하기" 가 되고, 앱 입장에서는 OS 로부터 현재시각을 가져와야 하기 때문에, OS 입장에서는 "현재 시각 가져오기" 라는 기능을 앱에게 제공하는 구조로 되어 있습니다.


[DigitalClockForDesktop 의 Class Diagram]


Use Case Diagram 을 통해서, 거시적 설계를 완료하였다면, 이제 프로그램의 미시적 설계에 들어가야 할 차례입니다. 미시적 설계란, 실제 개발자들이 개발하기 위해 본인들이 알아 볼 수 있는 언어로 세부적으로 설계하는 것을 말합니다. 비록 C 언어지만, 객체지향적으로 만들어야 하기 때문에 먼저, 위와 같은, Class Diagram 을 그려서, 프로그램을 구성하는 각 클래스들 (사용자 정의 자료형) 간의 관계는 물론, 클래스 내부의 멤버 변수나 함수들을 쉽게 파악할 수 있도록 해야 합니다. (한 파일에서만 사용하는 내부함수는 생략)


[Util 의 함수들]

 함수명

매개변수

(변수명 : 자료형)

반환형

설명

CursorUtil_GotoXY 

x : int

y : int


커서의 위치를 

x, y 위치로 이동합니다.

CursorUtil_Hide

 

 

커서를 노출하지 

않게 합니다.

WindowUtil_ChangeWindowSize

lines : int

cols : int

 

콘솔 창의 크기 

(가로, 세로) 를

lines, cols 로 

변경합니다.

FontUtil_ChangeFontColor

color : int

 

글자색을 color 로 

변경합니다.


Util 클래스는 프로그램 전체에서 개발시 편의성을 도모하기 위한 기능을 제공합니다. 예를 들어, 커서의 위치를 이동하거나, 커서를 숨기거나, 콘솔 창의 크기를 변경하거나, 글자색을 바꾸는 등의 다른 클래스들과는 관련성 없이 독자적으로 기능을 제공해주는 클래스입니다. Util 클래스에는 글자색을 열거형 상수로 관리하기 위한 FointColor 를 가지고 있습니다.


[FontColor 의 값들]

열거형 상수명 

정수

BLACK 

0

BLUE

1

GREEN

2

JADE

3

RED

4

PURPLE

5

YELLOW

6

WHITE

7

GRAY

8

LIGHT_BLUE

9

LIGHT_GREEN 

10

LIGHT_JADE 

11

LIGHT_RED 

12

LIGHT_PURPLE 

13

LIGHT_YELLOW

14

LIGHT_WHITE

15


FontColor 에는 열거형 상수가 순차적으로 정의되어 있는데, 검정색 0 부터 연한 흰색 15 까지 각 색상마다 정수가 매핑되어 있습니다. 이를 활용하여 글자 색을 변경할 수 있습니다.


[DigitalClock 의 변수들]

 변수

자료형

설명

year

int

년도

month

int

dayOfMonth

int

dayOfWeek

int

요일

hour

int

minute

int

second

int


DigitalClock 클래스는 멤버 변수로 년, 월, 일, 요일, 시, 분, 초를 가지고 있습니다. localtime 함수의 반환 구조체인 struct tm 을 그대로 사용하게 되면, 년도에도 1900 을 더해서 사용해야 하고, 월에도 1 을 더해서 사용해야 하는 번거로움이 생기게 됩니다. 또한, 향후 기능을 추가할 때, 구조체 안에 멤버 변수를 추가하기에 적합하지 않기 때문에, DigitalClock 이라는 사용자 정의 자료형을 정의해서 구현하기로 하였습니다.


[DigitalClock 의 함수들]

 함수명

매개변수

(변수명 : 자료형)

반환형

설명

DigitalClock_GetTime


DigitalClock

현재 시각을 토대로

DigitalClock 을 만들어

반환합니다.

 DigitalClock_Print

 digitalClock : DigitalClock

 

digitalClock 을 가지고

화면에 출력합니다.


DigitalClock_GetTime 함수는 OS 로부터 현재 시각을 가져와서 DigitalClock 에 저장한 다음 반환해주는 함수입니다. 또, DigitalClock_Print 함수는 만든 digitalClock 을 받아서 화면에 출력하는 함수입니다. DigitalClock 클래스와 연관된 이름이 정의되지 않은 열거형 상수가 있는데, 이는 화면에 시각을 출력할 때, 출력되는 시작 위치를 좀더 편리하게 계산하기 위한 상수입니다. 예를 들어, "12 : 34 : 56" 이라는 디지털을 화면에 출력하기 위해서, 1, 2, :, 3, 4, :, 5, 6 이라는 디지털의 순서를 상수로 저장해 놓게 됩니다.


[DigitalClock 과 관련된 열거형 상수의 값들]

열거형 상수명 

정수값

 HOUR_LEFT

0

 HOUR_RIGHT

1

 DELIMITER_BETWEEN_HOUR_AND_MINUTE

2

 MINUTE_LEFT

3

 MINUTE_RIGHT

4

 DELIMITER_BETWEEN_MINUTE_AND_SECOND

5

 SECOND_LEFT

6

 SECOND_RIGHT

7


HOUR_LEFT 를 0 으로 잡고 가장 오른쪽에 출력되야 할 SECOND_RIGHT 를 7 로 정의해 놓으면, 추후 화면에 출력시에, 이 정수값들을 체크해서 그만큼 가장 좌측으로부터 띄어서 출력하게 되는 것입니다. 


참고로, 클래스명 (사용자 정의 자료형 = 구조체명 or 열거형), 변수명, 함수명을 왜 위와 같은 식으로 지었는지 의아해 하는 분들이 있으실까봐 본 프로젝트 내의 명명규칙을 간략히 설명드리겠습니다.


클래스명 (사용자 정의 자료형 = 구조체명 or 열거형)

대문자로 시작하고, 카멜 표기법 사용

  ex) Util, DigitalClock, FontColor


변수명

소문자로 시작하고, 카멜 표기법 사용

  ex) dayOfMonth, dayOfWeek


함수명

대문자로 시작하고, 카멜 표기법 사용

클래스와 관련된 멤버함수의 경우는 "클래스명_함수명" 처럼 클래스명을 접두어로 사용

  ex) DigitalClock_Print

한 파일 내에서만 내부적으로 사용되는 함수의 경우는 _ (언더바) 로 시작

  ex) _InitDigitalClockSetting, _PrintPattern, _DigitalClock_PrintDate

 

Use Case Diagram 으로 프로그램의 기능을 확인했고, Class Diagram 으로 프로그램의 구조적 설계를 설명드렸으니, 이제 Sequence Diagram 으로 프로그램의 흐름을 설명드릴 차례입니다.


[DigitalClockForDesktop 의 Sequence Diagram (main 함수)]

위의 Sequence Diagaram 은 main 함수의 실행 흐름을 도식적으로 표현한 것입니다. 편의상 함수 호출 depth 는 3 까지만 그려 보았습니다. (너무 깊게 들어가면, 보기가 힘들어져서) 먼저, 사용자가 앱을 실행합니다. main 함수가 실행되고, main 함수에서, _InitDigitalClockSetting 함수를 실행하여 디지털 시계에 관련된 환경설정을 합니다. 그 다음에 계속 반복을 하면서, DigitalClock_GetTime 함수를 호출합니다. 그러면 DigitalClock 에서는 OS 로부터 현재 시각을 가져와서 digitalClock 을 만들어 반환하고, main 에서는 이를 DigitalClock_Print 함수의 매개변수로 넘기면서 호출합니다. DigitalClock 에서는 _DigitalClock_PrintDate 함수를 호출하여 날짜를 출력하고, _DigitalClock_PrintTime 함수를 호출하여 시각을 출력합니다. 마지막으로, Sleep 함수를 호출하면서 1 초간 실행을 멈추었다가 다시 재개합니다. (1 초를 셉니다.) 결국, 1 초에 한 번씩, 시간을 가져와서 출력하는 형태가 됩니다.

by kkikkodev 2015. 4. 10. 15:21