main 함수

Development/Common 2012. 3. 7. 22:54

C언어 main 함수 의미, 메인 함수 역할; main function


C소스의 main() 이라는 메인 함수는, 평범한 함수가 아니라, "프로그램 그 자체"입니다. 그리고 C에서는 모든 것이 함수들로 이루어져 있습니다. 그래서 어느 함수부터 코드를 실행할지 지정해야 할 것입니다. 그 시작점이 바로 main() 함수입니다. main() 함수가 없으면 exe 같은 실행 파일을 만들 수 없습니다.

main() 함수도 일반 함수와 마찬가지로 인수(파라미터)를 입력받거나 어떤 값을 반환할 수 있습니다.

일반함수는 자신을 호출한 함수와 값을 주고받지만, main() 함수는 자신을 호출한 함수가 없습니다. 호출한 함수가 있다면 그것은 바로 운영체제입니다. 따라서 운영체제(OS)와 값을 주고받습니다.

이것은

main(int argc, char* argv[])

프로그램을 실행할 때 준 옵션을 받는 코드입니다. 그리고 메인함수의 return문은 운영체제에 어떤 값을 반환하는 것입니다. 

각 함수에는 인수(파라미터)를 지정할 수 있습니다. 프로그램 본체인 main() 함수에도 당연히 인수를 지정할 수 있습니다. 메인 함수의 인수는, 운영체제에서 그 프로그램을 실행할 때 지정해 준 "옵션"입니다.

예를 들어 도스창(명령 프롬프트;CMD.EXE)에서

dir /?

이렇게 하면 dir 명령에 대한 도움말이 출력됩니다. 이때 "/?" 라는 문자열이 옵션이 되는 것입니다.



main(int argc, char* argv[])
에서

argc 는, 프로그램을 실행할 때 지정해 준 "명령행 옵션"의 "개수"가 저장되는 곳입니다.

argv 는, 프로그램을 실행할 때 지정해 준 "명령행 옵션의 문자열들"이 실제로 저장되는 배열입니다.


다음 예제를 보면 쉽습니다.

int argc, char* argv[] 사용법 예제; main() Option Example


소스 파일명: 0.cpp
#include <stdio.h>
#include <stdlib.h>  // exit()

int main(int argc, char* argv[]) {


  // 옵션 지정하지 않았을 때 에러 출력하고 종료
  if (argc == 1) {
    fputs("에러! 옵션을 입력하지 않으셨군요...\n", stderr);
    exit(1);
  }


  // 옵션 개수 출력
  printf("%d 개의 옵션을 입력하셨군요\n\n", argc - 1);


  // 옵션 배열의 요소들을 하나씩 출력
  for (int i = 1; i < argc; i++)
    printf("argv[%d] = %s\n", i, argv[i]);

  return 0;
}



컴파일 및 실행 결과 화면:
D:\Z>cl /nologo 0.cpp
0.cpp

D:\Z>0.exe
에러! 옵션을 입력하지 않으셨군요...

D:\Z>0.exe 111 222
2 개의 옵션을 입력하셨군요

argv[1] = 111
argv[2] = 222

D:\Z>0.exe AAA BBB CCC
3 개의 옵션을 입력하셨군요

argv[1] = AAA
argv[2] = BBB
argv[3] = CCC

D:\Z>0.exe 자장면 탕수육 짬뽕 불도장 팔보채
5 개의 옵션을 입력하셨군요

argv[1] = 자장면
argv[2] = 탕수육
argv[3] = 짬뽕
argv[4] = 불도장
argv[5] = 팔보채

D:\Z>



옵션을 하나도 입력하지 않으면 argc 는 1이 됩니다. 즉 argc 는 항상 1 이상입니다. 0이 되지 않습니다.

위의 경우, argv[0]은 0.exe 가 됩니다. 즉 argv 의 첫번째 요소는 항상 "프로그램 자신의 파일명"입니다.

따라서 옵션의 정확한 개수를 구하려면 argc 에서 1을 마이너스해 주어야 합니다.




Java/자바] main()의 String args[] 배열 용도, 사용법 예제

Friday, November 10, 2006

