C++ Espresso 제 1 장기초사항
이번장에서학습할내용 C++ 언어의역사 C++ 언어의특징 객체지향의간단한소개 C++ 개발과정 첫번째예제설명 변수와상수 연산자 C++ 에대한기초적인사항들을살펴봅니다.
C++ 언어의개발 C++ 는 1980 년대초에 AT&T 벨연구소의 Bjarne Stroustrup 에의하여개발 C++ 는 C 언어를유지, 확장한것 C with Classes -> C++ C++ 는 C 언어에클래스개념을추가하고이어서가상함수, 연산자중복정의, 다중상속, 템플릿, 예외처리등이기능이차례로추가
C++ 의설계철학 엄격한타입검사, 범용언어, 효율적, 이식성 여러가지의프로그래밍스타일을지원 ( 절차지향프로그래밍, 데이터추상화, 객체지향프로그래밍, 일반화프로그래밍 ) 프로그래머가자유롭게선택할수있도록설계 최대한 C 와호환 플랫폼에의존적이거나일반적이지않은특징은제거
C++ 언어 하나의코드로여러가지의경우를처리 데이터와알고리즘을합친객체사용 순차적인알고리즘사용
절차적프로그래밍 절차적프로그래밍에서는데이터보다는알고리즘 ( 절차 ) 을중시
절차적프로그래밍의단점 무조건적인점프문장 -> 난해
구조화프로그래밍 무조건적인점프를없앴음 그러나여전히데이터와알고리즘은분리되어있음
객체지향프로그래밍 객체지향프로그래밍에서는데이터와알고리즘이묶여있음.
중간점검문제 1. Java 와 C# 는 C++ 와어떤관계가있을까? 2. C++ 언어가 C 언어의상위집합이라면 C 언어를반드시배워야할까?
객체지향이란? 실제세계를모델링하여소프트웨어를개발하는방법
객체지향의과정
객체지향의개념들 캡슐화 (encapsulation) 정보은닉 (information-hiding) 상속 (inheritance) 다형성 (polymorphism) 앞으로하나씩학습할것임.
Quiz (.): 데이터와알고리즘을하나의단위 ( 클래스 ) 로묶는것이다. (.): 데이터에대한불필요한접근을차단하여서데이터를보호 (.): 비슷한클래스가이미존재하고있다면그클래스를가져다가사용하는것 (.): 같은이름의함수나연산자를중복정의하여서상황에따라서가장적절한함수나연산자를프로그램이자동적으로선택 앞으로하나씩학습할것임.
객체지향의최종목표 최종목표 : 코드의재사용
중간점검문제 1. 객체지향프로그래밍은 들을조합하여서프로그램을작성하는기법이다. 2. 객체지향프로그래밍의시작은 년대에개발된 언어이다.
통합개발환경 통합개발환경 (IDE: integrated development environment): 에디터 + 컴파일러 + 디버거
통합개발환경의종류 비주얼 C++(Visual C++) 마이크로소프트사의제품 윈도우기반의거의모든형태의응용프로그램제작가능 최신버전 : 비주얼 C++ 2010 우리가사용할버전 : 비주얼 C++ 6.0 or 비주얼 C++ 2008
비주얼 C++ 실행 개발도구를사용할때의유용한정보를말해준다. 체크되어있으면다음번시작때도팁을보여준다. 다음팁을계속보려면우른다.
워크스페이스와프로젝트 워크스페이스 (workspace); 작업공간, 여러개의프로젝트가있을수있다. 프로젝트 (project): 하나의실행파일을만들기위하여필요한파일들의그룹 프로젝트 : 실행파일을만들기위하여필요한파일들 워크스페이스 : 여러개의프로젝트들을가지고있는작업공간
비주얼 C++ 시작하기
프로젝트생성하기
프로젝트생성하기 1 3 프로젝트이름을적어준다. 4 2 5 6 Win32 콘솔애플리케이션을선택한다. 프로젝트가저장되는폴더를지정한다.
프로젝트생성하기 1 비어있는프로젝트를만든다. simple application 을선택하면간단한 c++ 프로그램이작성되니주의! 2
소스파일생성하기
소스파일에프로그램작성
비주얼 C++ 의전체구조 워크스페이스와프로젝트에속하는파일을보여준다. 소스파일을에디팅하는윈도우. 컴파일과링크과정에서의메시지출력.
프로그램입력
컴파일하기
컴파일결과
오브젝트파일과실행파일의생성 오브젝트파일과실행파일이생성된것을확인할수있다.
프로그램실행하기
실행결과화면
중간점검문제 1. 새로운프로젝트를생성하고프로젝트에소스파일을추가하는메뉴는무엇인가? 2. 프로젝트에속하는소스파일을컴파일하여실행하는메뉴는무엇인가? 3. C++ 언어에서는대문자와소문자를구별하는가?
첫번째프로그램의분석
주석 주석 (comment): 프로그램에대한설명 // 첫번째예제프로그램 /* 한줄로된주석 */ 주석은프로그램을설명하는글입니다. int main() /* 줄의일부분인주석 */ /* 여러줄로된주석 */
헤더파일포함 #include <iostream> #include 는소스코드안에특정파일을현재의위치에포함 헤더파일 (header file): 컴파일러가필요로하는정보를가지고있는파일 iostream: 표준입출력스트림 주의!: 전처리기지시자문장끝에는세미콜론을붙이면안된다.
iostream 헤더파일
이름공간 using namespace std; using 은이름공간을지정하는지시어이다. 프로그램에서는많은이름들이사용되고이들이름들은효율성을위하여이름공간 (name space) 이라고하는몇개의영역으로구성되어있다. 이름공간 std 를사용한다는의미 Network Graphics int mode; message() int mode; message()
이름공간정의 형식 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 이름공간 ; using namespace Network; speed = 19200; // Network 이름공간안의 speed 를의미 send("this is a test"); // Network 이름공간안의 send() 를의미
함수 int main() 입력 함수 (function): 특정한작업을수행하기위하여작성된독립적인코드 main() 은가장먼저수행되는함수 함수 출력
함수의구조
문장 함수는여러개의문장으로이루어진다. 문장들은순차적으로실행된다.
출력객체 cout cout << Hello World! << endl; cout은컴파일러가제공하는객체로서출력을담당합니다. 큰따옴표안의문자열을화면에출력합니다. endl은문장의끝을나타내는기호 (\n로정의되어있다 ). Hello World!
함수반환문 return 0; return 은함수의결과값을외부로반환합니다. 운영체제 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; }
오류메시지의분석 에러가발견된소스파일명 return 앞에 ; 를빠뜨렸다는의미이다. Compiling... test.c c:\cprogram\test\test.c(7) : error C2143: syntax error : missing ';' before 'return' Error executing cl.exe. 에러가발견된라인의번호 문법적인오류 (syntax error) 가있었음을나타낸다.
중간점검문제 1. 주석이하는역할은무엇인가? 2. 주석을여러줄로하려면어떤스타일을사용하여야하는가? 3. #include 문은어떤동작을하는가?
변수 Q) 변수 (variable) 이란무엇인가? A) 프로그램에서일시적으로데이터를저장하는공간 Q) 변수는왜필요한가? A) 데이터가입력되면어딘가에저장해야만다음에사용할수있다.
변수 = 상자 변수는물건을저장하는상자와같다. int 데이터 변수의타입 변수의이름
변수와상수 변수 (variable): 저장된값의변경이가능한공간상수 (constant): 저장된값의변경이불가능한공간 ( 예 ) 3.14, 100, A, Hello World!
자료형 자료형 (data type): 데이터의타입 ( 종류 ) ( 예 ) 정수형, 실수형
자료형의종류 자료형설명바이트수범위 short short 형정수 2-32768~32767 부호있음 int 정수 4-2147483648~2147483647 정수형 long long 형정수 4-2147483648~2147483647 unsigned short 부호없는 short 형정수 2 0~65535 부호없음 unsigned int 부호없는정수 4 0~4294967295 unsigned long 부호없는 long 형정수 4 0~4294967295 문자형 부동소수점형 부호있음 char 문자및정수 1-128~127 부호없음 unsigned char 문자및부호없는정수 1 0~255 float 단일정밀도부동소수점 4 1.2E-38~3.4E38 double 두배정밀도부동소수점 8 2.2E-308~1.8E308 부울형 bool 참이나거짓을나타낸다. 1 true, false
Bool 형 논리형의변수는참또는거짓의값만을가질수있다. bool condition = true;
중간점검문제 1. 변수와상수의차이점은무엇인가? 2. 변수와자료형의관련성을설명하라. 3. C++ 가지원하는자료형들을메모리크기순으로나열하라.
변수의이름짓기 식별자 (identifier): 식별할수있게해주는이름 변수이름 함수이름 김영희 김철수
식별자를만드는규칙 알파벳문자와숫자, 밑줄문자 _ 로구성 첫번째문자는반드시알파벳또는밑줄문자 _ 대문자와소문자를구별 C 언어의키워드와똑같은이름은허용되지않는다. (Q) 다음은유효한식별자인가? sum _count king3 n_pictures 2nd_try O O O O X // 숫자로시작 Dollor# X // # 기호 double X // 키워드
키워드 키워드 (keyword): C++ 언어에서고유한의미를가지고있는특별한단어 예약어 (reserved words) 라고도한다. 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 C++ 언어의키워드 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; 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; 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; double f; cin >> f; return 0; } // 정수를읽어서 i 에저장 // 실수를읽어서 f 에저장
예제
중간점검문제 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 개 ++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로나눌때의나머지값 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) 와같지않으므로거짓 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,( 콤마 ) ->( 좌에서우 )
우선순위의일반적인지침 콤마 < 대입 < 논리 < 관계 < 산술 < 단항 괄호연산자는가장우선순위가높다. 모든단항연산자들은이항연산자들보다우선순위가높다. 콤마연산자를제외하고는대입연산자가가장우선순위가낮다. 연산자들의우선순위가생각나지않으면괄호를이용 ( 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; 0 1 1-1 } return 0;
중간점검문제 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 번문제를읽고물음에답하라.