제 1 장기본개념
시스템생명주기 (System Life Cycle) 1. 요구사항 (requirement) 프로젝트들의목적을정의한명세들의집합 입력과출력에관한정보를기술 2. 분석 (analysis) 문제들을다룰수있는작은단위들로나눔 상향식 (bottom-up)/ 하향식 (top-down) 접근방법 3. 설계 (design) 추상데이타타입 (abstract data type) 생성 알고리즘명세와설계기법고려 2
시스템생명주기 (System Life Cycle) 4. 정제와코딩 (refinement and coding) 데이타객체에대한표현선택 수행되는연산에대한알고리즘작성 5. 검증 (verification) 정확성증명 (correctness proof) 수학적기법들을이용해서증명 테스트 (testing) 프로그램의정확한수행검증 ex. 모든 if 문과 switch 문의 case 를확인하고있는가? 프로그램의성능검사 오류제거 (error removal) 독립적단위로테스트후전체시스템으로통합 3
소프트웨어개발주기 ( 참고 ) 1. 요구추출 (Requirements Elicitation) 사용자의요구사항을추출하는단계 초기명세의정확성이프로젝트의성패를좌우 2. 요구분석 (Requirements Analysis) 추출된요구의정확성, 완전성등을확인하여사용자의요구를확정하는단계 산출물 : 요구분석명세서 구조적방법론 vs. 객체지향방법론 3. 설계 (Design) 사용자의요구를소프트웨어시스템의구조로변환하는단계 소프트웨어구조설계, 사용자인터페이스설계, 자료설계, 알고리즘설계 4. 구현 (Implementation) 설계문서를프로그래밍언어를사용하여 source code로변환 구현 4단계 1단계 : 문제의이해, 2단계 : 알고리즘설계, 3단계 : 코딩 (coding), 4단계 : 오류제거 (debugging) 5. 검증 (Verification) 소프트웨어시스템의정확성을검증하는단계 검증방법 : 정확성증명 (correctness proof) 또는테스팅 (testing) 4
객체지향설계 구조적프로그래밍설계와의비교 유사점 분할-정복기법 : 복잡한문제를여러개의단순한부분작업으로나누어각각을개별적으로해결 차이점 : 문제분할방법 구조적프로그래밍은알고리즘적분해 객체지향프로그래밍은객체지향적분해 5
알고리즘적분해와객체지향적분해 알고리즘적분해 ( 함수적분해 ) 고전적프로그래밍기법 소프트웨어를기능적모듈로분해 Pascal의프로시저, FORTRAN의서브프로그램, C의함수 객체지향적분해 응용분야의개체를모델링하는객체의집합 소프트웨어의재사용성조장 변화에유연한소프트웨어시스템 직관적 6
객체지향프로그래밍의기본정의와개념 객체 (object) 계산을수행하고상태를갖는개체 데이타 + 절차적요소 객체지향프로그래밍 (object-oriented programming) 객체는기본적인구성단위 (building block) 각객체는어떤타입 ( 클래스 ) 의인스턴스 (instance) 클래스는상속 (inheritance) 관계로연관됨 객체지향언어 (object-oriented language) 객체지원 모든객체는클래스에속함 상속지원 객체기반언어 (object-based language) 객체와클래스는지원하되상속은지원하지않는언어 (ex. JavaScript) 7
프로그래밍언어의발전과 C++ 의역사 고급프로그래밍언어 1 세대언어 - FORTRAN 수식계산가능 2 세대언어 - Pascal, C 알고리즘을효과적으로표현 3 세대언어 - Modula 추상데이타타입개념도입 4 세대언어 ( 객체지향언어 ) - Smalltalk, Objective-C, C++ 상속기능지원 C 의장점 효율성 (efficient) : 하드웨어를직접제어할수있는기능 유연성 (flexible) : 대부분의응용분야에사용가능 가용성 (available) : 모든컴퓨터에 C 컴파일러존재 8
데이타추상화와캡슐화 데이타캡슐화 (data encapsulation) 정보은닉 (information hiding) 외부로부터데이타객체의자세한구현을은닉 데이타추상화 (data abstraction) 객체의명세 (specification) 와구현 (implementation) 을분리 무엇 (what) 과어떻게 (how) 를명확하게구분 9
데이타타입 데이타타입 (data type) 객체 (object) 들과이객체들에대한연산 (operation) 의집합 C++ 의데이타타입 기본데이타타입 char, int, float, double 등 타입수식어 : short, long, signed, unsigned 파생데이타타입 포인터 (pointer) 타입, 참조 (reference) 타입 데이타를묶어주는구조 배열 (array), 구조 (struct), 클래스 (class) 사용자정의데이타타입 추상데이타타입 (abstract data type; ADT) 객체와연산에대한명세가객체의표현과연산의구현으로부터분리된방식으로구성된데이타타입 10
ADT NaturalNumber is 객체 : 순서가있는정수의일부분으로 0 부터해당컴퓨터의최대정수 (MAXINT) 까지의값 함수 : 모든 x, y NaturalNumber, TRUE, FALSE Boolean +, -, <, ==, = 는일반정수연산자 Zero():NaturalNumber ::= 0 IsZero(x):Boolean ::= if (x == 0) IsZero = TRUE else IsZero = FALSE Add(x,y):NaturalNumber ::= if (x+y <= MAXINT) Add = x+y Equal(x,y):Boolean 자연수 (NaturalNumber) 추상데이터타입 else Add = MAXINT ::= if (x == y) Equal = TRUE else Equal = FALSE Successor(x):NaturalNumber ::= if (x == MAXINT) Successor = x else Successor = x+1 Subtract(x,y):NaturalNumber ::=if (x<y) Subtract = 0 else Subtract = x-y end NaturalNumber
데이타추상화와데이타캡슐화의장점 소프트웨어개발의간소화 복잡한작업을부분작업들로분해 테스트와디버깅 각부분작업을독자적으로테스팅, 디버깅 오른쪽그림에서 (a) 는데이터추상화사용, 흰색부분이버그검사대상부분. 재사용성 자료구조에대한코드와연산을추출해서다른소프트웨어시스템에서도사용 (a) (b) 프로그램코드 A B C 접착코드프로그램코드 데이타타입의표현에대한수정 데이타타입의내부구현에직접접근하는연산들만수정 12
C++ 의기초 C++ 프로그램의구성 헤더파일 선언저장에사용 시스템정의파일 / 사용자정의파일 (.h 접미사포함 ) 전처리기명령 #include를사용하여화일에포함시킴 소스화일.cpp 또는.c 접미사 소스코드저장에사용 프로그램의실행 컴파일 링크 적재 헤더화일중복방지 #ifdef FILENAME_H #define FILENAME_H // 헤더화일내용삽입... #endif 13
C++ 에서의영역 파일영역 함수정의에속하지않은선언, 클래스정의, 네임스페이스 네임스페이스영역 네임스페이스 (namespace) 논리적으로연관된변수나함수를한그룹으로만드는기법 영역정보를사용해서네임스페이스안의개체에접근 예 ) std::cout 지역영역 블록안에서선언된이름 클래스영역 클래스정의에관련된선언 14
C++ 명령문과연산자 C++ 명령문 C 와같은문법과의미 C++ 연산자 new, delete 제외하고 C 의연산자와동일 C++ 의입출력 왼편 / 오른편시프트연산자 (<<, >>) 사용 C 와 C++ 의중요한차이점 연산자다중화 (operator overloading) 허용 15
C++ 데이타선언 데이타선언 : 한데이타타입을어떤이름에연결 상수값 (ex. 5, a, abc, 1.43) 변수 : 데이타타입의인스턴스 상수변수 : 선언시에내용이고정 const int MAX=500; 열거타입 : 일련의정수상수를선언 enum semester{summer, FALL, SPRING}; 포인터 : 객체의메모리주소저장 참조타입 : 객체에대한또다른이름을제공 int i=5; int& j=i; i=7; printf( i=%d, j=%d, i, j); // i=7, j=7 int i=25; int *np; np = &i; int i=25; int *np = &i; 16
C++ 의주석문 복수행주석문 C의주석문과동일 /* */ 단일행주석문 // 17
C++ 에서의입출력 (1) 시스템정의헤더화일 iostream이필요 cout 표준출력장치로출력 << 연산자는 cout 키워드와출력될개체를구분 #include <iostream> using namespace std ; 출력 : n:50 f:20.3 int main() { int n = 50 ; float f = 20.3 ; cout<<"n:"<<n<<endl; cout<<"f:"<<f<<endl; return 0 ; } 18
C++ 에서의입출력 (2) cin 입력을위해사용 >> 연산자는입력될변수들을구분 여백문자로입력값을구분 #include <iostream> using namespace std ; int main() { int a,b; 입력 1: 5 10 <Enter> 입력 2: 5 <Enter> 10 <Enter> cin>>a>>b; } 19
C++ 에서의입출력 (3) C++ 에서의입출력의장점 자유형식 : 포맷기호불필요 입출력연산자도다중화가능 화일입출력 헤더화일 fstream 필요 입력파일 : ifstream class 출력파일 : ofstream class #include <iostream> #include <fstream> using namespace std ; int main() { ofstream outfile("my.out", ios::out); if (!outfile) { cerr << "cannot open my.out" << endl; // 표준오류장치 return; } int n = 50; float f = 20.3; outfile << "n: " << n << endl; outfile << "f: " << f << endl; outfile.close() return 0; } http://se.kumoh.ac.kr/~halee/course/c_ex/ch12/ 20
C++ 의함수 정규함수 멤버함수 : 특정클래스와연관된함수 함수의구성 함수이름 인자리스트 ( 시그너처 ( 입력 )) 반환타입 ( 출력 ) 몸체 ( 함수를구현한코드 ) int getmax(int a, int b) { if (a > b) return a; else return b; } getmax : 함수이름 int a, int b : 인자리스트 int : 반환타입 { 와 } 사이 : 함수몸체 21
C++ 의매개변수전달 값 (value) 에의한전달 전달된객체는그함수의지역저장소에복사 실인자에영향을주지않음 실인자로제공되는변수가함수에의해변경되지않음 참조 (reference) 에의한전달 인자리스트의타입명세자에 & 첨가 전달된객체의주소만함수의지역저장소에복사 실인자에접근 전달된객체가큰메모리를요구하는경우더빨리수행 http://se.kumoh.ac.kr/~halee/course/c_ex/ch04/04-02.cpp 상수참조 (constant reference) 인자변경불가 const T& a 배열은참조로전달 22
C++ 의함수이름다중화 함수다중화 (function overloading) 함수의시그너처 ( 인자리스트 ) 가다르기만하면같은이름을가진함수가둘이상존재할수있음 e.g. int getmax(int, int); int getmax(int, int, int); int getmax(int*, int); int getmax(float, int); int getmax(int, float); 23
인라인함수 함수정의에키워드 inline 을첨가해서선언 함수호출과인자복사의오버헤드를줄임 e.g. inline int getsum(int a, int b) { return a + b; } i = getsum(x,12); 명령문은 i = x+12; 로대체 24
C++ 에서의동적메모리할당 new / delete 연산자 실행시간에자유저장소를할당받거나반환 new 연산자 원하는타입의객체를생성하고그에대한포인터를반환 생성할수없으면예외발생 delete 연산자 new 로생성된객체에게할당된기억장소를반환 e.g. int *ip = new int;.. delete ip; int *jp = new int[10]; //jp 는정수배열.. delete [] jp; 25
예외발생 오류와다른특별한조건이발생했음을알리는데사용 다양한예외각각에대해예외클래스를정의 e.g int DivZero(int a, int b, int c) { if (a <= 0 b <= 0 c <= 0) throw "All parameters should be >0 ; return a + b * c + b / c; } 26
예외처리 try 블록에발생될수있는예외를포함시켜서처리 try 블록뒤에는 0개이상의 catch 블록 각 catch 블록은예외타입을나타내는한인자를가짐 catch (char* e){} catch (bad_alloc e){} catch (...){} http://se.kumoh.ac.kr/~halee/course/c_ex/ch18/ 27