public static void main(String args[]) {...

메인(main) 메소드(함수)의, 기본으로 항상 있는 args[] 라는 "문자열 배열"은

자바 프로그램 실행시에 주어진 "옵션"들이 자동으로 담겨지는 곳입니다.Arguments 즉, "인수" = "매개 변수" = "파라미터" 라는 뜻입니다.


실행시 옵션이란?


도스창(명령 프롬프트;cmd.exe)에서

dir *.txt

라고 하면 모든 txt 확장자를 가진 파일들의 목록이 출력됩니다. "dir"은 명령어이고 "*.txt"는 옵션입니다. 자바 프로그램에서는 "*.txt" 이런 옵션이String args[] 라는 문자열 배열에 자동으로 들어갑니다.



"java Foo" 이런 명령으로, Foo.class 라는 자바프로그램을 실행할 때

java Foo ABC IBM GOOGLE Yahoo! Hmmmm... 1234

이렇게 뒤쪽에 문자열을 붙여서 실행했다면

ABC
IBM
GOOGLE
Yahoo!
Hmmmm...
1234

이런 6개의 옵션들이 args[] 라는 배열에 자동으로 들어가고, 프로그래머는 이 배열에서 값을 꺼내서 사용하면 됩니다.

가령 --help 또는 -help 라는 옵션이 발견된다면, 사용자가 도움말을 필요로 한다는 뜻이므로 도움말을 출력하면 되겠지요.


String args[]
이렇게 해도 되고

String[] args
이렇게 대괄호를 앞쪽에 붙여도 똑같습니다.



다음 예제는 args[] 배열의 요소 개수와 내용을 출력하는 간단한 예제입니다.

자바 메인 함수 String args[] 사용 예제


소스 파일명: Foo.java
class Foo {
  public static void main(String args[]) {

    // 옵션 개수 검사. 옵션 없으면 에러 메시지 출력하고 종료
    if (args.length == 0) {
      System.err.println("옵션을 입력하세요");
      System.exit(1);
    }


    // 옵션 개수 출력
    System.out.println("모두 " + args.length + "개의 옵션을 입력하셨군요.");

    System.out.println(); // 줄바꿈


    // 모든 옵션 하나씩 화면에 출력
    for (int i = 0; i < args.length; i++)
      System.out.format("args[%d] : %s%n", i, args[i]);

  }
}


위의 예제 컴파일 및 실행 결과:
D:\Z>javac Foo.java

D:\Z>java Foo
옵션을 입력하세요

D:\Z>java Foo 111 222 333 444
모두 4개의 옵션을 입력하셨군요.

args[0] : 111
args[1] : 222
args[2] : 333
args[3] : 444

D:\Z>java Foo 자장면 탕수육 짬뽕 우동 물만두
모두 5개의 옵션을 입력하셨군요.

args[0] : 자장면
args[1] : 탕수육
args[2] : 짬뽕
args[3] : 우동
args[4] : 물만두

D:\Z>




좀더 실용적인 예제는 여기 있습니다: ▶▶ 자바,Java] 유니코드(UTF-8)변환, KS완성형 파일을 유니코드로 바꾸기
이것은 옵션으로 지정해준 한글완성형 파일을 유니코드로 변환하여 새 파일로 저장합니다.





C언어] return 0; return 1; return -1; 의 뜻 의미, 사용법 예제


return (리턴) 이라는 것은 함수가 아니라, C언어의 키워드(예약어)입니다. 현재의 함수를 종료시키고 그 함수를 호출했던 곳으로 되돌아가라는 뜻입니다. 단, 돌아가며 어떤 값을 가지고 갈 수 있습니다. 즉, 값을 반환하는 것입니다.

예를 들어 다음과 같은 소스가 있다고 할 때

파일명: 0.cpp
#include <stdio.h>

int foo(void);


int main(void) {

  printf("%d\n", foo());

  return 0;
}


int foo(void) {
  return 1234;
}


컴파일을 하고 실행하면
D:\Z>cl /nologo 0.cpp && 0.exe
0.cpp
1234

D:\Z>

이렇게 1234 라는 값이 출력됩니다.

foo()라는 함수가, 자신을 호출한 printf() 함수에 1234 라는 값을 리턴했기 때문입니다. int foo... 라고 되어 있기에, 정수(int)만을 반환할 수 있습니다.

그리고 프로그램 본체인 main() 함수 역시 return 0; 를 사용하여 어딘가로 0 이라는 값을 돌려주고 있습니다. main() 함수의 return문은 "운영체제"로 값을 반환합니다. MS윈도우XP에서 위의 예제 프로그램을 실행했다면, 윈도우XP의 명령 프롬프트(cmd.exe)로 0이라는 값을 반환하는 것입니다.


