680 likes | 989 Views
소프트웨어 공학 (Software Engineering ) 구현 (Implementation) 문양세 강원대학교 IT 대학 컴퓨터과학전공. In this chapter … (1/2). 구현 (Implementation). 구현 , 즉 코딩 (coding) 은 설계된 내용을 원시 코드 (source code) 로 변환시키는 작업 코딩의 원칙 설계 내용을 철저히 반영시킨다 . ( 어렵다고 빼고 진행하면 나중에 후회 …) 원시코드는 간단 명료하도록 한다 디버깅이 쉽도록 한다 .
E N D
소프트웨어 공학 (Software Engineering) 구현 (Implementation) 문양세 강원대학교 IT대학 컴퓨터과학전공
In this chapter … (1/2) 구현 (Implementation) • 구현, 즉 코딩(coding)은 설계된 내용을 원시 코드(source code)로 변환시키는 작업 • 코딩의 원칙 • 설계 내용을 철저히 반영시킨다. ( 어렵다고 빼고 진행하면 나중에 후회…) • 원시코드는 간단 명료하도록 한다 • 디버깅이 쉽도록 한다. • 시험이 용이해야 한다. • 수정이 간편해야 한다. 설계 사양 (design spec.) 목적코드 (object code) 코딩 컴파일 디버깅 원시코드(source code)
In this chapter … (2/2) 구현 (Implementation) • We will cover … • 프로그래밍 언어 • 4세대 프로그래밍 언어 • 비주얼 프로그래밍 언어 • 코딩 스타일 • 원시 코드의 문서화
프로그래밍 언어의 역할 구현 (Implementation) • 컴퓨터를 제어(control) • 소프트웨어의 구현 및 저장 • 프로그래머 사이의 의사소통 • 논리흐름의 표현 • 문서화(documentation) • 언어의 기능 vs. 사용자들의 반응 • 소프트웨어의 구조와 알고리즘적인 특성을 크게 좌우 적합한 프로그래밍 언어의 선택이 중요한 요소임
프로그래밍 언어의 발전 (1/5) 구현 (Implementation) • 제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, …
Intel Chip(Linux) 프로그래밍 언어의 발전 (2/5) 구현 (Implementation) Assembly language 예제
Intel Chip(Linux) Sparc Chip(Solaris) 프로그래밍 언어의 발전 (2/5) 구현 (Implementation) Assembly language 예제
프로그래밍 언어의 발전 (3/5) 구현 (Implementation) Fortran 프로그램 예제
프로그래밍 언어의 발전 (4/5) 구현 (Implementation) Pascal 프로그램 예제
프로그래밍 언어의 발전 (5/5) 구현 (Implementation) C 프로그램 예제
프로그래밍 언어 선택 시 고려 사항 구현 (Implementation) 프로젝트의 상황 프로그래밍 언어 자체의 특성
프로젝트의 상황 (1/2) 구현 (Implementation) • 사용자의 요구 • 유지보수를 사용자가 직접 담당하는 경우 특정 언어를 요구할 수 있음 • 프로그래머의 지식 • (가장) 숙달된 언어 • 기능의 제한성이 파악된 언어 • 완성되었거나 현재 진행되는 프로젝트에 사용되고 있는 언어 • 익숙한 언어 • 두 개 이상의 프로젝트가 진행 가능한 하나의 언어로 통일하는 것이 유리
프로젝트의 상황 (2/2) 구현 (Implementation) • 컴파일러의 가용성과 품질 • 하드웨어 • 적당한 가격 • 목적 코드의 효율성, 품질, 오류 메시지의 분량 • 소프트웨어 개발 도구의 지원 • 에디터(editor) • 디버거(debugger) • 링커(linker) • 추적기(tracer) • 호환성
프로그래밍 언어 자체의 특성 구현 (Implementation) 표현력과 적합성 단순성, 명확성, 직교성 언어의 문형 제어 구조 자료형 상수 프로시저와 함수 프로시저 및 자료 추상화 재사용
표현력과 적합성 구현 (Implementation) • 원하는 작업을 얼마나 효율적으로 충분히 표현할 수 있는가? • 예제 • COBOL : 사무응용 분야 • C 언어 : 시스템 프로그래밍, 임베디드 응용 • Pascal : 프로그래밍 교육(풍부한 자료구조) • Modula-2 : 시스템 프로그래밍에 적합 • Ada : 실시간 처리 응용 • Lisp, Prolog : 인공지능 • ASP, PHP, JSP : 웹 프로그래밍 • Java : 인터넷 프로그래밍 • 작업 자체를 실현하기에 가장 적합한 언어를 선택하는 것이 바람직함
단순성, 명확성, 직교성 구현 (Implementation) • 단순성: 예약어(reserved word)의 개수가 적어야 함 적을수록 쉽게 이해하고 익숙해 질 수 있음 • COBOL-74: 300여개, Pascal: 74개, Modula-2: 64개, Fortran 48개 • 명확성: 언어가 의미를 잘 담고 있으며 모호하지 않아야 함 • 직교성: 언어의 기능들이 쉽게 결합될 수 있어야 함예1) 함수의 리턴 값은 (일반적으로) 이미 정의된 타입이어야 함예2) 동일한 용어가 여러 의미/기능으로 사용되어서는 안됨
언어의 문형(구문) (1/2) 구현 (Implementation) 일관적이고 원시 코드의 명료성을 증진시킬 수 있어야 함 ① Pascal의 경우 if TotalSales > BonusLevel then Bonus := Commission + (BonusPercent * TotalSales); if TotalSales > BonusLevel then begin Bonus := Commission + (BonusPercent * TotalSales); BonusMonths := BonusMonths + 1 end ② Ada에서 endif, endwhile의 사용 보다 일관적 if TotalSales > BonusLevel then Bonus := Commission + (BonusPercent * TotalSales) endif if TotalSales > BonusLevel then Bonus := Commission + (BonusPercent * TotalSales); BonusMonths := BonusMonths + 1 endif
언어의 문형(구문) (2/2) 구현 (Implementation) ③ dangling else else가 어디에 해당? if conditionA then if concitionB then action1 else action2 if conditionA then if concitionB then action1 endif else action2 endif
제어 구조 (Control Structure) (1/2) 구현 (Implementation) • 기본적인 제어 구문: if-then-else • 선택 구조(case 구조) • case 선택자의 타입은 가능하면 제한이 없어야 • case 문장의 레이블은 범위를 표시할 수 있어야 • 선택자가 가질 수 있는 모든 값을 열거하도록 강요해서는 안 된다 case Person of when Newborn | Infant => Infant_Seat; when Toddler .. Child => Lap_Belt; when Others => Shoulder_and_Lap_Belt; end case;
제어 구조 (Control Structure) (2/2) 구현 (Implementation) • 반복 구조 • 반복 횟수를 나타내는 타입이 정수로 제한되어서는 안됨 • 반복 횟수를 나타내는 변수, 초기값을 배정하는 수식, 점증 값을 반복되는 구조 안에서 바꾸는 것은 바람직하지 않음 • 반복 횟수를 나타내는 변수의 정의 범위는 반복 문장 안으로 제한하는 것이 바람직함 • 반복 구조의 구문 예: for, while, repeat-until, loop, …
자료형 (Data Type) 구현 (Implementation) • 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;
구조 자료형 (1/2) 구현 (Implementation) • (일반적으로) 배열(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);
구조 자료형 (2/2) 구현 (Implementation) • 구조(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;
추상 자료형 (Abstract Data Type) 구현 (Implementation) 자세한 내용이 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; }
상수 (Constant) 구현 (Implementation) • 상수란 프로그램이 수행되는 동안에 값이 바뀌지 않는 자료이다. • Pascal/Modula-2: 단순 자료형(실수, 정수, 문자, 논리형)만 가능 • Ada: 사용자 정의 타입도 허용 • C/C++: #define 사용하여 정의
함수/프로시저 (1/3) 구현 (Implementation) • 함수/프로시저에 전달되는 매개변수 종류: 입력, 출력, 입출력 • 매개변수의 전달 방식 • Call by value: 호출한 부분의 변수 값이 함수 내의 지역 변수에 복사됨 함수 내에서 변경한 내용이 리턴 후에 반영되지 않음 • Call by reference: 호출한 변수의 주소 값이 함수 내에 전달됨 함수 내에서 변경하면, 호출한 변수의 값이 직접 변경됨 • Call by value result: 지역 변수에 복사되나, 리턴 시 매개 변수에 복사됨 지역 변수로 연산을 수행하나, 마지막에 매개 변수에 복사되는 형태임
함수/프로시저 (2/3) 구현 (Implementation) An example of “call by value”
함수/프로시저 (3/3) 구현 (Implementation) An example of “call by reference”
재사용 (Reuse) 구현 (Implementation) 특정 자료형이나 목적에 맞도록 구현하는 것이 아니라, 일반적 자료형 및 목적에 맞도록 구현 재사용 측면에서 유리 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);
구조적 프로그래밍 (1/3) 구현 (Implementation) 프로그램을 계층적으로 중첩되게 작성하는 규율 (formulation) –- N. Wirth 프로그램을 쉽게 이해하고 오류를 줄여, 프로그래밍의 생산성을 높이려는 목적으로 프로그램 작성에 적용하는 철학 프로그램의 제어 흐름을 선형화시켜 논리 구조가 명백하게 하려는 코딩 규율
구조적 프로그래밍 (2/3) 구현 (Implementation) • Proper Program(의 정의) • 단일입구, 단일 출구 • 모든 노드는 입구에서 도달할 수 있는 경로가 있어야 • 모든 노드는 출구까지 도달할 수 있는 경로가 있어야 • 구조적 프로그램(의 정의) • 세 가지 제어구조(순차, 선택, 반복)로 무조건적 goto에 의한 복잡한 제어흐름을 방지 • 제어구조가 하향식 • Stepwise refinement를 이용한 프로그래밍 • Structure Theorem • Proper program은 구조적 프로그램으로 변환 가능 • 최신 프로그래밍 언어 • 구조적 언어 문형(if-then, if-then-else, case, while, for, repeat-until 등)
구조적 프로그래밍 (3/3) 구현 (Implementation) 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 for I = 1 to TableSize do while I <= TableSize and if Table(I) = Target then goto Found 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) 구조적 코딩 (b) goto의 사용
We are now … 구현 (Implementation) 프로그래밍 언어 4세대 프로그래밍 언어 비주얼 프로그래밍 언어 코딩 스타일 원시 코드의 문서화
4세대 언어(4GL) 구현 (Implementation) • 1970년대 후반부터 나온 개념임 • “누구나 쉽게 프로그래밍을 할 수 있는 언어”를 기치로 내세움 결국, (전문) 프로그래머의 설 자리는 없어질 것이라며… • 절차적/순서적 언어가 아니고, 비절차(non-procedural)의 언어임 즉, how가 나타나지 않고, what을 위주로 프로그램을 작성 • 실질적으로 “실패”했다고 보고 있음… 우리 주위에 4GL이 있는가? • 4세대 언어 종류: Focus, RAMIS-II, SQL SQL의 경우 특수 목적(DBMS 처리)으로 널리 사용되고 있음
Focus 프로그램 예 구현 (Implementation) 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라는 파일에서 영역, 연도별로, 각 달에 걸쳐서 매출 평균을 구하는 …
SQL 프로그램 예 구현 (Implementation) 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) 찾고, 넣고, 바꾸고, 지우고 하는지를 기술하는 것이 아니라,무엇(what)을 찾고, 넣고, 바꾸고, 지우고 하는지를 기술한다. 결국, “how”보다는 “what”에 중점을 둔 보다 지능적인 언어라 할 수 있음 내부적으로 무엇인가(query processor, query optimizer)가 엄청 고생하겠죠?
We are now … 구현 (Implementation) 프로그래밍 언어 4세대 프로그래밍 언어 비주얼 프로그래밍 언어 코딩 스타일 원시 코드의 문서화
비주얼 프로그래밍 언어 구현 (Implementation) • C, Pascal, Java 등으로만 비주얼 프로그래밍을 한다면… 코드가 너무 많아질 것이다. 버튼 하나 그리는데 30~40줄… 시간이 너무 많이 걸릴 것이다. • 비주얼 프로그래밍 • 주어진 도구(tool)를 사용하여 화면을 설계 및 구현하고, • 각 객체에 대한 이벤트(event)에 대해서 액션(action)을 프로그래밍한다. • 관련된 많은 API 라이브러리가 제공된다. 얼마나 많은 API를 아느냐 하는 경험의 척도가 기술력이 된다. • 종류: Visual C/C++, Visual Basic, J Builder, Delphi, …
비주얼 베이직 예제 (1/2) 구현 (Implementation) • Visual Basic의 경우 ① 원하는 윈도우를 그린다 ② 버튼, 텍스트 박스의 속성을(properties)를 설정
비주얼 베이직 예제 (2/2) 구현 (Implementation) ③ 연계(관련)된 이벤트에 대해서 코드를 작성한다.
Visual Studio 구현 (Implementation)
Java – Eclipse (Android 개발) 구현 (Implementation)
We are now … 구현 (Implementation) 프로그래밍 언어 4세대 프로그래밍 언어 비주얼 프로그래밍 언어 코딩 스타일 원시 코드의 문서화
코딩 스타일? 구현 (Implementation) • 옷을 입는 것에도 스타일이 있다. • 빨간색을 좋아하는 사람 북으로 보내셔~ • 진바지를 좋아하는 사람 • 청바지가 잘 어울리는 여자 … • 프로그램에도 스타일이 있다? • 정수형은 사용하지 않는 사람 모름지기 수란 모두 실수여~ • 다섯 줄만 넘으면 함수로 분리하는 사람 모듈화 안 배웠어~ 나눠! 나눠! 나눠! • 포인터를 엄청 많이 사용하는 사람 난 포인터의 황제다… 어렵지~ 나만 알면 장땡~ 어떤 스타일이 가장 좋은가?원칙은 없다. 다만 권고(recommendation)가 있을 뿐…
inti, j; float v[N][N]; .... for(i=0;i < N;i++) for(j=0;j < N;j++) if(i == j) v[i][j] = 1; else v[i][j] = 0; 스타일 1: 명확하게 작성하라. (1/3) 구현 (Implementation) 부제: 너무 똑똑한 체 하지 말 것 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: 명확하게 작성하라. (2/3) 구현 (Implementation) 일반적으로 짧을수록 명확해 진다. 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;
스타일 1: 명확하게 작성하라. (3/3) 구현 (Implementation) 짧으면 항시 명확하다? 꼭 그렇지만은 않다. 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; } }
스타일 2: 간결하고 직접적으로 표현하라. (1/2) 구현 (Implementation) 최소값을 구하는 예제 (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;
스타일 2: 간결하고 직접적으로 표현하라. (2/2) 구현 (Implementation) 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(); }
스타일 3: 임시 변수 사용을 피하라. 구현 (Implementation) 임시 변수(temporary variable)의 사용은 가급적 피한다. t1 = x1 –(x2 + x2); t2 = 7 – x2; Y = t1 + t1 + t2 + t2; y = 2*(x1 – 2*x2) + 2*(7 – x2);