SeoulTech 2011-2 nd 프로그래밍입문 (2) Chapter 1. C++ 기초 박종혁교수 (http://www.parkjonghyuk.net) Tel: 970-6702 Email: jhpark1@snut.ac.kr
Learning Objectives C++ 소개 기원, 객체지향프로그래밍, 용어 변수, 식및할당문 콘솔입 / 출력 프로그램스타일 라이브러리및네임스페이스 1-2
C++ 소개 C++ 언어의기원 저급언어 기계어, 어셈블리어 고급언어 C, C++, ADA, COBOL, FORTRAN C++ 언어를이용한객체지향프로그래밍 (Object Oriented Programming) C++ 용어 프로그램 (Programs) 과함수 (functions) cin 과 cout 을이용한기본입력 / 출력 (I/O) 1-3
디스플레이 1.1 C++ 프로그램예제 (1 of 2) 1-4
디스플레이 1.1 C++ 프로그램예제 (2 of 2) 1-5
C++ 변수 C++ 식별자 키워드 / 예약어 vs. 식별자 식별자의대소문자구분, 확실한분별이가능하게사용 의미있는이름을사용! 변수 프로그램을위한데이터가저장된메모리위치 프로그램의모든변수는사용되기전반드시선언되어야함 1-6
디스플레이 1.2 간단한데이터형 (1 of 2) 1-7
디스플레이 1.2 간단한데이터형 (2 of 2) 1-8
데이터할당 변수의선언과동시에초기화 초기화하지않은변수에는 정의되지않은 값 ( 쓰레기값 ) 이들어가있다 int myvalue = 0; 실행중데이터할당 Lvalues (left-side) & Rvalues (right-side) Lvalues 는반드시변수이어야함 Rvalues 는어떠한식도가능 예 : distance = rate * time; Lvalue: "distance" Rvalue: "rate * time" 1-9
데이터할당 : 축약표기 디스플레이, 14 페이지 1-10
데이터할당규칙 데이터할당의호환성 형불일치 일반규칙 : 하나의형의값은다른형의값으로저장할수없다 intvar = 2.99; // intvar 에 2 가할당됨! 정수부분만 일치, 따라서정수부만할당됨 묵시적 (implicit) 형변환 또는 자동형변환 이라한다 문자상수 ( 리터럴 :Literals) 2, 5.75, "Z", "Hello World" 상수 (constants) 로취급 : 프로그램에서변경불가 1-11
문자상수 (Literal) 데이터 문자상수 (literal) 예 : 2 5.75 "Z" "Hello World" // 문자상수 int // 문자상수 double // 문자상수 char // 문자상수 string 실행중값의변경이불가 문자상수 라고불리는이유는프로그램에서 문자그대로타이핑되기 때문이다 1-12
백슬래시문자상수 (Escape Sequences) 확장된 문자세트 백슬래쉬 \ 가문자앞에위치 백슬래쉬문자상수가들어온다는것을컴파일러에게알림 뒤에따라오는문자는 백슬래쉬문자상수의세트 ( 문자 ) 로인식됨 디스플레이 1.3 ( 다음슬라이드 ) 1-13
디스플레이 1.3 백슬래쉬문자상수의종류 (1 of 2) 1-14
디스플레이 1.3 백슬래쉬문자상수의종류 (2 of 2) 1-15
상수 상수이름짓기 문자상수 (Literal) 가상수이지만, 의미를내포하지는않는다 예를들어, 프로그램에서보이는 24 는표현하고자하는것이무엇인지나타나지않는다 명명된상수의사용 데이터를표현하는의미있는이름 const int NUMBER_OF_STUDENTS = 24; 선언된상수 또는 명명된상수 라고한다 이제, 프로그램에서필요로하는곳에서이름이사용된다 추가적인이득 : 프로그램의유지보수용이 ( 한번의수정으로결과의변경가능 명명부만고치면됨 ) 1-16
산술연산자 : 디스플레이 1.4 명명된상수 (1 of 2) 기본산술연산자 우선순위규칙 기본규칙 1-17
산술연산자 : 디스플레이 1.4 명명된상수 (2 of 2) 1-18
산술정밀도 연산의정밀도 매우중요한고려사항! C++ 에서수식은예측한대로계산되지않을수도있다! 최상위순위피연산자 가수행되는연산의 정밀도 를결정 일반적인함정! 1-19
산술정밀도의예 예 : C++ 에서 17 / 5 는 3 으로계산! 두개의피연산자는 integer 형 Integer 형정밀도로나눗셈연산수행! C++ 에서 17.0 / 5 는 3.4 와같다! 최상위순위피연산자는 double 형 double 형정밀도로나눗셈연산수행! int intvar1 =1, intvar2=2; intvar1 / intvar2; Integer 형정밀도로나눗셈연산수행! 결과 : 0! 1-20
부분적인산술정밀도 연산은 하나씩 수행된다 1 / 2 / 3.0 / 4 는 3 개의부분연산이수행된다 첫번째 1 / 2 equals 0 두번째 0 / 3.0 equals 0.0 세번째 0.0 / 4 equals 0.0! 복잡한식에서하나의피연산자를수정하는것으로는충분하지않다 연산이수행되는동안모든부분연산이고려되어야한다! 1-21
형변환 (Type Casting) 변수의형변환 문자상수 (literal) 은.0 을추가하여정확한연산을강제할수있지만변수는? myint.0 을사용할수는없다! static_cast<double>intvar 명시적으로 intvar 를 double 형으로변환 ( casts 또는 converts 변환의결과는다음에사용된다 예제식 : doublevar = static_cast<double>intvar1 / intvar2; 강제적인변환으로두정수형변수사이에 double 형정밀도의나눗셈이발생한다! 1-22
형변환 (Type Casting) 두가지형태 묵시적 (Implicit) 형변환 또는자동 ( Automatic ) 자동적으로실행 17 / 5.5 이식은묵시적형변환이발생하여 17 17.0 으로변환 명시적 (Explicit) 형변환 프로그래머가변환연산자를이용하여변환을명기 (double)17 / 5.5 위의식과같은식이지만, 명시적형변환을사용 (double)myint / mydouble 더욱일반적인사용 ; 변수에변환연산자가사용됨 1-23
축약연산자 (Shorthand Operators) 증가 & 감소연산자 적절한축약표현 증가연산자, ++ intvar++; 다음의식과같다 intvar = intvar + 1; 감소연산자, -- intvar--; 다음의식과같다 intvar = intvar 1; 1-24
축약연산자 (Shorthand Operators): 두가지형태 사후증가 (Post-Increment) intvar++ 현재변수의값을사용한후, 변수의값이증가됨 사전증가 (Pre-Increment) ++intvar 변수의값이먼저증가하고, 변경된값이사용됨 현재사용되는값이무엇인가에따라결정 단독으로사용되면두표현의차이는없다 : intvar++; 와 ++intvar; 동일한결과 1-25
사후증가 사후증가의예 : int n = 2, valueproduced; valueproduced = 2 * (n++); cout << valueproduced << endl; cout << n << endl; 이코드부분은다음의결과를출력 : 4 3 사후증가가사용됨 1-26
사전증가 사전증가의예 : int n = 2, valueproduced; valueproduced = 2 * (++n); cout << valueproduced << endl; cout << n << endl; 이코드부분은다음의결과를출력 : 6 3 사전증가가사용됨 1-27
콘솔입 / 출력 입출력 (I/O) 객체 : cin, cout, cerr <iostream> 이라불리는 C++ 라이브러리에정의되어있다 전처리기지시자 (processor directives) 라불리는라인이파일의시작부에명기되어야함 : #include <iostream> using namespace std; C++ 에게적합한라이브러리를사용한다고알려서 I/O 객체인 cin, cout, cerr 을사용한다 1-28
콘솔출력 출력가능한것이무엇인가? 어떠한데이터도디스플레이스크린에출력가능 변수 상수 문자상수 (Literals) 수식 ( 위의모두를포함가능 ) cout << numberofgames << " games played."; 두가지값이출력 : 변수 numberofgames 의값과, 문자상수문자열 games played. 출력 Cascading: 하나의 cout 으로다양한값을출력 1-29
새로운라인에서의출력 출력에서의줄바꿈 상기 : "\n" 은 줄바꿈 문자를나타내는백슬래쉬문자상수 (escape sequence) 두번째방법 : endl 객체 예 : cout << "Hello World\n"; 디스플레이에문자열 Hello World 를보내고, 백슬래쉬문자상수 \n 에서다음라인으로줄바꿈 cout << "Hello World" << endl; 위와동일한결과 1-30
출력형식 숫자값의출력형식 값이프로그래머의의도대로출력되지않을수도있다! cout << "The price is $" << price << endl; 변수 price 의값이 78.5 이면다음과같은형태로출력 : The price is $78.500000 또는 : The price is $78.5 프로그래머는 C++ 에게어떻게숫자를출력할것인가를명시적으로알려줘야한다! 1-31
숫자의형식 Magic Formula 를이용하여소수점의크기를결정 : cout.setf(ios::fixed); cout.setf(ios::showpoint); cout.precision(2); 이들표현으로값을원하는대로출력가능 : 정확하게소수점이후두자리까지출력 예 : cout << "The price is $" << price << endl; 이에따른결과 : The price is $78.50 정밀도를프로그래머의의지대로수정가능! 1-32
오류 (error) 출력 cerr 을이용한출력 cerr 은 cout 과동일하게동작 일반출력과오류출력을구분하는매커니즘을제공 출력스트림의재지정 대부분의시스템은 cout 과 cerr 출력문을파일과같은다른장치로 재지정 할수있도록허용 예 : line printer, output file, error console 등 1-33
cin 을이용한입력 cin 은입력, cout 은출력에사용 차이점 : >> ( 추출연산자 :extraction operator) 방향이반대 데이터가가는방향 을가리킨다고생각 cout 대신 cin 을사용 cin 에서문자상수입력은허용하지않음 변수만입력해야한다 cin >> num; 키보드에서스크린상에입력될때까지대기 키보드에서입력된값은 num 변수에 할당 됨 1-34
입력을위한프롬프트 : cin 과 cout 사용자입력을위해항상 대기 cout << "Enter number of dragons: "; cin >> numofdragons; cout 에 \n 이없다. 프롬프트는다음과같이같은라인에서사용자의입력에대기한다 : Enter number of dragons: 키보드입력의위치는배경위의밑줄에만들어진다 모든 cin 은 cout 프롬프트를가져야한다 사용자친화적인 input/output 1-35
프로그램스타일 기본정책 : 프로그램을쉽게읽고수정할수있도록작성해야한다 주석, 두가지방법 : // 두슬래쉬가표시되는하나의라인전체가무시된다 /* 주석기호표시사이의모든라인이무시된다 */ 두가지방법모두일반적으로사용된다 식별자명명 상수 : ALL_CAPS 변수 : lowertoupper 가장중요한점 : 의미있는이름! 1-36
라이브러리 C++ 표준라이브러리 #include <Library_Name> 현재의프로그램에라이브러리파일의내용을 추가 하는지시자 전처리기지시자 (preprocessor directive) 컴파일러가실행되기전, 라이브러리의파일을현재의프로그램에 복사 C++ 많은라이브러리가포함되어있다 Input/output, math, strings, etc. 1-37
네임스페이스 (Namespaces) 네임스페이스의정의 : 정의된이름의집합 현재 : std 네임스페이스에만초점을둔다 필요로하는모든표준라이브러리정의를가지고있음 예 : #include <iostream> using namespace std; 정의된이름의모든표준라이브러리를포함 #include <iostream> using std::cin; using std::cout; 원하는객체만선택할수있다 1-38
요약 1 C++ 은대소문자를구분 의미있는이름을사용 변수와상수에대하여 변수는사용되기전반드시선언되어야함 또한초기화되어야한다 숫자의사용에있어서주의할점 정밀도, 괄호, 연산우선순위등 #include 를사용하여필요할때 C++ 라이브러리를사용 1-39
요약 2 cout 객체 콘솔출력에사용 cin 객체 콘솔입력에사용 cerr 객체 오류메시지출력에사용 주석을사용하는목적은프로그램의이해를돕는것 남용하지말것 1-40
Q&A 1-41