왜 return 0; 이렇게 0 이라는 값을 반환했느냐 하면, "에러가 없이 정상적으로 프로그램이 종료되었다"는 뜻입니다.

만약 main() 에서 무슨 에러가 있었다면 0이 아닌 값, 예를 들어 1이나 2 또는 -1 등을 윈도우로 반환해야 합니다.

보통 함수에서는 그 함수가 하는 일에 따라서 리턴 값이 달라지지만, main() 함수에서는 되도록 위의 규칙에 맞게 반환값을 정해야 합니다.

그렇지 않으면, 그 프로그램을 배치 파일 (BATCH; .BAT) 등에서 사용할 때 문제가 생길 수 있습니다.

배치 파일 안에서는, 방금 실행한 프로그램이 성공적으로 종료되었는지 아닌지 판단하기 위해, 그 프로그램의 반환값을 사용합니다. 반환값이 0이면 그 프로그램이 성공적으로 종료되었다고 판단하고 그 다음 작업을 계속합니다. 0 이 아니면 에러가 있다는 뜻이니까, 에러에 대한 적절한 처리를 해야 합니다. (▶▶ [배치 파일] 프로그램 실행의 성공 여부를 Error Level 로 확인/판단하기: ERRORLEVEL 참고)





[C언어 기초] return 이란? 함수인가요? return 0; 의 의미는?

 
return 은 함수가 아니라, C언어의 키워드(keyword) 즉 "예약어"입니다. C언어에서는 뒤에 소괄호"()"가 없으면 함수가 아닙니다. (▶▶ "[C언어] C언어와 C++의 예약어 리스트; Keywords" 참조)

(참고로, 펄(Perl)의 함수에서는 소괄호를 생략할 수 있음)


return 은, 현재 있는 함수에서 빠져나가며, 그 함수를 호출했던 곳으로 되돌아 가라는 뜻입니다. 되돌아 가면서 그 함수를 호출했던 곳 즉 calling routine 에 어떤 값을 반환하는 것입니다.

return 0; 는 0 이라는 값을 반환하라는 의미이고
return 1; 은 1 이라는 값을 반환하라는 뜻입니다.

return 은 함수의 어떤 곳에서도 위치할 수 있는데, return 이 실행되는 즉시 그 함수는 무조건 실행이 종료됩니다.

즉, 현재의 함수에서 빠져 나가라는 의미입니다.



* 그 함수가 무엇을 계산하는 함수라면, 그 계산 결과의 값을 return 으로 반환합니다.
* 계산이 아닌, 어떤 일을 하는 함수라면, 그 일이 성공했을 때에는 0 을, 실패했을 때에는 1 을 반환하며 끝내는 것이 보통입니다. 그러면 그 함수를 호출한 곳에서, 그 함수가 제대로 실행되었는지 판단할 수가 있습니다.



#include <stdio.h>

int main() {

  puts("하하하하");

  return 0;
}

위의 예제는, 지구상에서 가장 단순한 C프로그램입니다. 그냥 하하하하 라는 문자열을 명령 프롬프트 화면에 출력하는 것이 전부입니다.

puts() 함수에서 에러가 나는 경우는 사실상 없고, 그래서 성공적으로 프로그램이 실행되었기에, return 0; 이라고 끝났습니다. main() 함수에서 빠져나가면서 정수 0 을 반환하라는 의미입니다. main() 함수는 프로그램 그 자체이므로, main() 함수에서 빠져나간다는 것은, 그 프로그램을 종료시킨다는 의미입니다. main() 함수를 호출한 루틴은, 컴퓨터 OS 그 자체이므로, 결국 OS에 0 이라는 값을 반환하는 것입니다. 이것을 도스/윈도우에서는 "Error Level" 이라고 합니다. 윈도의 명령 프롬프트에서,

echo %ERRORLEVEL%

이라고 치면, return이 방금 반환한 그 값을 볼 수 있습니다. 이 경우에는 0 이라는 값이 화면에 출력됩니다. 그런데 %ERRORLEVEL% 은, 어떤 명령어나 프로그램의 실행이 종료될 때마다 값이 자동으로 변경됩니다. (▶▶ "[배치 파일] 프로그램 실행의 성공 여부를 Error Level 로 확인/판단하기: ERRORLEVEL" 참조)

※ 단, 윈도98에서는 echo %ERRORLEVEL% 이 작동하지 않습니다. 윈도2000 이상의 OS에서만 됩니다.


