1 2주차 C 에서 C++로
세상을 먹어 치우는 소프트웨어 2 소프트웨어 기업의 세상 미국의 대형 서점 보더스 -> 아마존에 대패 블록버스터(Blockbuster) -> 네플릭스(Neflix)에 대패 ebay, Facebook, Groupon, Skype, Twitter, Android, 아이튠스, 판도라, 픽사 등 엄청난 소프트웨어 인력들을 필요로 하는 세상이 왔다.
프로그래밍 언어의 진화와 C++의 기원 Assembly 1954 Fortran 1958 Algol Martin Richards 1967 BCPL 1964 Basic Ken Tompson 1970 B Ken Tompson과 Dennis Ritchie 1972 C Bjarne Stroustrup 1983 C++ 1983 Objective-C 1987 Perl 1991 Visual Basic 1995 PHP 1995 Java 1995 Javascript 3 2000 C#
표준 C++ 프로그램의 중요성 4 C++ 언어의 표준 1998년 미국 표준원(ANSI, American National Standards Institute) C++ 언어에 대한 표준 설정 ISO/IEC 14882 문서에 작성됨. 유료 문서 표준의 진화 1998년(C++98), 2003년(C++03), 2007년(C++TR1), 2011년(C++11) 표준의 중요성 표준에 의해 작성된 C++ 프로그램 모든 플랫폼. 모든 표준 C++ 컴파일러에 의해 컴파일 동일한 실행 결과 보장 운영체제와 컴파일러의 종류에 관계없는 높은 호환성 비 표준 C++ 프로그램 Visual C++, Borland C++ 등 컴파일러 회사 고유의 비 표준 구문 특정 C++ 컴파일러에서만 컴파일 호환성 결여
표준/비표준 C++ 프로그램의 비교 5 표준 C++ 규칙에 따라 작성된 C++ 프로그램 표준 C++ 규칙에 따라 작성되지 않는 비주얼 C++ 프로그램 #include <iostream> int main() { std::cout << "Hello ; return 0; } 모든 C++ 컴파일러 에의해 컴파일 비주얼 C++ 전용 키워드 #include <iostream> int cdecl main() { std::cout << "Hello"; return 0; } 볼랜드 C++ 컴파일러 비주얼 C++ 컴파일러 GNU C++ 컴파일러 볼랜드 C++ 컴파일러 비주얼 C++ 컴파일러 GNU C++ 컴파일러 실행 파일 실행 파일 실행 파일 실행 파일 실행 파일 실행 파일 컴퓨터 컴퓨터
C++ 언어의 주요한 설계 목적 6 C 언어와의 호환성 C 언어의 문법 체계 계승 소스 레벨 호환성 - 기존에 작성된 C 프로그램을 그대로 가져다 사용 링크 레벨 호환성 C 목적 파일과 라이브러리를 C++ 프로그램에서 링크 객체 지향 개념 도입 캡슐화, 상속, 다형성 소프트웨어의 재사용을 통해 생산성 향상 복잡하고 큰 규모의 소프트웨어의 작성, 관리, 유지보수 용이 엄격한 타입 체크 실행 시간 오류의 가능성을 줄임 디버깅 편리 실행 시간의 효율성 저하 최소화 실행 시간을 저하시키는 요소와 해결 작은 크기의 멤버 함수 잦은 호출 가능성 -> 인라인 함수로 실행 시간 저 하해소
C 언어에 추가한 기능 7 인라인 함수(inline function) 함수 호출 대신 함수 코드의 확장 삽입 함수 중복(function overloading) 매개 변수의 개수나 타입이 다른 동일한 이름의 함수들 선언 디폴트 매개 변수(default parameter) 매개 변수에 디폴트 값이 전달되도록 함수 선언 참조와 참조 변수(reference) 하나의 변수에 별명을 사용하는 참조 변수 도입 참조에 의한 호출(call-by-reference) 함수 호출 시 참조 전달 new/delete 연산자 동적 메모리 할당/해제를 위해 new와 delete 연산자 도입 연산자 재정의 기존 C++ 연산자에 새로운 연산 정의 제네릭 함수와 클래스 데이터 타입에 의존하지 않고 일반화시킨 함수나 클래스 작성 가능
C++객체지향특성-캡슐화 8 캡슐화(Encapsulation) 데이터를 캡슐로 싸서 외부의 접근으로부터 보호 C++에서 클래스(class 키워드)로 캡슐 표현 클래스와 객체 클래스 객체를 만드는 틀 객체 클래스라는 틀에서 생겨난 실체 객체(object), 실체(instance)는 같은 뜻 클래스 (객체를 정의하는 틀) 객체 생성 객체들 - 실체 멤버들 class Circle { private: int radius; // 반지름 값 public: Circle(int r) { radius = r; } double getarea() { return 3.14*radius*radius; } }; 원을 추상화한 Circle 클래스 원 객체들(실체)
C++객체지향특성-상속성 9 객체 지향 상속(Inheritance) 자식이 부모의 유전자를 물려 받는 것과 유사 C++ 상속 객체가 자식 클래스의 멤버와 부모 클래스에 선언된 모양 그대로 멤버들을 가지고 탄생
C++객체지향특성-다형성 10 다형성(Polymorphism) 하나의 기능이 경우에 따라 다르게 보이거나 다르게 작동하는 현상 연산자 중복, 함수 중복, 함수 재정의(overridding) 2 + 3 --> 5 남자 + 여자 --> 남자여자 redcolor 객체 + bluecolor 객체 --> purplecolor 객체 + 연산자 중복 void add(int a, int b) {... } void add(int a, int b, int c) {... } void add(int a, double d) {... } add 함수 중복 함수 재정의(오버라이딩)
C ++ 언어에서 객체 지향을 도입한 목적 11 소프트웨어 생산성 향상 소프트웨어의 생명 주기 단축 문제 해결 필요 기 작성된 코드의 재사용 필요 C++ 클래스 상속 및 객체 재사용으로 해결 실세계에 대한 쉬운 모델링 과거의 소프트웨어 수학 계산이나 통계 처리에 편리한 절차 지향 언어가 적합 현대의 소프트웨어 물체 혹은 객체의 상호 작용에 대한 묘사가 필요 실세계는 객체로 구성된 세계 객체를 중심으로 하는 객체 지향 언어 적합
절차 지향 프로그래밍과 객체 지향 프로그래밍 12 실행하고자 하는 절차대로 일련의 명령어 나열. 흐름도를 설계하고 흐름도 에 따라 프로그램 작성 객체들을 정의하고, 객 체들의 상호 관계, 상호 작용으로 구현
예제 1-1: 기본적인 C++ 프로그램 13 /* 소스: SimpleC++.cpp cout과 << 연산자를 이용하여 화면에 출력한다. */ #include <iostream> // cout과 << 연산자 포함 // C++ 프로그램은 main() 함수에서부터 실행을 시작한다. <- C와 동일 int main() { std::cout << "Hello\n"; // 화면에 Hello를 출력하고 다음 줄로 넘어감 std::cout << "첫 번째 맛보기입니다."; return 0; // main() 함수가 종료하면 프로그램이 종료됨 } Hello 첫 번째 맛보기입니다.
주석문과 main() 함수 14 주석문 개발자가 자유롭게 붙인 특이 사항의 메모, 프로그램에 대한 설명 프로그램의 실행에 영향을 미치지 않음 여러 줄 주석문 - /*... */ 한 줄 주석문 - //를 만나면 이 줄의 끝까지 주석으로 처리 main() 함수 C++ 프로그램의 실행을 시작하는 함수 main() 함수가 종료하면 C++ 프로그램 종료 main() 함수의 C++ 표준 모양 int main() { // main()의 리턴 타입 int... return 0; // 0이 아닌 다른 값으로 리턴 가능 } void main() { // 표준 아님... } main()에서 return문 생략 가능 int main() {... // return 0; // 개발자의 편리를 위해 return 문 생략 가능 }
#include <iostream> 15 #include <iostream> 전처리기(C++ Preprocessor)에게 내리는 지시 <iostream> 헤더 파일을 컴파일 전에 소스에 확장하도록 지시 <iostream> 헤더 파일 표준 입출력을 위한 클래스와 객체, 변수 등이 선언됨 ios, istream, ostream, iostream 클래스 선언 cout, cin, <<, >> 등 연산자 선언 #include <iostream>... std::cout << "Hello\n"; std::cout << "첫 번째 맛보기입니다."; <iostream.h> 헤더 파일 구 버전의 C++ 표준에서 사용하던 헤더 파일 구 버전 컴파일러(Visual Studio 6.0)에서 사용
화면 출력 16 cout과 << 연산자 이용 std::cout << "Hello\n"; // 화면에 Hello를 출력하고 다음 줄로 넘어감 std::cout << "첫 번째 맛보기입니다."; cout 객체 스크린 출력 장치에 연결된 표준 C++ 출력 스트림 객체 <iostream> 헤더 파일에 선언 std 이름 공간에 선언: std::cout으로 사용 << 연산자 스트림 삽입 연산자(stream insertion operator) C++ 기본 산술 시프트 연산자(<<)가 스트림 삽입 연산자로 재정의됨 ostream 클래스에 구현됨 오른쪽 피연산자를 왼쪽 스트림 객체에 삽입 cout 객체에 연결된 화면에 출력 여러 개의 << 연산자로 여러 값 출력 std::cout << "Hello\n" << "첫 번째 맛보기입니다.";
<< 연산자 활용 17 문자열 및 기본 타입의 데이타 출력 bool, char, short, int, long, float, double 타입 값 출력 int n=3; char c= # ; std::cout << c << 5.5 << '-' << n << "hello" << true; #5.5-3hello1 연산식뿐 아니라 함수 호출도 가능 std::cout << n + 5 = << n + 5; std::cout << f(); // 함수 f()의 리턴값을 출력한다. 다음 줄로 넘어가기 \n 사용 endl 조작자 사용 std::cout << Hello << \n ; std::cout << Hello << std::endl;
예제 1 2 cout과 <<를 이용한 화면 출력 18 #include <iostream> double area(int r); // 함수의 원형 선언 double area(int r) { // 함수 구현 return 3.14*r*r; // 반지름 r의 원면적 리턴 } int main() { int n=3; char c='#'; } std::cout << c << 5.5 << '-' << n << "hello" << true << std::endl; std::cout << "n + 5 = " << n + 5 << '\n'; std::cout << "면적은 " << area(n); // 함수 area()의 리턴 값 출력 #5.5-3hello1 n + 5 = 8 면적은 28.26 true는 1 로 출력됨
printf()는 잊어라! 19 cout과 <<를 사용하자.
std:: 란? 20 std ANSI C++ 표준에서 정의한 이름 공간(namespace) 중하나 <iostream> 헤더 파일에 선언된 모든 이름: std 이름 공간 안에 있음 cout, cin, endl 등 std 이름 공간에 선언된 이름을 접근하기 위해 std:: 접두어 사용 std::cout, std::cin, std::endl std:: 생략 using 지시어 사용 std:: 생략 using std::cout; // cout에 대해서만 std:: 생략... cout << "Hello << std::endl; // std::cout에서 std:: 생략 using namespace std; // std 이름 공간에 선언된 모든 이름에 std:: 생략... cout << "Hello" << endl; // std:: 생략 std:: 생략 std:: 생략
예제 1-3 C++ 프로그램에서 키 입력 받기 21 #include <iostream> using namespace std; int main() { cout << "너비를 입력하세요>>"; int width; cin >> width; // 키보드로부터 너비를 읽어 width 변수에 저장 cout << "높이를 입력하세요>>"; int height; cin >> height; // 키보드로부터 높이를 읽어 height 변수에 저장 } int area = width*height; // 사각형의 면적 계산 cout << "면적은 " << area << "\n"; // 면적을 출력하고 다음 줄로 넘어감 너비를 입력하세요>>3 높이를 입력하세요>>5 면적은 15
cin과 >> 연산자를 이용한 키 입력 22 cin 표준 입력 장치인 키보드를 연결하는 C++ 입력 스트림 객체 >> 연산자 스트림 추출 연산자(stream extraction operator) C++ 산술 시프트 연산자(>>)가 <iostream> 헤더 파일에 스트림 추출 연산자로 재정의됨 입력 스트림에서 값을 읽어 변수에 저장 연속된 >> 연산자를 사용하여 여러 값 입력 가능 cout << "너비와 높이를 입력하세요>> ; cin >> width >> height; cout << width << \n << height << \n; 너비와 높이를 입력하세요>>23 36 23 width에 36 입력 height에 입력
<Enter> 키를칠때변수에값전달 23 cin의 특징 입력 버퍼를 내장하고 있음 <Enter>키가 입력될 때까지 입력된 키는 입력 버퍼에 들어감 도중에 <Backspace> 키를 입력하면 입력된 키 삭제 >> 연산자 <Enter>키가 입력되면 비로소 입력 버퍼에 있는 키 값을 변수에 전달
24 cin으로부터 키 입력 받는 과정
실행문 중간에 변수 선언 25 C++의 변수 선언 변수 선언은 아무 곳이나 가능 int width; cin >> width; // 키보드로부터 너비를 읽는다. 실행문 중간 에변수선언 cout << "높이를 입력하세요>>"; int height; cin >> height; // 키보드로부터 높이를 읽는다. // 너비와 높이로 구성되는 사각형의 면적을 계산한다. int area = width*height; cout << "면적은 " << area << "\n"; // 면적을 출력하고 한줄띈다. C++ 변수 선언 방식의 장점 C에서와 같이 변수 선언부과 실행 문 사이를 왔다 갔다 하는 번거로움 해소 변수를 사용하기 직전 선언함으로써 변수 이름에 대한 타이핑 오류 줄임 C++ 변수 선언 방식의 단점 선언된 변수를 일괄적으로 보기 힘듦 코드 사이에 있는 변수 찾기 어려움
미스 타이핑 가능성 해소 26 선언부에 모든 변수를 선언하는 경우, 미스 타이핑 가능 int time, timer;... timer = 5; // time에 5을 저장하려다 timer로 잘못 입력. 컴파일 오류 발생하지 않음 // 그러나 잘못된 실행 결과 발생... timer = 3; 변수 사용 전에 변수를 선언하면, 미스 타이핑 사전 발견 컴파일 오류 int time; timer = 5; // time에 5을 저장하려다 timer로 잘못 입력. 컴파일 오류 발생... int timer; timer = 3;
C++ 문자열 27 C-스트링 문자열 단순 문자 배열 C++의 문자열 표현 방식 : 2가지 C-스트링 방식 \0 로 끝나는 문자 배열 char name1[6] = { G, r, a, c, e, \0 }; // name1은 문자열 Grace char name2[5] = { G, r, a, c, e }; // name2는 문자열이 아니고 단순 문자 배열 char name5[10] = Grace ; name5[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] G r a c e \0 \0 \0 \0 \0 Grace 문자열 \0 로 초기화 string 클래스 이용 <string> 헤더 파일에 선언됨 다양한 멤버 함수 제공, 문자열 비교, 복사, 수정 등
C 언어에서 사용한 문자열 라이브러리 28 C-스트링으로 문자열 다루기 C 언어에서 사용한 함수 사용 가능 strcmp(), strlen(), strcpy() 등 <cstring>이나 <string.h> 헤더 파일 include #include <cstring> 또는 #include <string.h>... int n = strlen("hello"); <cstring> 헤더 파일을 사용하는 것이 바람직함 <cstring>이 C++ 표준 방식
cin을 이용한 문자열 입력 29 문자열 입력 char name[6]; // 5 개의 문자를 저장할 수 있는 char 배열 cin >> name; // 키보드로부터 문자열을 읽어 name 배열에 저장한다. Grace 키입력 name [0] [1] [2] [3] [4] [5] G r a c e \0 Grace 문자열
예제 1 4 키보드에서 문자열 입력받고 출력 30 #include <iostream> using namespace std; int main() { cout << "이름을 입력하세요>>"; char name[11]; // 한글은 5개 글자, 영문은 10까지 저장할 수 있다. cin >> name; // 키보드로부터 문자열을 읽는다. } cout << "이름은 " << name << "입니다\n"; // 이름을 출력한다. 이름을 입력하세요>>마이클 이름은 마이클입니다 빈 칸 없이 키 입력해야 함 이름을 입력하세요>>마 이 클 이름은 마입니다 빈 칸을 만나면 문자 열입력종료
31 예제 1-5 C-스트링을 이용하여 암호가 입력되면 프로그램을 종료하는 예 #include <iostream> #include <cstring> using namespace std; strcmp() 함수를 사용 하기 위한 헤더 파일 int main() { char password[11]; cout << "프로그램을 종료하려면 암호를 입력하세요." << endl; while(true) { cout << "암호>>"; cin >> password; if(strcmp(password, "C++") == 0) { cout << "프로그램을 정상 종료합니다." << endl; break; } else cout << "암호가 틀립니다~~" << endl; } } 프로그램을 종료하려면 암호를 입력하세요. 암호>>Java 암호가 틀립니다~~ 빈 칸 없이 키 입력해야 함 암호>>C 암호가 틀립니다~~ 암호>>C++ 프로그램을 정상 종료합니다.
cin.getline()을 이용한 문자열 입력 32 공백이 낀 문자열을 입력받는방법 cin.getline(char buf[], int size, char delimitchar) buf에 최대 size-1개의 문자 입력. 끝에 \0 붙임 delimitchar를 만나면 입력 중단. 끝에 \0 붙임 delimitchar의 디폴트 값은 \n (<Enter>키) char address[100]; cin.getline(address, 100, '\n'); 최대 99개의 문자를 읽어 address 배열 에 저장. 도중에 <Enter> 키를 만나면 입력 중단 사용자가 Seoul Korea<Enter> 를 입력할 때, address[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]... [99] S e o u l K o r e a \0...... "Seoul Korea" 문자열
예제 1 6 cin.getline()을 이용한 문자열 입력 33 #include <iostream> using namespace std; int main() { cout << "주소를 입력하세요>>"; char address[100]; cin.getline(address, 100, '\n'); // 키보드로부터 주소 읽기 } cout << "주소는 " << address << "입니다\n"; // 주소 출력 주소를 입력하세요>>컴퓨터시 프로그램구 C++동 스트링 1-1 주소는 컴퓨터시 프로그램구 C++동 스트링 1-1입니다 빈칸이 있어도 <Enter> 키가 입력 될 때까지 하나의 문자열로 인식
C++에서 문자열을 다루는 string 클래스 34 string 클래스 C++에서 강력 추천 C++ 표준 클래스 문자열의 크기에 따른 제약 없음 string 클래스가 스스로 문자열 크기게 맞게 내부 버퍼 조절 문자열 복사, 비교, 수정 등을 위한 다양한 함수와 연산자 제공 객체 지향적 <string> 헤더 파일에 선언 #include <string> 필요 C-스트링보다 다루기 쉬움
35 예제 1-7 string 클래스를 이용한 문자열 입력 및 다루기(비교) #include <iostream> #include <string> using namespace std; string 클래스를 사용하기 위한 헤더 파일 int main() { string musical("lion King"); // 문자열 musical string elton("elton John"); // 문자열 elton string composer; // 문자열 composer cout << 뮤지컬 + musical + "의 작곡자는"; // + 로 문자열 연결 cout << "(힌트 : 첫글자는 " << elton[0] << ")?"; // [] 연산자 사용 } getline(cin, composer); // 문자열 입력 getline()은 string 타입의 문자열을 입 력 받기 위해 제공되는 전역 함수 <- if(composer == elton) // 문자열 비교 빈칸을 포함하는 문자열 입력 가능 cout << "맞았습니다."; else cout << "틀렸습니다. "+ elton + "입니다." << endl; // +로 문자열 연결 뮤지컬 Lion King의 작곡자는(힌트 : 첫글자는 E)?Emma Watson 틀렸습니다. Elton John입니다. 빈칸 포함
<iostream>과 <iostream.h>의 차이 36 구 표준의 C++ #include <iostream.h> 2003년 표준 이후 버전의 C++ #include <iostream> using namespace std; 헤더 파일의 확장자 비교
#include <헤더파일>와 #include "헤더파일" 37 #include <헤더파일> 헤더파일 을 찾는 위치 컴파일러가 설치된 폴더에서 찾으라는 지시 #include <iostream> <iostream> 헤더 파일은 컴파일러가 제공 #include 헤더파일 헤더파일 을 찾는 위치 개발자의 프로젝트 폴더 개발자가 컴파일 옵션으로 지정한 include 폴더에서 찾도록 지시
cin과 cout은 어디에 선언되어 있는가? 38 cout이나 cin은 모두 <iostream>에 선언된 객체 <iostream> 헤더 파일