소프트웨어공학 () 2005 년가을학기 문양세컴퓨터과학과강원대학교자연과학대학 In this chapter (1/2) 구현, 즉코딩 (coding) 은 설계된내용을원시코드 (source code) 로변환시키는작업 설계사양 (design spec.) 코딩 원시코드 (source code) 컴파일디버깅 목적코드 (object code) 코딩의원칙 설계내용을철저히반영시킨다. ( 어렵다고빼고진해아면나중에후회 ) 원시코드는간단명료하도록한다 디버깅이쉽도록한다. 시험이용이해야한다. 수정이간편해야한다. Page 2 1
In this chapter (2/2) We will cover 프로그래밍언어 4세대프로그래밍언어 비주얼프로그래밍언어 코딩스타일 원시코드의문서화 Page 3 프로그래밍언어의역할 컴퓨터를제어 (control) 소프트웨어의구현및저장 프로그래머사이의의사소통 논리흐름의표현 문서화 (documentation) 언어의기능 vs. 사용자들의반응 소프트웨어의구조와알고리즘적인특성을크게좌우 적합한프로그래밍언어의선택이중요한요소임 Page 4 2
프로그래밍언어의발전 (1/5) 제 1 세대언어 : Machine language, assembly language 제 2 세대언어 : Fortran, Cobol, Algol60, Basic 제 3 세대언어 범용 : PL/1, Pascal, Modula-2, C, Ada, C++, SIMULA, Smalltalk, Java, 특수 : CHILL, RPG, Lisp, Prolog, APL, 제 4 세대언어 (4GL, non-procedural language): MANTIS, IDEAL, RAMIS II, SQL, Page 5 프로그래밍언어의발전 (2/5) Assembly language 예제 Intel Chip (Linux) Sparc Chip (Solaris) Page 6 3
프로그래밍언어의발전 (3/5) Fortran 프로그램예제 Page 7 프로그래밍언어의발전 (4/5) Pascal 프로그램예제 Page 8 4
프로그래밍언어의발전 (5/5) C 프로그램예제 Page 9 프로그래밍언어선택시고려사항 프로젝트의상황 프로그래밍언어자체의특성 Page 10 5
프로젝트의상황 사용자의요구 유지보수를사용자가직접담당하는경우특정언어를요구할수있음 프로그래머의지식 ( 가장 ) 숙달된언어 기능의제한성이파악된언어 완성되었거나현재진행되는프로젝트에사용되고있는언어 익숙한언어 두개이상의프로젝트가진행 가능한하나의언어로통일하는것이유리 컴파일러의가용성과품질 하드웨어 적당한가격 목적코드의효율성, 품질, 오류메시지의분량 소프트웨어개발도구의지원 에디터, 디버거 (debugger), 링커 (linker), 추적기 (tracer) 호환성 Page 11 프로그래밍언어자체의특성 표현력과적합성단순성, 명확성, 직교성언어의문형제어구조자료형상수프로시저와함수프로시저및자료추상화재사용 Page 12 6
표현력과적합성 원하는작업을얼마나효율적으로충분히표현할수있는가? 예제 COBOL : 사무응용분야 C 언어 : 시스템프로그래밍 Pascal : 프로그래밍교육 ( 풍부한자료구조 ) Modula-2 : 시스템프로그래밍에적합 Ada : 실시간처리응용 Lisp, Prolog : 인공지능 작업자체를실현하기에가장적합한언어를선택하는것이바람직함 Page 13 단순성, 명확성, 직교성 단순성 : 예약어 (reserved word) 의개수가적어야함 적을수록쉽게이해하고익숙해질수있음 COBOL-74: 300 여개, Pascal: 74 개, Modula-2: 64 개, Fortran 48 개 명확성 : 언어가의미를잘담고있으며모호하지않아야함 직교성 : 언어의기능들이쉽게결합될수있어야함예 ) 함수의리턴값은 ( 일반적으로 ) 이미정의된타입이어야함 Page 14 7
언어의문형 ( 구문 ) (1/2) 일관적이고원시코드의명료성을증진시킬수있어야함 1 Pascal 의경우 if TotalSales > BonusLevel then Bonus := Commission + (BonusPercent * TotalSales); if TotalSales > BonusLevel then begin Bonus := Commission + (BonusPercent * TotalSales); BonusMonths := BonusMonths + 1 end 2 Ada 에서 endif, endwhile 의사용 보다일관적 if TotalSales > BonusLevel then Bonus := Commission + (BonusPercent * TotalSales) endif if TotalSales > BonusLevel then Bonus := Commission + (BonusPercent * TotalSales); BonusMonths := BonusMonths + 1 endif Page 15 언어의문형 ( 구문 ) (2/2) 3 dangling else else 가어디에해당? if conditiona then if concitionb then action1 else action2 if conditiona then if concitionb then action1 endif else action2 endif Page 16 8
제어구조 (Control Structure) (1/2) 기본적인제어구문 : if-then-else 선택구조 (case 구조 ) case 선택자의타입은가능하면제한이없어야 case 문장의레이블은범위를표시할수있어야 선택자가가질수있는모든값을열거하도록강요해서는안된다 case Person of end case; when Newborn Infant => Infant_Seat; when Toddler.. Child => Lap_Belt; when Others => Shoulder_and_Lap_Belt; Page 17 제어구조 (Control Structure) (2/2) 반복구조 반복횟수를나타내는타입이정수로제한되어서는안됨 반복횟수를나타내는변수, 초기값을배정하는수식, 점증값을반복되는구조안에서바꾸는것은바람직하지않음 반복횟수를나타내는변수의정의범위는반복문장안으로제안하는것이바람직함 반복구조의구문예 : for, while, repeat-until, loop, Page 18 9
자료형 (Data Type) Strong typed language 타입검사가매우강한특성을가진다. ( 정수변수 := 실수 는컴파일시에러발생 ) Ada, Modula-2, Pascal Dynamic typed language 수행중간에변수의형이변할수있다. Lisp, APL, PHP 단순자료형 실수, 정수, 논리형, 문자형 포인터형 (Ada, C, Modula-2, Pascal) 사용자정의타입 type Ages=(Infant, Toddler, Preschool, Child, Teenager, Adult); var Person: Ages; Page 19 구조자료형 (1/2) ( 일반적으로 ) 배열 (array) 과구조체 (structure) 를의미함 정적배열 프로그램수행초기 ( 혹은컴파일타임 ) 에배열의크기가결정됨 Fortran, Pascal, Modula-2 동적배열 프로그램수행중간에 ( 메모리할당등을통하여 ) 배열의크기가결정됨 C, Ada type Puzzle is array (integer range <>, integer range <>) of character; subtype SundayPuzzle is Puzzle(1..50, 1..50); Page 20 10
구조자료형 (2/2) 구조 (Structure) 여러개의기본타입으로보다복잡한자료형을생성하는방법 생성된구조체를레코드라부르기도함 type SubscriberType = record Name: array[1..50] of char; IDNumber: 10000..99999; IssuesSent: 0..104; IssuesRemaining: 0..104; SubscriptionType: (New, Renewal, Free, Lifetime) end; Page 21 추상자료형 (Abstract Data Type) 자세한내용이 encapsulation 되어있어, 프로그래머는자료값이나오퍼레이션이어떻게구현되어있는지자세히알필요가없는자료형 ( 일반적으로 ) Object-Oriented 언어에서클래스형태로사용함 class BankAccount { public: BankAccount(int won, double rate); BankAccount(); void update(); double get_balance(); double get_rate(); void output(); private: double balance; interest_rate; } Page 22 11
상수 (Constant) 상수란프로그램이수행되는동안에값이바뀌지않는자료이다. Pascal/Modula-2: 단순자료형 ( 실수, 정수, 문자, 논리형 ) 만가능 Ada: 사용자정의타입도허용 C/C++: #define 사용하여정의 Page 23 함수 / 프로시저 함수 / 프로시저에전달되는매개변수종류 : 입력, 출력, 입출력 매개변수의전달방식 Call by value: 호출한부분의변수값이함수내의지역변수에복사됨 함수내에서변경한내용이리턴후에반영되지않음 Call by reference: 호출한변수의주소값이함수내에전달됨 함수내에서변경하면, 호출한변수의값이직접변경됨 Call by value result: 지역변수에복사되나, 리턴시매개변수에복사됨 지역변수로연산을수행하나, 마지막에매개변수에복사되는형태임 Page 24 12
재사용 (Reuse) (1/2) 특정자료형이나목적에맞도록구현하는것이아니라, 일반적자료형및목적에맞도록구현 재사용측면에서유리 Ada example: 모든자료형을지원하는스택의구현 generic type StackItem is private; package Stack is procedure Push(Element: in StackItem); function Pop return StackItem;.. end Stack; package CharStack is new Stack(character); package IntegerStack is new Stack(integer); Page 25 재사용 (Reuse) (2/2) C++ class example class Employee { private: char* positiontype int... public: promote(... ); } name; position; salary; Employee YoungHee(); // or Employee* YoungHee = Employee(); Page 26 13
구조적프로그래밍 (1/3) 프로그램을계층적으로중첩되게작성하는규율 (formulation) N. Wirth 프로그램을쉽게이해하고오류를줄여, 프로그래밍의생산성을높이려는목적으로프로그램작성에적용하는철학 프로그램의제어흐름을선형화시켜논리구조가명백하게하려는코딩규율 Page 27 구조적프로그래밍 (2/3) Proper Program 단일입구, 단일출구 모든노드는입구에서도달할수있는경로가있어야 모든노드는출구까지도달할수있는경로가있어야 구조적프로그램 세가지제어구조 ( 순차, 선택, 반복 ) 로무조건적 goto에의한복잡한제어흐름을방지 제어구조가하향식 Stepwise refinement를이용한프로그래밍 Structure Theorem proper program 은구조적프로그램으로변환가능 최신프로그래밍언어 구조적언어문형 (if-then, if-then-else, case, while, for, repeat-until 등 ) Page 28 14
구조적프로그래밍 (3/3) Goto 文은구조적인제어흐름을해치지않는범위에서사용해야함 가능하면마음속에서, 머리속에서 goto 를지우는것이바람직함 DO 50 I=1, COUNT. IF (ERROR1) GO TO 60. IF (ERROR2) GO TO 70. 50 CONTINUE 60 {Code for Error1 handling} GO TO 80 70 {Code for Error handling} 80 CONTINUE I = 1 while I <= TableSize and Table(I) <> Target do I = I + 1 NotFound: {code for Target not found} if I > TableSize then Found: {code for Target found} {code for target not found} else { code for Target found} (a) 구조적코딩 Page 29 for I = 1 to TableSize do if Table(I) = Target then goto Found (b) goto 의사용 We are now 프로그래밍언어 4세대프로그래밍언어비주얼프로그래밍언어코딩스타일원시코드의문서화 Page 30 15
4세대언어 (4GL) 1970 년대후반부터나온개념임 누구나쉽게프로그래밍을할수있는언어 를기치로내세움 결국, ( 전문 ) 프로그래머의설자리는없어질것이라며 절차적 / 순서적언어가아니고, 비절차 (non-procedural) 의언어임 즉, how 가나타나지않고, what 을위주로프로그램을작성 실질적으로 실패 했다고보고있음 우리주위에 4GL 이있는가? 4 세대언어종류 : Focus, RAMIS-II, SQL SQL 의경우특수목적 (DBMS 처리 ) 으로널리사용되고있음 Page 31 Focus 프로그램예 TABLE FILE SALES HEADING CENTER SAMPLE SALES REPORT SUM SALES BY REGION ACROSS MONTH BY YEAR ON YEAR SUMMARIZE ON YEAR PAGE-BREAK END 어떤의미인지정확하지는않지만 아마도 SALES 라는파일에서영역, 연도별로, 각달에걸쳐서매출평균을구하는 Page 32 16
SQL 프로그램예 SELECT name, price FROM fruit WHERE color = 빨간색 ; INSERT INTO fruit VALUES ( 멜론, 110, 초록색, 한국 ); UPDATE fruit SET price=120, country= 미국 WHERE name= 멜론 ; DELETE FROM fruit WHERE name= 멜론 ; 어떻게 (how) 찾고, 넣고, 바꾸고, 지우고하는지를기술하는것이아니라, 무엇을찾고, 넣고, 바꾸고, 지우고하는지를기술한다. 내부적으로무엇인가 (query processor, query optimizer) 가엄청고생하겠죠? Page 33 We are now 프로그래밍언어 4세대프로그래밍언어비주얼프로그래밍언어코딩스타일원시코드의문서화 Page 34 17
비주얼프로그래밍언어 C, Pascal, Java 등으로만비주얼프로그래밍을한다면 코드가너무많아질것이다. 버튼하나그리는데 30~40 줄 시간이너무많이걸릴것이다. 비주얼프로그래밍 주어진도구 (tool) 를사용하여화면을설계및구현하고, 각객체에대한이벤트 (event) 에대해서액션 (action) 을프로그래밍한다. 관련된많은 API 라이브러리가제공된다. 얼마나많은 API를아느냐하는것이경험의척도가된다. 종류 : Visual C/C++, Visual Basic, J Builder, Delphi, Page 35 비주얼베이직예제 (1/2) Visual Basic 의경우 1 원하는윈도우를그린다 2버튼, 텍스트박스의속성을 (properties) 를설정 Page 36 18
비주얼베이직예제 (2/2) 3 연계 ( 관련 ) 된이벤트에대해서코드를작성한다. Page 37 We are now 프로그래밍언어 4세대프로그래밍언어비주얼프로그래밍언어코딩스타일원시코드의문서화 Page 38 19
코딩스타일? 옷을입는것에도스타일이있다. 빨간색을좋아하는사람 빨갱이인가? 진바지를좋아하는사람 청바지가잘어울리는여자 프로그램에도스타일이있다? 정수형은사용하지않는사람 모름지기수란모두실수여 ~ 다섯줄만넘으면함수로분리하는사람 모듈화안배웠어 ~ 나눠! 나눠! 나눠! 포인터를엄청많이사용하는사람 난포인터의황제다 어렵지 ~ 나만알면장땡 ~ 어떤스타일이가장좋은가? 원칙은없다. 다만권고 (recommendation) 가있을뿐 Page 39 스타일 1: 명확하게작성하라. (1/3) 부제 : 너무똑똑한체하지말것 내가가장하기어려운 int i, j; float v[n][n];... for(i=1;i <= N;i++) for(j=1;j <= N;j++) v[i-1][j-1] = (i/j)*(j/i); 1 0 0 0 1 0 0 0 1 int i, j; float v[n][n];... for(i=0;i < N;i++) for(j=0;j < N;j++) v[i][j] = 0.0; v[i][i] = 1.0; Page 40 20
스타일 1: 명확하게작성하라. (2/3) 일반적으로짧을수록명확해진다. power[1] = base; power[2] = base*base; power[3] = base*base*base; power[4] = base*base*base*base; power[5] = base*base*base*base*base; power[6] = base*base*base*base*base*base; power[7] = base*base*base*base*base*base*base; power[8] = base*base*base*base*base*base*base*base;... power[1] = base; for(i=2;i < N;i++) power[i] = power[i-1]*base; Page 41 스타일 1: 명확하게작성하라. (3/3) 짧으면항시명확하다? 꼭그렇지만은않다. int IntegerFromHex(char HexDigit) { if(hexdigit < 58) return(hexdigit 48); // 0 = 48 else return(hexdigit 55); // A = 65 } int IntegerFromHex(char HexDigit) { switch(hexdigit) { case 0 : return 0; break; case 1 : return 1; break;... case 9 : return 9; break; case A : return 10; break;... case F : return 15; break; } } Page 42 21
스타일 2: 간결하고직접적으로표현하라. (1/2) 최소값을구하는예제 (x = y, or y = x 인경우, 바른값을찾지못한다. if(x < y) { if(x < z) small = x; if(x > z) small = z; } if(x > y) { if(y < z) small = y; if(y > z) small = z; } small = x; if(y < small) small = y; if(z < small) small = z; Page 43 스타일 2: 간결하고직접적으로표현하라. (2/2) If-then-else 에서는짧은선택구조를먼저기술한다. if(in_user_code) { in_user_code = FALSE; r2 = r; reset_pharlap(); send_sig_segv(); } else revert(); if(!in_user_code) revert(); else { in_user_code = FALSE; r2 = r; reset_pharlap(); send_sig_segv(); } Page 44 22
스타일 3: 임시변수사용을피하라. 임시변수 (temporary variable) 의사용은가급적피한다. t1 = x1 (x2 + x2); t2 = 7 x2; Y = t1 + t1 + t2 + t2; y = 2*(x1 2*x2) + 2*(7 x2); Page 45 스타일 4: 혼돈을초래치않는변수명을사용하라. 혼돈하기쉬운글자들의예 1 과 l a1 al 0 과 O term0 termo 5 와 S TEXT5 TEXTS I 와 l Iist list m과 n의연속사용 mnnm mnmn u와 v의연속사용 vuvu uuvu 변수수정의예제 positionx,positiony xpos, ypos n, nn, nnn n, nsq, ncube nunit, nsqur, ncube Page 46 23
스타일 5: 일관성있는변수명을사용하라. Hungarian notation: 변수이름의처음몇자는변수의타입이나범위를나타내도록한다. 예 ) ptr_to_date_key ( 포인터 ) 일관성있는이름을사용한다. char buffer[500], mssge[80]; void read_instance(void), SaveCurrent(void); void get_line(void), write_line(void); int index1, index2; char buffer[500], message[80]; void read_instance(void), save_current(void); void read_line(void), write_line(void) int i, j; Page 47 스타일 6: 문장그룹이명확하도록 { } 와들여쓰기를사용하라. for(i=0;i < N;i++) { k = a[i]; if(k>100) a[i] = i*3; else if(j ==N)... } for(i=0;i < N;i++) { k = a[i]; if(k > 100) a[i] = i * 3; else if(j == N)... } Page 48 24
스타일 7: 한가지선택이면 if 만, 두가지이면 if-else if(swctl == 1 ) goto conti; else { dvictl += 10; swctl = 1 ; } conti; if(swctl!= 1 ) { dvictl += 10; swctl = 1 ; } Page 49 스타일 8: if 다음의 if 구조, null else 는피한다. if 다음의 if 나 null else 는가독성을크게떨어뜨리며, 오해의소지가있다. if(qty > 10) if(qty > 200) if(qty >= 500) bill_a += 1.00; else bill_a += 0.50; else; else bill_a = 0.0; // A // B // C // C // B // A if(qty >= 500.0) bill_a += 1.00; if(qty < 500 && qty > 200) bill_a += 0.5; if(qty <= 10) bill_a = 0.0; Page 50 25
스타일 9: 문장의반복은최소화한다. 반복되는문장은가급적반복문을사용하여제거한다. get_token(); if(tkn == T_END) return; If(tkn == T_START) start_proc(); while(ntokens < T_LIMIT) { process_token(); add_token(); get_token(); if(tkn == T_END) return; if(tkn == T_START) start_proc(); } for(;;) { get_token(); if(tkn == T_END) return; if(tkn == T_START) start_proc(); if(ntokens >= T_LIMIT) break; process_token(); add_token(); } Page 51 스타일 10: 모듈화하라. 서브루틴을사용하라. 같은역할을하는문장들인경우에는그루핑하여모듈화한다. 반복되는기능에대해서는함수로분리한다. Page 52 26
그밖의원칙들 (1/2) 수식표현 명료하게작성하라 - 효율성을위하여명료함을희생하지않도록한다. 번거로운일은기계가하도록만들라. 괄호를사용하여모호성을제거하라. 언어의좋은기능을이용하고불안한기능의사용은피하라. 제어구조 위에서아래로읽을수있도록프로그래밍하라. 중복구조를최소화하라. 맨처음작성한것으로끝나지말고, 계속해서리뷰하라. 프로그램 각모듈은분명한한가지역할만수행하도록하라. 잘못작성된코드는짜맞추려하지하지말고다시작성하라. 처음부터다시 큰프로그램은작은단위로나누어따로작성하고따로검사하라. Page 53 그밖의원칙들 (2/2) 입출력 자료가한계값을벗어나지않는지항상검사하라. 입력형식은사용자가쉽게준비할수있게하고출력형식은그모양이스스로드러나게구성하라. 입출력은따로모아서독립된서브루틴으로만들라. 기타 발견된오류만고치지말고, 전체적으로보고수정가능한모든오류를고친다. 하나차이에의한오류 (off-by-one) 를주의할것 프로그램을방어적으로작성하라. 빠른프로그램보다먼저바른프로그램을작성하라. 빠른프로그램보다먼저명료한프로그램을작성하라. 간결함을유지하면서빠른프로그램을만들라. 주석과코드가일치하는지확인하라. 주석을달때코드를되풀이해서는않도록한다. 잘못된코드에는주석을달지말것 - 다시작성한다. 과다하게주석을달지않는다. 덕지덕지고쳐서사용하려고애쓰지말것 - 과감히버리고새로작성한다. Page 54 27
프로그램에관한몇가지격언 (1/2) The sooner you start to code, the longer the program will take. ( 코딩을일찍시작하면할수록, 프로그래밍에시간이많이걸린다.) If you can't write it down in English, you can't code it. ( 글로써표현할수없다면, 코딩도할수없다.) If the code and the comments disagree, then both are probably wrong. ( 코드와주석이맞지않으면, 둘다잘못되었을가능성이높다.) If you have too many special cases, you are doing it wrong. ( 너무많은예외케이스가있다면, 뭔가잘못하고있는것이다.) Get your data structures correct first, and the rest of the program will write itself. ( 먼저자료구조를잘잡는다면, 프로그램은저절로써지게될것이다.) Page 55 프로그램에관한몇가지격언 (2/2) Don't debug standing up. It cuts your patience in half. ( 서서디버깅하지말아라. 참을성을가지란이야기 ) Each new user of a new system uncovers a new class bugs. ( 새로운시스템에대한새로운사용자는항시새로운종류의버그를발견한다.) Whenever possible, steal code. ( 가능하다면코드를훔쳐라. 즉, 코드를재사용하라.) Always do the hard part first. If the hard part is impossible, why waste time on the easy part? ( 어려운부분을먼저하라. 어려운부분이불가능하다면, 쉬운부분을해서뭣하나?) Page 56 28
We are now 프로그래밍언어 4세대프로그래밍언어비주얼프로그래밍언어코딩스타일원시코드의문서화 Page 57 원시코드의문서화 소스코드의문서화는즉, 주석쓰는것을의미한다. 주석의종류 프로그램헤더 : 전체프로그램의기능을설명하는주석 모듈헤더 ( 함수헤더 ): 해당모듈의기능을설명하는주석 각줄에삽입된주석 : 해당줄을설명하는주석 Page 58 29
프로그램헤더주석 프로그램의제목제작자작성일과버전번호구조와설계공유변수사용되는파일외부참조파일 Page 59 프로그램헤더주석의예제 (1/2) /***************************************************************************** **** - EXAM SCORE SUMMARY PROGRAM - WRITTEN BY : HONG, KIL DONG - RELEASE DATE : April 1, 1994 - - PURPOSE : This program produces a variety of statistics on a - group of student's exam scores. For each score that is entered, - the score and a row of stars representing the magnitute of the - score is printed out. In addition, the number of scores, the - average score, the highest score and the lowest score are - printed out. - - DESIGN : The program is composed of the following modules: - Main module - The Main, controlling module - Validate Input - Gets and validates the user's input - Process Valid Score - Prints score and row of stars for one score - Update Statistics - Updates global statistics - Print Summary Report - Prints summary statistics Page 60 30
프로그램헤더주석의예제 (2/2) - MAJOR VARIABLES : - SumOfScore (subrange of integer, 0..2000) - - The sum of all score entered - NumOfStudents (subrange of integer, 0..100) - - The total number of score entered - LargestScore (subrange of integer, 0..20) - - The largest score in the set of scores - SmallestScore (subrange of integer, 0..20) - - The smallest score - FILES USED: - Input - contains integer scores, one to a line - Output - contains a one-line histogram for each score - read, followed on the next line by the number of - students and their average score, then on the next line - by the top score, and concluding on the next line with - the lowest score. - EXTERNAL REFERENCES: None ***********************************************************************/ Page 61 31