main() 앞에 int 라고 함수형이 정의되어 있는데, 이것은 main()이 return 을 사용해 반환하는 값이 '정수'라는 의미입니다.

만약 void main()... 이라고 되어 있다면, "void"는 "아무것도 없다"는 뜻이기에, 결과값이 없다는 뜻이고, 그래서 return 문으로 결과값을 반환할 수 없는 것이 원칙입니다. 억지로 return 문을 사용한다면 "warning C4098: 'main' : 'void' function returning a value (반환값이 없는 함수인 main이 어떤 값을 반환했음)" 이런 경고가 나옵니다. 그래도 컴파일은 되지만 이런 경고를 고치지 않으면 나중에 버그투성이의 프로그램이 될 가능성이 높아집니다.




업데이트:
void 형 함수에서도 return; 을 쓸 수 있습니다. 아무것도 반환하지 않는 return; 즉, 단지 함수를 종료시키기 위한 return; 이라면 됩니다. 이 부분에 대한 설명이 누락되었는데 이상곤님께서 지적해 주셔서 방금 업데이트했습니다 ^^;



예제:

#include <stdio.h>

void main() {

  return;
}




출처 -  http://mwultong.blogspot.com/2007/06/c-main-main-function.html 






'Development > Common' 카테고리의 다른 글

Base64 원리 2  (0) 2012.04.11
unreachable code  (0) 2012.03.12
프로그램 소스코드를 공개하는 사이트  (0) 2012.03.07
Font(글꼴)  (0) 2012.03.06
Freemarker  (0) 2012.02.26
Posted by linuxism
,

Subversion/SVN 설정시 branches, tags, trunk 에 대한 개념
 

trunk
- 기본적으로 개발을 시작할 때 사용하는 디렉토리(소스의 주 개발 작업을 진행하는 폴더)
- 모든 프로그램 개발 작업은 trunk 디렉토리에서 부터 시작
- main, mainline, production의 의미로 사용됨

 

branches
- trunk 에서 뻗어져 나온 나뭇가지(소스의 실험적인 작업을 진행하는 폴더, 소스의 현재 버전을 유지보수 하고, 현재 버전을 기반으로 차기 버전을 개발할 경우 이 폴더 이용)
- trunk 디렉토리에서 프로그램을 개발하다보면 큰 프로젝트에서 또 다른 작은 분류로 빼서 개발하는 경우.
- 프로젝트 안의 작은 프로젝트
- release 버전과 유지보수 버전을 분리하고 싶을 때 사용
- customizing이나 hot fix 목적으로 분리하여 수정함
- 수정이 계속해서 발생하다가 궁극적으로는 trunk에 merge 되는 것이 일반적임

 

tags
- 꼬리표의 개념.
- 현재 릴리즈된 소스를 관리하기 쉽게 따로 보관하는데 사용. 즉, 개발을 위한 것이 아니라 보관을 위한 것이기 때문에 export만 해야 한다. 체크아웃하여 커밋 할 경우 경고 메시지가 출력된다.
- 프로그램을 개발하면서 정기적으로 릴리즈 할 때 0.1, 0.2, 1.0 식의 버전의 소스를 따로 저장하는 공간
- 한번 만들면 수정하지 않음
- releases, snapshots, baselines의 의미로 사용됨



출처 - 
http://jinsepi.blog.me/100119372539 





- branches 
 : 소스의 실험적인 작업을 진행하는 폴더,
   소스의 현재 버전을 유지보수 하고, 현재 버전을 기반으로 차기 버전을 개발할 경우 이 폴더를 이용

- trunk
 : 소스의 주 개발 작업을 진행하는 폴더

- tags
 : 현재 릴리즈된 소스를 관리하기 쉽게 따로 보관하는데 사용.
   즉, 개발을 위한 것이 아니라 보관을 위한 것이기 때문에 export만 가능하다.
   체크아웃하여 커밋할 경우 경고 메시지가 출력된다.



출처 - http://blog.naver.com/ziugae80?Redirect=Log&logNo=88242569






Posted by linuxism
,

Ogasawara Noriko 2006.12.26 / PM 04:02 UML 

[지디넷코리아]내가 UML을 처음으로 본 것은 1999년, 자바 프로그래밍을 시작했던 시기였다. 당시는 아직 별로 보급돼 있지 않았고,「UML이란 무엇인가」「무엇을 위해서 사용하는가」「방법을 잘 모르는 채 우선 사용하는 것은 아닌가」라는 의문이 있는 정도에 지나지 않았다.

