타입, 연산자 Chapter 5, 6 Kum Deuk Kyu , Ph. D. Spring 2015 PMP, CISA, ISO 9001 Auditor Dept. of Computer Software DongSeoul University dkkum@hanmail.net, dkkum73@gmail.com
Contents 복습 예제 응용 예제 타입(2) 연산자(1)
복습 예제(1/2) 이것만은 알고 갑시다. 1. 아래 괄호를 채워보자. 마지막 두 개의 괄호는 '있다', '없다' 중에서 고르자. C++에서 모든 정보는 ( 숫자 )로 표현한다. ( 변수 )는 숫자를 보관할 수 있는 공간(방)이다. ( cout ) 객체를 사용해서 변수의 값을 화면에 출력할 수 있다. 변수의 값을 다른 변수에 대입할 수 ( 있다 ) 같은 이름의 변수가 두 개 존재할 수 ( 없다 ) 2. 아래 변수 이름 중에서 올바르지 않은 이름을 찾아보자.. 25th_birthday : x 숫자가 앞에있음 my first variable : x 띄어쓰기 안됨 I o error! : x 특수문자는 대부분 안됨 _만 되는듯 volatile : x 키워드라 안됨 Int3 o I_like_a_very_long_variable_because_it_is_very_clear o Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
복습 예제(2/2) 3. 소스 코드와 그 실행결과를 보여주려고 한다. 아래 빈 항목을 채워 소스 코드를 완성해 주길 바란다! #include [ <iostream> ] using namespace std; int main() { int a = 1, b = 2, c = 3, d = 4, e = 5; [ cout << a << “\n” << a << b << “\n” << a << b << c << “\n” << a << b << c << d << “\n” << a << b << c << d << e ]; return 0; } 실행결과 1 12 123 1234 12345 Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
응용 예제 3-1(1/2) 변수의 범위(scope)와 생명주기 변수가 선언되고 이용되고, 소멸되는 과정을 말한다. 선언된 변수가 유효한 범위를 말한다. 블록 안에서 선언된 변수는 블록 안에서만 유효하다. 중첩된 블록 안에서 선언된 변수는 하위 블록 (좀더 안쪽에 선언된 블록)들에서도 유효하다. 소멸자를 호출하거나 인위적으로 변수를 해제하지 않는 이상, 먼저 생성된 변수가 나중에 소멸된다. 기존에 존재하는 변수와 동일한 이름의 변수를 선언하면, 나중에 선언된 변수가 기존의 변수보다 우선한다. Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
응용 예제 3-1(2/2) 01 #include<iostream.h> 02 03 void main() 04 { 05 06 int [ ① ] = 1; 07 { 08 09 char [ ② ] = 'a'; 10 { 11 12 cout << "var = " << var << '\n'; 13 } 14 cout << "var = " << var << '\n'; 15 } 16 cout << "var = " << var << '\n'; 17 } var var Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
타입(2)
실수 타입(Floating points) 실수 타입 별로 보관할 수 있는 값의 범위 float 타입 상수의 표현 타입 최소값 최대값 크기(bytes) float 1.17549E-38 3.40282E+38 4 double 2.22507E-308 1.79769E+308 8 long double float f = 0.00123f; // 실수 뒤에 f를 붙인다. double d = 1.23; long double ld = 123.0; Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
실수 뒤에 f가 붙어있지 않으면 double 타입으로 인식 부동 소수점 정수와 구분하기 위해 소수점 사용 5.5, 8.3, -12.6 실수 타입의 사용예제 (예제 5-4, p81) int main() { // 실수 타입 변수 정의 float f; double d; long double ld; // 변수에 실수 값을 대입 - 1 f = 0.00123f; d = 1.23; ld = 123.0; // 변수에 실수 값을 대입 - 2 f = 1.23E-3f; d = 1.23E0; ld = 1.23E2; return 0; } 실수 뒤에 f가 붙어있지 않으면 double 타입으로 인식 Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
부동 소수점 방식의 이해 부동 소수점 방식은 실수를 가수와 지수부분으로 나누어 보관 Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
*문자 타입은 256개의 상태가 각각 문자를 의미한다고 해석할 수 있다!! 문자 타입(Characters) char 형 하나의 문자를 나타냄 char variable; // comment 문자 단일 인용부호(‘)로 감싸짐 문자 상수 : ‘A’, ‘a’, ‘!’ 문자 타입도 결국은 숫자를 보관한다. *문자 타입은 256개의 상태가 각각 문자를 의미한다고 해석할 수 있다!! Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
문자 타입의 사용 아스키 코드 값 확인 (예제 5-6, p85) #include <iostream> using namespace std; int main() { // 'A'의 아스키 코드 값 확인 int a = 'A'; cout << a << "\n"; // 65를 문자로 표현하면? char b = 65; cout << b << "\n"; return 0; } int a = 'A'; 문자를 정수 타입에 대입 char b = 65; 정수를 문자 타입에 대입 Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
이스케이프 문자열(Escape Sequences) 타입 아스키 코드 상에서의 표현 C++에서의 표현 개행 문자 NL(LF) \n 수평탭 HT \t 수직탭 VT \v 백스페이스 BS \b 캐리지 리턴 CR \r 폼피드 FF \f 벨소리 BEL \a 역슬래쉬 \ \\ 작은 따옴표 ‘ \’ 큰따옴표 “ \” 8진수 ooo \ooo 16진수 hhh \xhhh Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
이스케이프 문자열의 사용 아스키 코드 값 확인 (예제 5-7, p88) #include <iostream> using namespace std; int main() { // Hello, World!를 쓰려다 실수했음 cout << "Hello, Works"; // 백스페이스로 뒤에 두 글자를 지운다. cout << "\b\b"; // Hello, World!를 마무리한다. cout << "ld!\n"; return 0; } Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
부울 타입 (Boolean) 부울 타입은 true 혹은 false의 값을 갖는다. #include <iostream> using namespace std; int main() { bool b1; bool b2; b1 = true; b2 = false; cout << “b1 = “ << b1 << “\n”; cout << “b2 = “ << b2 << “\n”; } *어떻게 출력될까요? Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
형변환 (Type Conversion) 암시적(Explicit) / 명시적(Implicit) 형 변환 특별히 명시해주지 않았지만, 서로 다른 형의 값 혹은 변수 간의 차이 때문에 자동적으로 일어나게 되는 형 변환을 말한다. 쉽게 암시적 형 변환의 반대라고 생각하면 되겠다. 즉, 명시적 형 변환은 우리가 그 형을 의도적으로 명시해 줌으로써, 형 변환을 수행하게 하는 것이다. 명시적 Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
암시적 형변환 (Implicit Type Conversion) 암시적 형변환은 변수를 대입하는 과정에서 자동적으로 발생하는 형변환이다. 이 때 값이 변할 수 있는데, 다음의 경우는 그 결과를 예상할 수 있는 경우이다. 실수 타입에서 정수 타입으로 형변환 발생 시 소수점 이하 부분이 잘린다. (반올림 아님) 모든 타입에서 부울 타입으로 형변환 발생시, 0이 아닌 모든 값은 true로, 0은 false로 바뀐다. 다음의 경우는 그 결과를 예상할 수 없는 경우이다. 큰 범위를 갖는 타입에서 작은 범위를 갖는 타입으로 형변환 발생시 예) int -> unsigned short double -> float float -> short int -> float Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
형변환의 규칙(1/2) 기본 타입간의 형변환 (예제 5-9, p93) #include <iostream> using namespace std; int main() { // 다양한 타입의 변수를 정의한다. int i = 65; float f = 66.89f; char c = 'C'; bool b = true; // 형변환에 사용할 변수들을 미리 정의해둔다. // (이렇게 하는 것이 더욱 간결한 경우가 있다) int f2i, c2i, b2i; float i2f, c2f, b2f; char i2c, f2c, b2c; bool i2b, f2b, c2b; // int 을 다른 타입으로 i2f = i; // int -> float i2c = i; // int -> char i2b = i; // int -> bool … Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
형변환의 규칙(2/2) 기본 타입간의 형변환 (예제 5-9, p93) // float 를 다른 타입으로 f2i = f; // float -> int f2c = f; // float -> char f2b = f; // float -> bool // char 를 다른 타입으로 c2i = c; // char -> int c2f = c; // char -> float c2b = c; // char -> bool // bool 을 다른 타입으로 b2i = b; // bool -> int b2f = b; // bool -> float b2c = b; // bool -> char // 결과 출력 cout << "int : " << i << "\n\tto float : " << i2f << "\n\tto char : " << i2c << "\n\tto bool : " << i2b << "\n\n"; cout << "float : " << f << "\n\tto int : " << f2i << "\n\tto char : " << f2c << "\n\tto bool : " << f2b << "\n\n"; cout << "char : " << c << "\n\tto int : " << c2i << "\n\tto float : " << c2f << "\n\tto bool : " << c2b << "\n\n"; cout << "bool : " << b << "\n\tto int : " << b2i << "\n\tto float : " << b2f << "\n\tto char : " << b2c << "\n\n"; return 0; } Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
*실수 타입이 짧은 정수 타입으로 변환 시 값이 변질된다!! 문제가 발생하는 형변환 문제가 생기는 형변환 (예제 5-10, p96) #include <iostream> using namespace std; int main() { // 정수타입간의 형변환 int i = 131071; unsigned short i2us = i; // int -> unsigned short short i2s = i; // int -> short // 실수타입간의 형변환 double d = 12345678901234.56789; float d2f = d; // double -> float // 실수타입에서 정수타입으로 형변환 float f = 76543.21f; short f2s = f; // float -> short // 정수타입에서 실수타입으로 형변환 int big_i = 1234567890; float i2f = big_i; // int -> float // 결과 출력 cout << fixed; cout << "int : " << i << "\n\tto unsigned short : " << i2us << "\n\tto short : " << i2s << "\n\n"; cout << "double : " << d << "\n\tto float : " << d2f << "\n\n"; cout << "float : " << f << "\n\tto short : " << f2s << "\n\n"; cout << "int : " << big_i << "\n\tto float : " << i2f << "\n\n"; return 0; } *실수 타입이 짧은 정수 타입으로 변환 시 값이 변질된다!! Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
명시적 형변환 (Explicit Type Conversion) 명시적 형변환은 개발자가 직접 명령하는 형변환이다. 명시적 형변환을 사용해서 개발자의 의도를 명확히 할 수 있다. 컴파일러의 경고(Warning) 메시지를 막을 수 있다. 다른 개발자들에게 본인의 의도를 알릴 수 있다. 뒤에서 함수와 클래스를 배운 후에는 다음의 용도로 사용할 수 있다. 함수 호출 시에 인자를 명시적으로 형변환해서 넘겨준다. 부모 클래스의 포인터를 자식 클래스의 포인터로 다운캐스팅한다. float f = 66.89f; int i = (int)f; // i는 66 이 된다. Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
*명시적인 형변환 시에는 임시 변수가 수반된다!! 명시적 형 변환의 사용 명시적인 형변환 (예제 5-11, p98) #include <iostream> using namespace std; int main() { // 다양한 타입의 변수 정의 int i = 65; float f = 66.89f; char c = 'C'; // 명시적으로 형변환한다 cout << "int i = " << i << "\n"; cout << "(char)i= " << (char)i << "\n"; cout << "(bool)i= " << (bool)i << "\n\n"; cout << "float f = " << f << "\n"; cout << "(int)f = " << (int)f<< "\n\n"; cout << "char c = " << c << "\n"; cout << "(int)c= " << (int)c<< "\n"; } *명시적인 형변환 시에는 임시 변수가 수반된다!! Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
명시적 형 변환의 사용 2(응용 예제3-2) 01 #include<iostream> 02 using namespace std; 03 void main() 04 { 05 int salt = 30; 06 int water = 40; 07 float concentration = 0; 08 float real_concentration = 0; 09 10 concentration = (30 / 40) * 100; 11 cout << "Weight percent = " << concentration << " %\n"; 12 13 real_concentration = (float)30 / (float)40 * 100; 14 cout << "Real Weight percent = " << real_concentration << " %\n"; 15 } 명시적 형 변환 없이 정수 연산을 한다. 명시적 형 변환 후, 연산을 한다. Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
연산자(1)
연산자란 연산자란 변수를 원하는 대로 가공하는 도구이다.하는 기본 타입들 변수를 값이 들어있는 상자라고 생각한다면, 연산자는 그 상자 안의 값을 가공하는 도구이다. Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
연산자의 종류 연산자란 변수를 원하는 대로 가공하는 도구이다.하는 기본 타입들 기본 연산자 관계 연산자 비트 관련 연산자 기타 연산자 Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
사칙 연산 사칙 연산 및 나머지 연산의 예 int a = 8; int b = 4; int c = a + b; int d = a – b; int e = a * b; int f = a / b; int g = a % b; cout << “8 + 4 = “ << c << “\n”; cout << “8 - 4 = “ << d << “\n”; cout << “8 * 4 = “ << e << “\n”; cout << “8 / 4 = “ << f << “\n”; cout << “8 % 4 = “ << g << “\n”; Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
연산자 사용의 규칙 연산자는 정해진 개수(1, 2, 3)의 피연산자를 받아서 하나의 값을 반환한다. 위의 규칙은 연쇄적으로 적용된다. 연산의 결과값은 다른 연산의 피연산자로 사용될 수 있다. Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
대입 연산자 (Assignment Operators) 우측 피연산자의 값을 좌측에 대입한다. 대입 연산자도 연쇄적으로 사용할 수 있다. Fire at a Research Center Engineer Physicist Mathematics S/W Engineer
관계 연산자 (Relational Operators) #include <iostream> using namespace std; int main() { // 피연산자를 정의한다. int a = 3; int b = 5; // 관계 연산자의 사용 bool b1, b2, b3, b4, b5, b6; b1 = a > b; // a가 b보다 크다 b2 = a >= b; // a가 b보다 크거나 같다 b3 = a < b; // a가 b보다 작다 b4 = a <= b; // a가 b보다 작거나 같다 b5 = a == b; // a와 b가 같다 b6 = a != b; // a와 b가 같지 않다 // bool 타입의 값을 문자로 출력하게 만든다. cout << boolalpha; // 결과를 출력 cout << a << " > " << b << " --> " << b1 << "\n"; cout << a << " >= " << b << " --> " << b2 << "\n"; cout << a << " < " << b << " --> " << b3 << "\n"; cout << a << " <= " << b << " --> " << b4 << "\n"; cout << a << " == " << b << " --> " << b5 << "\n"; cout << a << " != " << b << " --> " << b6 << "\n"; return 0; } Fire at a Research Center Engineer Physicist Mathematics S/W Engineer *관계 연산자의 결과값은 bool 타입 즉, true 아니면 false다!!
Kum Deuk Kyu Mobile 010-5334-2448 dkkum@hanmail.net, dkkum73@gmail.com Q & A Thank You ! 여러분은 누구보다 위대하고 존귀한 존재이며, 사랑하는 하나님의 자녀입니다. 학업이나 진로, 개인적인 상담을 원하시는 분은 아래 연락처로 연락주세요..^^ Kum Deuk Kyu Mobile 010-5334-2448 dkkum@hanmail.net, dkkum73@gmail.com