1 / 68

소프트웨어 공학 (Software Engineering ) 구현 (Implementation) 문양세 강원대학교 IT 대학 컴퓨터과학전공

소프트웨어 공학 (Software Engineering ) 구현 (Implementation) 문양세 강원대학교 IT 대학 컴퓨터과학전공. In this chapter … (1/2). 구현 (Implementation). 구현 , 즉 코딩 (coding) 은  설계된 내용을 원시 코드 (source code) 로 변환시키는 작업 코딩의 원칙 설계 내용을 철저히 반영시킨다 . ( 어렵다고 빼고 진행하면 나중에 후회 …) 원시코드는 간단 명료하도록 한다 디버깅이 쉽도록 한다 .

Download Presentation

소프트웨어 공학 (Software Engineering ) 구현 (Implementation) 문양세 강원대학교 IT 대학 컴퓨터과학전공

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 소프트웨어 공학 (Software Engineering) 구현 (Implementation) 문양세 강원대학교 IT대학 컴퓨터과학전공

  2. In this chapter … (1/2) 구현 (Implementation) • 구현, 즉 코딩(coding)은 설계된 내용을 원시 코드(source code)로 변환시키는 작업 • 코딩의 원칙 • 설계 내용을 철저히 반영시킨다. ( 어렵다고 빼고 진행하면 나중에 후회…) • 원시코드는 간단 명료하도록 한다 • 디버깅이 쉽도록 한다. • 시험이 용이해야 한다. • 수정이 간편해야 한다. 설계 사양 (design spec.) 목적코드 (object code) 코딩 컴파일 디버깅 원시코드(source code)

  3. In this chapter … (2/2) 구현 (Implementation) • We will cover … • 프로그래밍 언어 • 4세대 프로그래밍 언어 • 비주얼 프로그래밍 언어 • 코딩 스타일 • 원시 코드의 문서화

  4. 프로그래밍 언어의 역할 구현 (Implementation) • 컴퓨터를 제어(control) • 소프트웨어의 구현 및 저장 • 프로그래머 사이의 의사소통 • 논리흐름의 표현 • 문서화(documentation) • 언어의 기능 vs. 사용자들의 반응 • 소프트웨어의 구조와 알고리즘적인 특성을 크게 좌우 적합한 프로그래밍 언어의 선택이 중요한 요소임

  5. 프로그래밍 언어의 발전 (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, …

  6. Intel Chip(Linux) 프로그래밍 언어의 발전 (2/5) 구현 (Implementation) Assembly language 예제

  7. Intel Chip(Linux) Sparc Chip(Solaris) 프로그래밍 언어의 발전 (2/5) 구현 (Implementation) Assembly language 예제

  8. 프로그래밍 언어의 발전 (3/5) 구현 (Implementation) Fortran 프로그램 예제

  9. 프로그래밍 언어의 발전 (4/5) 구현 (Implementation) Pascal 프로그램 예제

  10. 프로그래밍 언어의 발전 (5/5) 구현 (Implementation) C 프로그램 예제

  11. 프로그래밍 언어 선택 시 고려 사항 구현 (Implementation) 프로젝트의 상황 프로그래밍 언어 자체의 특성

  12. 프로젝트의 상황 (1/2) 구현 (Implementation) • 사용자의 요구 • 유지보수를 사용자가 직접 담당하는 경우 특정 언어를 요구할 수 있음 • 프로그래머의 지식 • (가장) 숙달된 언어 • 기능의 제한성이 파악된 언어 • 완성되었거나 현재 진행되는 프로젝트에 사용되고 있는 언어 • 익숙한 언어 • 두 개 이상의 프로젝트가 진행 가능한 하나의 언어로 통일하는 것이 유리

  13. 프로젝트의 상황 (2/2) 구현 (Implementation) • 컴파일러의 가용성과 품질 • 하드웨어 • 적당한 가격 • 목적 코드의 효율성, 품질, 오류 메시지의 분량 • 소프트웨어 개발 도구의 지원 • 에디터(editor) • 디버거(debugger) • 링커(linker) • 추적기(tracer) • 호환성

  14. 프로그래밍 언어 자체의 특성 구현 (Implementation) 표현력과 적합성 단순성, 명확성, 직교성 언어의 문형 제어 구조 자료형 상수 프로시저와 함수 프로시저 및 자료 추상화 재사용

  15. 표현력과 적합성 구현 (Implementation) • 원하는 작업을 얼마나 효율적으로 충분히 표현할 수 있는가? • 예제 • COBOL : 사무응용 분야 • C 언어 : 시스템 프로그래밍, 임베디드 응용 • Pascal : 프로그래밍 교육(풍부한 자료구조) • Modula-2 : 시스템 프로그래밍에 적합 • Ada : 실시간 처리 응용 • Lisp, Prolog : 인공지능 • ASP, PHP, JSP : 웹 프로그래밍 • Java : 인터넷 프로그래밍 • 작업 자체를 실현하기에 가장 적합한 언어를 선택하는 것이 바람직함

  16. 단순성, 명확성, 직교성 구현 (Implementation) • 단순성: 예약어(reserved word)의 개수가 적어야 함 적을수록 쉽게 이해하고 익숙해 질 수 있음 • COBOL-74: 300여개, Pascal: 74개, Modula-2: 64개, Fortran 48개 • 명확성: 언어가 의미를 잘 담고 있으며 모호하지 않아야 함 • 직교성: 언어의 기능들이 쉽게 결합될 수 있어야 함예1) 함수의 리턴 값은 (일반적으로) 이미 정의된 타입이어야 함예2) 동일한 용어가 여러 의미/기능으로 사용되어서는 안됨

  17. 언어의 문형(구문) (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

  18. 언어의 문형(구문) (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

  19. 제어 구조 (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;

  20. 제어 구조 (Control Structure) (2/2) 구현 (Implementation) • 반복 구조 • 반복 횟수를 나타내는 타입이 정수로 제한되어서는 안됨 • 반복 횟수를 나타내는 변수, 초기값을 배정하는 수식, 점증 값을 반복되는 구조 안에서 바꾸는 것은 바람직하지 않음 • 반복 횟수를 나타내는 변수의 정의 범위는 반복 문장 안으로 제한하는 것이 바람직함 • 반복 구조의 구문 예: for, while, repeat-until, loop, …

  21. 자료형 (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;

  22. 구조 자료형 (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);

  23. 구조 자료형 (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;

  24. 추상 자료형 (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; }

  25. 상수 (Constant) 구현 (Implementation) • 상수란 프로그램이 수행되는 동안에 값이 바뀌지 않는 자료이다. • Pascal/Modula-2: 단순 자료형(실수, 정수, 문자, 논리형)만 가능 • Ada: 사용자 정의 타입도 허용 • C/C++: #define 사용하여 정의

  26. 함수/프로시저 (1/3) 구현 (Implementation) • 함수/프로시저에 전달되는 매개변수 종류: 입력, 출력, 입출력 • 매개변수의 전달 방식 • Call by value: 호출한 부분의 변수 값이 함수 내의 지역 변수에 복사됨 함수 내에서 변경한 내용이 리턴 후에 반영되지 않음 • Call by reference: 호출한 변수의 주소 값이 함수 내에 전달됨 함수 내에서 변경하면, 호출한 변수의 값이 직접 변경됨 • Call by value result: 지역 변수에 복사되나, 리턴 시 매개 변수에 복사됨 지역 변수로 연산을 수행하나, 마지막에 매개 변수에 복사되는 형태임

  27. 함수/프로시저 (2/3) 구현 (Implementation) An example of “call by value”

  28. 함수/프로시저 (3/3) 구현 (Implementation) An example of “call by reference”

  29. 재사용 (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);

  30. 구조적 프로그래밍 (1/3) 구현 (Implementation) 프로그램을 계층적으로 중첩되게 작성하는 규율 (formulation) –- N. Wirth 프로그램을 쉽게 이해하고 오류를 줄여, 프로그래밍의 생산성을 높이려는 목적으로 프로그램 작성에 적용하는 철학 프로그램의 제어 흐름을 선형화시켜 논리 구조가 명백하게 하려는 코딩 규율

  31. 구조적 프로그래밍 (2/3) 구현 (Implementation) • Proper Program(의 정의) • 단일입구, 단일 출구 • 모든 노드는 입구에서 도달할 수 있는 경로가 있어야 • 모든 노드는 출구까지 도달할 수 있는 경로가 있어야 • 구조적 프로그램(의 정의) • 세 가지 제어구조(순차, 선택, 반복)로 무조건적 goto에 의한 복잡한 제어흐름을 방지 • 제어구조가 하향식 • Stepwise refinement를 이용한 프로그래밍 • Structure Theorem • Proper program은 구조적 프로그램으로 변환 가능 • 최신 프로그래밍 언어 • 구조적 언어 문형(if-then, if-then-else, case, while, for, repeat-until 등)

  32. 구조적 프로그래밍 (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의 사용

  33. We are now … 구현 (Implementation) 프로그래밍 언어 4세대 프로그래밍 언어 비주얼 프로그래밍 언어 코딩 스타일 원시 코드의 문서화

  34. 4세대 언어(4GL) 구현 (Implementation) • 1970년대 후반부터 나온 개념임 • “누구나 쉽게 프로그래밍을 할 수 있는 언어”를 기치로 내세움 결국, (전문) 프로그래머의 설 자리는 없어질 것이라며… • 절차적/순서적 언어가 아니고, 비절차(non-procedural)의 언어임 즉, how가 나타나지 않고, what을 위주로 프로그램을 작성 • 실질적으로 “실패”했다고 보고 있음… 우리 주위에 4GL이 있는가? • 4세대 언어 종류: Focus, RAMIS-II, SQL SQL의 경우 특수 목적(DBMS 처리)으로 널리 사용되고 있음

  35. 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라는 파일에서 영역, 연도별로, 각 달에 걸쳐서 매출 평균을 구하는 …

  36. 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)가 엄청 고생하겠죠?

  37. We are now … 구현 (Implementation) 프로그래밍 언어 4세대 프로그래밍 언어 비주얼 프로그래밍 언어 코딩 스타일 원시 코드의 문서화

  38. 비주얼 프로그래밍 언어 구현 (Implementation) • C, Pascal, Java 등으로만 비주얼 프로그래밍을 한다면… 코드가 너무 많아질 것이다. 버튼 하나 그리는데 30~40줄… 시간이 너무 많이 걸릴 것이다. • 비주얼 프로그래밍 • 주어진 도구(tool)를 사용하여 화면을 설계 및 구현하고, • 각 객체에 대한 이벤트(event)에 대해서 액션(action)을 프로그래밍한다. • 관련된 많은 API 라이브러리가 제공된다. 얼마나 많은 API를 아느냐 하는 경험의 척도가 기술력이 된다. • 종류: Visual C/C++, Visual Basic, J Builder, Delphi, …

  39. 비주얼 베이직 예제 (1/2) 구현 (Implementation) • Visual Basic의 경우 ① 원하는 윈도우를 그린다 ② 버튼, 텍스트 박스의 속성을(properties)를 설정

  40. 비주얼 베이직 예제 (2/2) 구현 (Implementation) ③ 연계(관련)된 이벤트에 대해서 코드를 작성한다.

  41. Visual Studio 구현 (Implementation)

  42. Java – Eclipse (Android 개발) 구현 (Implementation)

  43. We are now … 구현 (Implementation) 프로그래밍 언어 4세대 프로그래밍 언어 비주얼 프로그래밍 언어 코딩 스타일 원시 코드의 문서화

  44. 코딩 스타일? 구현 (Implementation) • 옷을 입는 것에도 스타일이 있다. • 빨간색을 좋아하는 사람  북으로 보내셔~ • 진바지를 좋아하는 사람 • 청바지가 잘 어울리는 여자 … • 프로그램에도 스타일이 있다? • 정수형은 사용하지 않는 사람  모름지기 수란 모두 실수여~ • 다섯 줄만 넘으면 함수로 분리하는 사람  모듈화 안 배웠어~ 나눠! 나눠! 나눠! • 포인터를 엄청 많이 사용하는 사람  난 포인터의 황제다… 어렵지~ 나만 알면 장땡~  어떤 스타일이 가장 좋은가?원칙은 없다. 다만 권고(recommendation)가 있을 뿐…

  45. 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);

  46. 스타일 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;

  47. 스타일 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; } }

  48. 스타일 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;

  49. 스타일 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(); }

  50. 스타일 3: 임시 변수 사용을 피하라. 구현 (Implementation) 임시 변수(temporary variable)의 사용은 가급적 피한다. t1 = x1 –(x2 + x2); t2 = 7 – x2; Y = t1 + t1 + t2 + t2; y = 2*(x1 – 2*x2) + 2*(7 – x2);

More Related