OMG(Object Management Group: 객체 지향 기술의 표준화를 행하는 단체)가 정식으로 UML을 인정하고 나서 약 10년이 된 최근에는 시스템 개발에 종사하는 사람 중에서 ML이라는 말을 들은 적이 없다는 사람은 거의 없는 게 아닐까. 

실제로 개발 현장에서 UML 자체를 설명해야 하는 경우는 거의 사라졌고, 사용할 수 없어도 읽을 수 있다는 사람은 꽤 늘어난 것으로 생각한다. SNS나 웹 2.0과 같이 시스템 업계와 관련 없는 사람이라도 알고 있는 수준까지는 이르지 못했지만, UML이라는 단어를 자연스레 사용할 수 있게 된 것은 개발자끼리의 커뮤니케이션이 보다 쉬워진다는 뜻에서 매우 기쁜 일이다.

여기에서는 UML에 대해 어떤 지식도 가지지 않는 사람을 대상으로 UML로 무엇이 가능한지, 또 무엇을 위해서 있는지 라는 질문에 대한 답에서부터 실제의 개발 현장에서 UML이 어떻게 사용되고 있는지를 설명하고자 한다.

UML이란 무엇인가
UML이라고 하는 단어는 Unified Modeling Language의 머리글자를 취한 것으로, 따로 번역한 것은 존재하지 않고 그대로「UML」이라고 한다. UML은 객체 지향 기술을 사용해 시스템을 설계할 때에 이용하는 그림과 그 목적 및 기법을 정한 것이다. 

랭귀지(Language)라고 부르면서도 C나 자바와 같은 프로그램 언어가 아니고, 어디까지나 그림의 쓰는 법이나 읽는 법을 결정하고 있을 뿐이다.

UML이 탄생할 때까지 수많은 기법이 난립해 개발자를 괴롭히고 있었지만, OMG가 표준 기법으로 UML를 인정하고 나서는 개발자의 공통 언어로 단번에 보급하게 되었다. 그 덕분에 온세상의 개발자가 말의 벽을 넘고 설계서를 쓰거나 읽을 수 있게 되었다. 

또 조사 하나로 반대의 의미가 되기도 하는 애매한 표현으로 문장을 쓰는 것보다도, UML의 그림을 서로 보여주는 것으로 정확하게 뜻을 전달할 수 있다는 것이 점차 널리 인정되면서 UML은 더욱 널리 쓰이게 되었다. 

UML의 관리 자체는 OMG가 하고 있지만, 이용에 대한 제약 없이 누구나 자유롭게 사용할 수 있다. 2003년에는 버전 2.0이 나오면서 한층 더 엄밀하게 정의할 수 있게 되었다. 이와 같이 기본적인 사용법은 변하지 않은 채 모호성을 배제한 표기를 할 수 있도록 UML도 진화하고 있다.

UML로 무엇이 가능한 것인가
UML 2.0에서는 전부 13종류의 다이어그램이 규정되고 있다. 이 다이어그램들을 목적에 맞추어 구분하여 사용하는 것으로 정적 또는 동적으로 시스템을 시각적으로 표현할 수 있다. 실제 현장에서 잘 사용되는 다이어그램을 몇 개 소개한다.

클래스 다이어그램
클래스 다이어그램에서는 시스템화 대상인 업무의 주요한 정보를「클래스」로서 정의해 클래스의 특성이나 클래스 간의 관련 등을 정적으로 나타낸다. 예를 들면「거래처에 법인과 개인의 2 종류가 있고, 거래처로부터의 수주에는 상품마다 명세서를 작성한다」라는 일을 아래와 같은 그림으로 표현할 수 있다.



클래스 그림 중에 있는 「1」이나 「*」은 다중도로 불려 각각 「1개」「복수」라고 읽는다. 따라서 이 다이어그램은 거래처 1개에 대해서 복수의 수주가 있는, 1개의 수주에는 복수의 상품 명세가 있다는 의미가 된다.

순서도 
순서도에서는 처리의 흐름이나 실행 타이밍이라는 동적인 시스템의 행동을 나타낸다. 세세한 논리를 기술할 수 없지만, 문장으로 하는 설명과 비교해서 이해하기 쉽기 때문에 복잡한 처리를 설명할 때 등에 사용된다.



