C++ Espresso 제1장 기초 사항
이번 장에서 학습할 내용 C++에 대한 기초적인 사항들을 살펴봅니다. C++ 언어의 역사 C++ 언어의 특징 객체 지향의 간단한 소개 C++ 개발 과정 첫번째 예제 설명 변수와 상수 연산자
C++ 언어의 개발 C++는 1980년대 초에 AT&T 벨연구소의 Bjarne Stroustrup에 의하여 개발 C with Classes -> C++ C++는 C언어에 클래스 개념을 추가하고 이어서 가상 함수, 연산자 중복 정의, 다중 상속, 템플릿, 예외 처리 등이 기능이 차례로 추가
C++의 설계 철학 엄격한 타입 검사, 범용 언어, 효율적, 이식성 여러 가지의 프로그래밍 스타일을 지원 (절차 지향 프로그래밍, 데이터 추상화, 객체 지향 프로그래밍, 일반화 프로그래밍) 프로그래머가 자유롭게 선택할 수 있도록 설계 최대한 C와 호환 플랫폼에 의존적이거나 일반적이지 않은 특징은 제거
C++ 언어 순차적인알고리즘 사용 하나의 코드로 여러 가지의 경우를 처리 데이터와 알고리즘을 합친 객체 사용
절차적 프로그래밍 절차적 프로그래밍에서는 데이터보다는 알고리즘(절차)을 중시
절차적 프로그래밍의 단점 무조건적인 점프 문장->난해
구조화 프로그래밍 무조건적인 점프를 없앴음 그러나 여전히 데이터와 알고리즘은 분리되어 있음
객체 지향 프로그래밍 객체 지향 프로그래밍에서는 데이터와 알고리즘이 묶여있음.
중간 점검 문제 Java와 C#는 C++와 어떤 관계가 있을까? C++ 언어가 C 언어의 상위집합이라면 C언어를 반드시 배워야 할까?
객체 지향이란? 실제 세계를 모델링하여 소프트웨어를 개발하는 방법
객체 지향의 과정
객체 지향의 개념들 캡슐화(encapsulation) 정보 은닉(information-hiding) 상속(inheritance) 다형성(polymorphism) 앞으로 하나씩 학습할 것임.
Quiz (….): 데이터와 알고리즘을 하나의 단위(클래스)로 묶는 것이다. (….): 데이터에 대한 불필요한 접근을 차단하여서 데이터를 보호 (….): 비슷한 클래스가 이미 존재하고 있다면 그 클래스를 가져다가 사용하는 것 (….): 같은 이름의 함수나 연산자를 중복 정의하여서 상황에 따라서 가장 적절한 함수나 연산자를 프로그램이 자동적으로 선택 앞으로 하나씩 학습할 것임.
객체 지향의 최종 목표 최종 목표: 코드의 재사용
중간 점검 문제 객체 지향 프로그래밍은 ________들을 조합하여서 프로그램을 작성하는 기법이다. 2. 객체 지향 프로그래밍의 시작은 __________년대에 개발된 ________언어이다.
통합 개발 환경 통합 개발 환경(IDE: integrated development environment): 에디터 + 컴파일러 + 디버거
통합 개발 환경의 종류 비주얼 C++(Visual C++) 마이크로소프트사의 제품 윈도우 기반의 거의 모든 형태의 응용 프로그램 제작 가능 최신 버전: 비주얼 C++ 2010 우리가 사용할 버전: 비주얼 C++ 6.0 or 비주얼 C++ 2008
비주얼 C++ 실행 개발 도구를 사용할 때의 유용한 정보를 말해준다. 다음 팁을 계속보려면 우른다. 체크되어 있으면 다음번 시작때도 팁을 보여준다.
워크스페이스와 프로젝트 워크스페이스(workspace); 작업 공간, 여러 개의 프로젝트가 있을 수 있다. 프로젝트(project): 하나의 실행 파일을 만들기 위하여 필요한 파일들의 그룹 워크스페이스: 여러 개의 프로젝트들을 가지고 있는 작업공간 프로젝트: 실행 파일을 만들기 위하여 필요한 파일들
비주얼 C++ 시작하기
프로젝트 생성하기
프로젝트 생성하기 ② ③ ④ ⑤ ① ⑥ 프로젝트 이름을 적어준다. Win32 콘솔 애플리케이션을 선택한다. 프로젝트가 저장되는 폴더를 지정한다. 프로젝트 이름을 적어준다. Win32 콘솔 애플리케이션을 선택한다.
프로젝트 생성하기 ① ② 비어있는 프로젝트를 만든다. simple application을 선택하면 간단한 c++ 프로그램이 작성되니 주의!
소스 파일 생성하기
소스 파일에 프로그램 작성
비주얼 C++의 전체 구조 소스 파일을 에디팅하는 윈도우. 워크스페이스와 프로젝트에 속하는 파일을 보여준다. 컴파일과 링크과정에서의 메시지 출력.
프로그램 입력
컴파일하기
컴파일 결과
오브젝트 파일과 실행 파일의 생성 오브젝트 파일과 실행 파일이 생성된 것을 확인할 수 있다.
프로그램 실행 하기
실행 결과 화면
중간 점검 문제 1. 새로운 프로젝트를 생성하고 프로젝트에 소스 파일을 추가하는 메뉴는 무엇인가? 2. 프로젝트에 속하는 소스 파일을 컴파일하여 실행하는 메뉴는 무엇인가? 3. C++ 언어에서는 대문자와 소문자를 구별하는가?
첫 번째 프로그램의 분석
주석 주석(comment): 프로그램에 대한 설명 // 첫 번째 예제 프로그램 /* 한줄로된주석 */ 주석은 프로그램을 설명하는 글입니다. /* 한줄로된주석 */ int main() /* 줄의일부분인주석 */ /* 여러 줄로 된주석 */
헤더 파일 포함 #include는 소스 코드 안에 특정 파일을 현재의 위치에 포함 #include <iostream> #include는 소스 코드 안에 특정 파일을 현재의 위치에 포함 헤더 파일(header file): 컴파일러가 필요로 하는 정보를 가지고 있는 파일 iostream: 표준 입출력 스트림 주의!: 전처리기 지시자 문장 끝에는 세미콜론을 붙이면 안 된다.
iostream 헤더 파일
이름 공간 using은 이름 공간을 지정하는 지시어이다. using namespace std; using은 이름 공간을 지정하는 지시어이다. 프로그램에서는 많은 이름들이 사용되고 이들 이름들은 효율성을 위하여 이름 공간(name space)이라고 하는 몇 개의 영역으로 구성되어 있다. 이름 공간 std를 사용한다는 의미 Network Graphics message() message() int mode; int mode;
이름 공간 정의 namespace 이름 { 형식 변수 정의; 함수 정의; 클래스 정의; ... } 예 namespace Graphics { int mode; int x, y; void draw(); void message(); ... }
같은 이름 사용 가능 namespace Graphics { int mode; int x, y; void draw(); void message(); ... } namespace Network { int mode; int speed; void send(char *); void message(); ... }
이름 공간 지정 Graphics 이름 공간 안의 mode 변수를 사용하려면 Graphics::mode = 1; Network::mode = 1; 이름 공간 지정
예제 #include <iostream> using namespace std; int mode; // 전역 변수 mode namespace Graphics { int mode; int x, y; void draw() { cout << "Graphics 이름 공간 안의 draw()" << endl; }; void message() { cout << "Graphics 이름 공간 안의 message()" << endl; }; } namespace Network { int mode, speed; void send(char *) { cout << "Graphics 이름 공간 안의 send()" << endl; }; void message() { cout << "Network 이름 공간 안의 message()" << endl; };
예제 int main() { //x = y = 100; // 컴파일 오류! //speed = 22900; // 컴파일 오류! //draw(); // 컴파일 오류! mode = 1; // 전역 변수 Graphics::mode = 1; Network::mode = 2; Graphics::message(); Network::message(); return 0; } Graphics 이름 공간 안의 message() Network 이름 공간 안의 message() 계속하려면 아무 키나 누르십시오 . . .
using 문 using 이름공간::식별자; 예를 들어서 다음과 같이 선언하면 Network안의 mode는 이름 공간을 붙이지 않아도 접근이 가능하다. using Network::speed; speed = 100; // Network 이름 공간 안의 speed를 의미 using namespace Network; speed = 19200; // Network 이름 공간 안의 speed를 의미 send("This is a test"); // Network 이름 공간 안의 send()를 의미 using namespace 이름공간;
함수 int main() 입력 함수(function): 특정한 작업을 수행하기 위하여 작성된 독립적인 코드 출력
함수의 구조
문장 함수는 여러 개의 문장으로 이루어진다. 문장들은 순차적으로 실행된다.
출력 객체 cout cout은 컴파일러가 제공하는 객체로서 출력을 담당합니다. 큰따옴표 안의 문자열을 화면에 출력합니다. cout << “Hello World!” << endl; cout은 컴파일러가 제공하는 객체로서 출력을 담당합니다. 큰따옴표 안의 문자열을 화면에 출력합니다. endl은 문장의 끝을 나타내는 기호(\n로 정의되어 있다). Hello World!
함수 반환문 return은 함수의 결과값을 외부로 반환합니다. return 0; 운영 체제 main() cout << Hello World!\n”; return 0; 운영 체제
응용 프로그램 #1 다음과 같은 출력을 가지는 프로그램을 제작하여 보자. Hello World! Kim ChulSoo
첫 번째 버전 문장들은 순차적으로 실행된다는 사실 이용 #include <iostream> using namespace std; int main() { cout <<" Hello World! "; cout << “Kim ChulSoo"; return 0; } 우리가 원하는 결과가 아님! Hello World!Kim ChulSoo
줄바꿈 문자 \n 줄바꿈 문자인 \n은 화면에서 커서는 다음줄로 이동하게 한다. cout << “Hello World!”; cout << “Hello World!\n”;
변경된 프로그램 줄바꿈 문자를 포함하면 우리가 원하던 결과가 된다. #include <iostream> using namespace std; int main() { cout <<“Hello World!\n"; cout << “Kim ChulSoo\n”; return 0; } Hello World! Kim ChulSoo
응용 프로그램 #2 다음과 같은 출력을 가지는 프로그램을 제작하여 보자. 3X1=3 3X2=6 3X3=9
응용 프로그램 #2 역시 문장들은 순차적으로 수행된다는 점을 이용한다. #include <iostream> using namespace std; int main() { cout <<“3X1=3\n"; cout <<“3X2=6\n"; cout <<“3X3=9\n"; return 0; }
오류 메시지의 분석
중간 점검 문제 1. 주석이 하는 역할은 무엇인가? 2. 주석을 여러 줄로 하려면 어떤 스타일을 사용하여야 하는가? 3. #include 문은 어떤 동작을 하는가?
변수 Q) 변수(variable)이란 무엇인가? A) 프로그램에서 일시적으로 데이터를 저장하는 공간 Q) 변수는 왜 필요한가?
변수 = 상자 변수는 물건을 저장하는 상자와 같다. int 데이터 변수의 타입 변수의 이름
변수와 상수 변수(variable): 저장된 값의 변경이 가능한 공간 상수(constant): 저장된 값의 변경이 불가능한 공간 (예) 3.14, 100, ‘A’, “Hello World!”
자료형 자료형(data type): 데이터의 타입(종류) (예) 정수형 , 실수형
자료형의 종류 short int long unsigned short unsigned int unsigned long char 설명 바이트수 범위 정수형 부호있음 short short형 정수 2 -32768~32767 int 정수 4 -2147483648~2147483647 long long형 정수 부호없음 unsigned short 부호없는 short형 정수 0~65535 unsigned int 부호없는 정수 0~4294967295 unsigned long 부호없는 long형 정수 문자형 char 문자 및 정수 1 -128~127 unsigned char 문자 및 부호없는 정수 0~255 부동소수점형 float 단일정밀도 부동소수점 1.2E-38~3.4E38 double 두배정밀도 부동소수점 8 2.2E-308~1.8E308 부울형 bool 참이나 거짓을 나타낸다. true, false
Bool형 논리형의 변수는 참 또는 거짓의 값만을 가질 수 있다. bool condition = true;
중간 점검 문제 1. 변수와 상수의 차이점은 무엇인가? ______________________________________________ 2. 변수와 자료형의 관련성을 설명하라. 3. C++가 지원하는 자료형들을 메모리 크기순으로 나열하라.
변수의 이름짓기 식별자(identifier): 식별할 수 있게 해주는 이름 변수 이름 함수 이름 김철수 김영희
식별자를 만드는 규칙 알파벳 문자와 숫자, 밑줄 문자 _로 구성 첫 번째 문자는 반드시 알파벳 또는 밑줄 문자 _ 대문자와 소문자를 구별 C 언어의 키워드와 똑같은 이름은 허용되지 않는다. (Q) 다음은 유효한 식별자인가? sum _count king3 n_pictures 2nd_try Dollor# double O X // 숫자로 시작 X // #기호 X // 키워드
키워드 키워드(keyword): C++언어에서 고유한 의미를 가지고 있는 특별한 단어 예약어(reserved words) 라고도 한다. C언어의 키워드 C++언어의 키워드 auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while asm false protected try bool friend public typeid catch inline reinterpret_cast typename class mutable static_cast using const_cast namespace template virtual delete new this wchar_t dynamic_cast operator throw explicit private true
중간 점검 문제 1. 변수 이름을 만들 때 지켜야 하는 규칙은 무엇인가? 2. 변수 이름의 첫 번째 글자로 허용되는 글자들은 어떤 글자인가? 3. 고유한 의미를 가지고 있는 단어들을 무엇이라고 하는가?
변수 선언 변수 선언: 컴파일러에게 어떤 변수를 사용하겠다고 미리 알리는 것 자료형 변수이름; 변수 선언의 예 char c; 자료형 변수이름; 변수 선언의 예 char c; int i; double interest_rate; int height, width;
변수에 값을 저장하는 방법 char c; // 문자형 변수 c 선언 int i; // 정수형 변수 i 선언 double interest_rate; // 실수형 변수 interest_rate 선언 c = 'a'; // 문자형 변수 c에 문자 'a'를 대입 i = 60; // 정수형 변수 i에 60을 대입 interest_rate = 4.9; // 실수형 변수 interest_rate에 82.9를 대입
변수의 초기화 자료형 변수이름 = 초기값; 변수 초기화의 예 char c = ‘a’; int i = 7; 자료형 변수이름 = 초기값; 변수 초기화의 예 char c = ‘a’; int i = 7; double interest_rate = 0.05;
문자열 타입 string 타입을 제공한다.
문자열 타입 문자열의 비교는 == 연산자로 가능
기호 상수 기호 상수(symbolic constant): 기호를 이용하여 상수를 표현한 것 (예) area = 3.141592 * radius * radius; area = PI * radius * radius; income = salary - 0.15 * salary; income = salary - TAX_RATE * salary; 기호 상수의 장점 가독성이 높아진다. 값을 쉽게 변경할 수 있다.
기호 상수의 장점
기호 상수를 만드는 방법 const 키워드 이용 #include <iostream> using namespace std; // 이름공간설정 int main() { const int MONTHS = 12; // 기호상수선언 double m_salary, y_salary; // 변수선언 cout << "월급을입력하시요: "; // 입력안내문 cin >> m_salary; y_salary = 12 * m_salary; // 순수입계산 cout << "연봉은" << y_salary << "입니다" << endl; return 0; } 기호 상수 정의
중간 점검 문제 1. 변수와 상수의 차이점은 무엇인가? 2. 왜 정수를 하나의 타입으로 하지 않고 char, int, short, long 등의 여러 가지 타입으로 복잡하게 분류하여 사용하는가? 3. 숫자값을 직접 사용하는 것보다 기호 상수를 사용하는 것의 이점은 무엇인가? 4. 변수 x와 y를 하나의 문장을 사용하여서 bool형으로 선언하여 보라.
출력과 입력 C++에서는 콘솔 입력은 cin 객체가, 콘솔 출력은 cout 객체가 담당 이들은 모두 iostream 라이브러리에 포함 cin cout
출력 cout << 100; int i = 100; cout << i; cout << “변수 i의 값은 ” << i << “입니다.”
출력 cout은 스스로 변수의 자료형에 따라 적절하게 출력할 수 있다. int i; float f; cout << i; // 정수 형식으로 i의 값이 출력된다. cout << f; // 실수 형식으로 f의 값이 출력된다.
입력 int main(void) { int i; cin >> i; // 정수를 읽어서 i에 저장 double f; cin >> f; // 실수를 읽어서 f에 저장 return 0; }
예제
중간 점검 문제 1. “변수 i의 값: "와 변수 i의 값을 이어서 출력하는 출력문을 작성하라. 2. 키보드로부터 double형의 실수를 받아서 변수 n에 저장하는 문장을 작성하라. 3. 키보드로부터 문자열을 받아서 변수 s에 저장하는 문장을 작성하라.
수식 수식(expression) x + y x*x + 5*x + 6 (principal * interest_rate * period) / 12.0 수식(expression) 상수, 변수, 연산자의 조합 연산자와 피연산자로 나누어진다.
기능에 따른 연산자의 분류 연산자의 분류 연산자 의미 대입 = 오른쪽을 왼쪽에 대입 산술 + - * / % 사칙연산과 나머지 연산 부호 + - 증감 ++ -- 증가, 감소 연산 관계 > < == != >= <= 오른쪽과 왼쪽을 비교 논리 && || ! 논리적인 AND, OR 조건 ? 조건에 따라 선택 콤마 , 피연산자들을 순차적으로 실행 비트 단위 연산자 & | ^ ~ << >> 비트별 AND, OR, XOR, 이동, 반전 sizeof 연산자 sizeof 자료형이나 변수의 크기를 바이트 단위로 반환 형변환 (type) 변수나 상수의 자료형을 변환 포인터 연산자 * & [] 주소계산, 포인터가 가리키는 곳의 내용 추출 구조체 연산자 . -> 구조체의 멤버 참조
피연산자수에 따른 연산자 분류 단항 연산자: 피연산자의 수가 1개 이항 연산자: 피연산자의 수가 2개 ++x; --y; 이항 연산자: 피연산자의 수가 2개 x + y x - y 삼항 연산자: 연산자의 수가 3개 x ? y : z
중간 점검 문제 1. 수식(expression)이란 어떻게 정의되는가? 2. 상수 10도 수식이라고 할 수 있는가? 3. 아래의 수식에서 피연산자와 연산자를 구분하여 보라. y = 10 + 20; 4. 연산자를 단항 연산자, 이항 연산자, 삼항 연산자로 나누는 기준은 무엇인가?
산술 연산자 덧셈, 뺄셈, 곱셈, 나눗셈 등의 사칙 연산을 수행하는 연산자 연산자 기호 의미 예 덧셈 + x와 y를 더한다 - x에서 y를 뺀다. x-y 곱셈 * x와 y를 곱한다. x*y 나눗셈 / x를 y로 나눈다. x/y 나머지 % x를 y로 나눌 때의 나머지값 x%y
나머지 연산자 #include <iostream> using namespace std; int main() { int input, minute, second; const int SEC_PER_MINUTE=60; cout << "초단위의시간을입력하시요:(32억초이하) "; cin >> input; // 초단위의시간을읽는다. minute = input / SEC_PER_MINUTE; // 몇분 second = input % SEC_PER_MINUTE; // 몇초 cout << input << "초는" << minute << "분" << second << "초입니다." << endl; return 0; } 초단위의 시간을 입력하시요:(32억초이하) 1000 1000초는 16분 40초 입니다.
관계 연산자 두개의 피연산자를 비교하는 연산자 결과값은 참(1) 아니면 거짓(0) 연산자 기호 의미 사용예 == x와 y가 같은가? x == y != x와 y가 다른가? x != y > x가 y보다 큰가? x > y < x가 y보다 작은가? x < y >= x가 y보다 크거나 같은가? x >= y <= x가 y보다 작거나 같은가? x <= y
사용예 1 == 2 // 1과 2가 같으므로 참 1 != 2 // 1와 2가 다르므로 참 1 == 2 // 1과 2가 같으므로 참 1 != 2 // 1와 2가 다르므로 참 1 <= 2 // 1이 2보다 작으므로 참 1 < 2 // 1이 2보다 작으므로 참 (1+2) == (1*2) // (1+2)가 (1*2)와 같지 않으므로 거짓 x >= y // x가 y보다 크거나 같으면 참 i == 10 // i가 10과 같으면 참 k > 3 // k가 3보다 크면 참 m != 6 // m과 6이 같지 않으면 참
예제
논리 연산자 여러 개의 조건을 조합하여 참과 거짓을 따지는 연산자 결과값은 참(1) 아니면 거짓(0) 연산자 기호 사용예 의미 && x && y AND 연산, x와 y가 모두 참이면 참, 그렇지 않으면 거짓 || x || y OR 연산, x나 y중에서 하나만 참이면 참, 모두 거짓이면 거짓 ! !x NOT 연산, x가 참이면 거짓, x가 거짓이면 참
윤년 예제
윤년 예제
우선 순위 수식에서 어떤 연산자를 먼저 계산할 것인지의 문제 우선 순위 연산자 결합 규칙 1 () [] -> . ++(후위) --(후위) ->(좌에서 우) 2 sizeof &(주소) ++(전위) --(전위) ~ ! *(역참조) +(부호) -(부호), 형변환 <-(우에서 좌) 3 *(곱셈) / % 4 +(덧셈) -(뺄셈) 5 << >> 6 < <= >= > 7 == != 8 &(비트연산) 9 ^ 10 | 11 && 12 || 13 ?(삼항) ->(우에서 좌) 14 = += *= /= %= &= ^= |= <<= >>= 15 ,(콤마) 표 5.4) 연산자의 우선순위
우선 순위의 일반적인 지침 콤마 < 대입 < 논리 < 관계 < 산술 < 단항 괄호 연산자는 가장 우선순위가 높다. 모든 단항 연산자들은 이항 연산자들보다 우선순위가 높다. 콤마 연산자를 제외하고는 대입 연산자가 가장 우선순위가 낮다. 연산자들의 우선 순위가 생각나지 않으면 괄호를 이용 ( x <= 10 ) && ( y >= 20 ) 관계 연산자나 논리 연산자는 산술 연산자보다 우선순위가 낮다. x + 2 == y + 3
결합 규칙 만약 같은 우선순위를 가지는 연산자들이 여러 개가 있으면 어떤 것을 먼저 수행하여야 하는가의 규칙
예제 #include <iostream> using namespace std; int main() { int x=0, y=0, z=0; cout << (2 > 3 || 6 > 7) << endl; cout << (2 || 3 && 3 > 2) << endl; cout << (x = y = z = 1) << endl; cout << (- ++x + y--) << endl; return 0; } 1 -1
중간 점검 문제 1. 관계 수식의 결과로 생성될 수 있는 값은 무엇인가? 2. (3 >= 2) + 5의 값은? 3. 다음의 조건에 해당하는 논리 연산식을 만들어 보시오. 변수는 적절하게 선언되어 있다고 가정한다. “무주택 기간 3년 이상, 가구주의 연령이 40세 이상, 가족의 수가 3명 이상” 4. 수식 !3의 값은? 5. 논리 연산자인 &&과 || 중에서 우선 순위가 더 높은 연산자는 무엇인가? 6. 단항 연산자와 이항 연산자 중에서 어떤 연산자가 더 우선 순위가 높은가?
Q & A
Programming 1. 상자의 체적을 구하는 프로그램을 작성하여 보자. #include <iostream> using namespace std; int main() { short height = 0, lenth = 0, width = 0; int cubage = 0; cout<<"상자의 높이를 입력하시오:"; cin>>height; cout<<"상자의 길이를 입력하시오:"; cin>>lenth; cout<<"상자의 너비를 입력하시오:"; cin>>width; cubage = height*lenth*width; cout<<"상자의 체적은 "<<cubage<<"입니다."<<endl; return 0; }
4. 시, 분, 초로 표현된 시간을 초 단위의 시간으로 변환하는 프로그램을 완성하라. #include <iostream> using namespace std; int main() { int hour = 0, min = 0, second = 0, result = 0; cout<<"시간을 입력하시오.(시):"; cin>>hour; cout<<"시간을 입력하시오.(분):"; cin>>min; cout<<"시간을 입력하시오.(초):"; cin>>second; result = cout<<hour<<"시간 "<<min<<"분 "<<second<<"초는 "<<result<<" 초입니다."<<endl; return 0; }
LAB 교과서 P. 39의 1번 문제를 읽고 물음에 답하라.