그 밖에도 상태나 상태가 변화하는 타이밍을 나타내는 「스테이트 머신(state machine) 다이어그램」이나 시스템의 기능과 그 실행자의 관계를 나타내는「유즈 케이스(use case) 다이어그램」등도 자주 사용된다.

UML의 용도
사실 UML은 기법을 결정하고 있을 뿐 그 사용법까지는 정의하고 있지 않다. 즉 UML 사용방법은 이용자에게 맡고 있기 때문에 기술 방법만 지키면 자유롭게 UML을 사용할 수 있다. 그렇다고는 해도 실제의 시스템 개발의 현장에서는 주로 3가지의 용도로 쓰이는 경우가 많다.

용도 1. 모델링 
요건 정의 국면에서는, 현행 시스템을 이해하는 것이나「무엇을 만들까?」를 의식해 유저의 요건을 묻기 위해서 모델링이라고 하는 기법을 사용해 시스템의 전체상을 그리는 작업을 하는 일이 있다. 이 작업을 실시하는 사람을 모델러라고 부르고 모델링에 의해서 작성하는 그림을 개념 모델이라고 부른다. 

개념 모델 자체는 어떠한 표현을 해도 상관없지만, 일반적으로는 UML의 클래스 다이어그램을 사용하는 것이 많은 듯하다. 그 이유 중 하나는 설계자가 이해하기 쉽기 때문이다.

UML을 사용한 모델링에서는 유저의 머릿속에 있는 요건을 정보로 정리하고 그 정보끼리의 관계를 정의해 도식화하는 것으로 시스템의 요건을 전체상으로서 파악한다. 실제로 이 작업을 보고 있으면, 마치 최초부터 거기에 존재했나 싶을 정도로 클래스 다이어그램이 완성되어 가는 모습에 매우 놀란다. 

또 클래스 다이어그램의 읽는 법이 몇 가지는 결정돼 있긴 하지만 기억할 것은 많지 않다. 직감적으로 판단할 수 있기 때문에 UML에 익숙하지 않은 유저도 이해하기 쉬어서 개념 모델(클래스 다이어그램)에 대한 평가는 대체로 높다.

만약 클래스 다이어그램을 사용하지 않고 말만으로 유저의 요건을 정리하려고 하면, 부분적인 요건의 상세화는 할 수 있지만 전체를 파악하는 것이 어려워 주제가 희미해져 버리는 약점이 있다. 

한편 클래스 다이어그램을 유저와 함께 만들어내 가는 모델링에서는 전체상을 시각적으로 이해할 수 있어 유저 자신이 깨닫지 못했던 과제도 발견할 수 있다는 장점이 있다.

단지 모델링의 단계에서 작성하는 클래스 다이어그램은 다음에 설명하는 설계 레벨의 클래스 다이어그램에 비해 매우 입도가 엉성하고 정보도 부족한 것이 많기 때문에 그대로는 프로그래밍할 수 없다. 그 대신 유저와 개발자의 사이에 「대체로 이런 느낌」이라고 하는 시스템에 대한 요구를 합의할 수 있어 요건 정의 국면에서는 매우 유효하다.

이와 같이 모델링에서는 UML의 클래스 다이어그램을 사용하는 것이 일반적입니다만 추상도가 높은 클래스 다이어그램의 정보를 구체화해 보충하는 스테이트 머신 다이어그램나 오브젝트 다이어그램도 잘 사용된다. 

덧붙여 시스템 기능을 드러내기 위해서 유즈 케이스 다이어그램을 사용하기도 하지만, 보통 개발 현장에서는 기능 일람으로 대용하는 것이 많은 듯하다.

용도 2. 설계
이와 같이 요건 정의 국면에 UML을 사용해 작성한 그림은 설계에서 보다 구체화된다. 예를 들면, 개념 모델(클래스 다이어그램)이나 스테이트 머신 다이어그램으로부터 데이터베이스의 논리 설계를 행하거나 실제 이미지에 접근하기 위해서 클래스의 상세화를 한다.

설계 국면에서는 「어떻게 만들까?」를 의식하지만, 자바 등의 객체 지향 언어로 개발하는 것이 전제가 되고 있는 경우 UML을 사용하고 설계도(클래스 다이어그램이나 순서도 등)를 쓰는 경우가 많다. 

실제로 움직이는 물건을 만들기 위한 설계이므로, 모델링에 비해 보다 엄밀성이 요구되지만 이 때 표기 방법이 명확하게 정해져 있는 UML이 매우 도움이 된다(단, 업무 사양 등 개별의 논리를 UML로 표현할 수 없다).

설계에서 클래스 다이어그램을 사용하는 가장 큰 장점은 클래스 간 인터페이스를 빠른 단계에서 명확하게 할 수 있는 점이다. 설계에서 쓰는 클래스 다이어그램에는 클래스의 속성이나 관계뿐 아니라 조작도 나타내게 되어 있다. 

예를 들면, 수주 클래스에 수주 등록이라는 조작을 하는 것으로 그 클래스를 사용해 수주 정보를 등록할 수 있는 것이다. 여기에서는 조작을 실행하기 위해서 필요한 (입력) 정보와 실행 결과의 (출력) 정보를 분명히 해 클래스의 인터페이스를 정의하지만, 그 조작 자체의 내용을 자세하게 나타내 보일 필요가 없기 때문에 필요한 정보를 최저한의 표기로 나타내 보일 수 있다.

덧붙여 설계 시에 클래스 다이어그램이나 순서도 등을 만드는 것은 필수가 아니고, 비교적 소규모의 시스템으로 개발 멤버 사이에 미리 설계 방법이 공유되어 있는 경우에는, 필요에 따라서 코딩제의 프로그램으로부터 리버스해 클래스 다이어그램 등을 작성해, 설계서를 나중에 작성하기도 한다. 리버스 기능은, 이후 설명하는 툴로 지원되고 있다.

용도 3. 프로그래밍 
실행 환경에 의존하지 않는 UML 모델로부터 툴을 사용해 실제로 움직이는 프로그램으로 변환하는 기술을 MDA(Model Driven Architecture)라고 부른다. MDA에 준거하면, 모델링→설계→프로그래밍에의 변환을 모두 UML만으로 할 수 있게 된다.

그러나 실제 현장에서는 MDA는 거의 보급되어 있지 않고, 변함없이 프로그래머가 설계서를 보면서 손으로 코딩하는 스타일이 여전히 계속 되고 있다. 현시점에서는, 툴 그 자체가 지원하고 있는 기술이 미성숙하기도 해서, 실제 현장에서 MDA가 적극적으로 사용되는 것은 어쩔 수 없는 것 같다.

UML 툴의 종류
UML로 도표를 그릴 때 일반적으로 툴을 이용한다. 툴에는 무료로 사용할 수 있는 것으로부터 유료까지 다양하지만, 모두 UML로 정해져 있는 기법에 따른 도표를 그리는 기능을 대충 갖추고 있다.

일본에서는, 체인지 비전의 무상 UML 툴「JUDE/Community」가 널리 사용되고 있다. 현시점에서 이 툴은 UML 1.4밖에 안되지만, 기본적인 이용이면 문제 없이 사용할 수 있다. 유료 판의「JUDE/Professional」는 UML 2.0에 대응하고 있다.

그 밖에 유료 툴로 적당한 것에는 마이크로소프트의 「비지오(Visio)」가 있다. 또 프로그래밍을 하면서도 간편하게 사용하고 싶은 경우에는, 원시 코드와의 제휴가 간단한 오픈소스의 개발툴「이클립스(Eclipse)」의 플러그인(무료)도 다수 제공되고 있다.

UML의 기법은 누가 봐도 보통의 해석밖에 할 수 없게 엄밀하게 정의되고 있다. 이것은 일견 딱딱하게 생각되지만, 그 엄밀함에 의해서 애매함을 배제할 수 있는 장점은 매우 큰 것이다. 

나는 UML의 존재 의의는, 시스템화 대상으로 하는 실무의 세계를 시스템의 세계에 변환하기 위한 수단을 제공하는 것이라고 생각하고 있다. 모든 개발자가 UML을 통해 같은 것을 볼 수 있게 되면, 정보의 전달은 더 부드럽게 될 것이다. @ 


출처 -  http://www.zdnet.co.kr/news/news_view.asp?artice_id=00000039154123&type=det 



'Development > UML' 카테고리의 다른 글

이클립스 UML 종류  (0) 2012.03.12
UML의 기초  (0) 2012.03.12
UML (Unified Modeling Language, 통합 모델링 언어)  (0) 2012.03.06
StarUML 소개2  (1) 2010.12.07
StarUML 소개1  (0) 2010.12.07
Posted by linuxism
,