Section 01. C++에서 정보를 다루는 법
정보란 무엇인가
C++ 프로그래밍에 있어서 모든 정보는 근본적으로 숫자다
모든 정보가 C++세상에서는 숫자의 형태로 다루어지게 되므로 정보를 보관하는 방법이란
숫자를 보관하는 방법을 말한다
변수의 정의
변수는 숫자를 보관할 수 있는 공간이나 방을 의미하는 개념이다.
예제 4-1 변수의 정의와 사용
int main() { // 3개의 변수를 정의 int a; int b; int c;
// 각 변수에 100, 200, 300값을 넣는다. a = 100; b = 200; c = 300;
return 0; } |
주석
슬래쉬 두 개 (//)로 시작되는 문장을 주석 이라고 부른다
주석의 용도는 코드에 대한 설명을 넣는 것이다
주석은 사람이 보기 위한 것이지 컴퓨터가 보기 위한 것이 아니다.
예제 4-2 변수의 정의를 제거
int main () { // 각 변수에 100, 200, 300값을 넣는다. a = 100; b = 200; c = 300;
return 0; } |
변수의 정의를 제거해서 발생하는 오류 메시지
정의 되지 않은 변수를 사용하는 것은 불가능하다
예제 4-3 변수를 정의하는 코드와 사용하는 코드의 위치를 바꿈
int main () { // 각 변수에 100, 200, 300값을 넣는다. a = 100; b = 200; c = 300;
// 3개의 변수를 정의 int a; int b; int c;
return 0; } |
코드의 위치를 바꿨을 때 발생하는 오류 메시지
-
변수를 사용하기 전에 정의해야 한다
예제4-4 변수에 보관된 값 출력
#include <iostream> using namespace std;
int main () { // 3개의 변수를 정의 int a; int b; int c;
// 각 변수에 100, 200, 300값을 넣는다. a = 100; b = 200; c = 300;
// 화면에 출력한다. cout << a << b << c;
return 0; } |
변수에 보관된 값 출력 화면
변수의 정의, 그 다양한 모습
예제 4-5 변수의 초기화
#include <iostream> using namespace std;
int main () { // 3개의 변수를 정의함과 동시에 초기화 int a = 100; int b = 200; int c = 300;
// 화면에 출력한다. cout << a << ", " << b << ", " << c << "\n "; return 0; } |
\n 은 한 칸 아래로 내려서 문자열을 출력하게 만든다.
여러분의 컴퓨터에서는 \n처럼 보일 수 있는데, 원래 한글 환경에서는 역슬래쉬를 \으로 표시하는 경우가 많다.
변수에 값을 넣고 빼기
a = 100;
a와 100이 같다는 뜻이 아니고 a가 100이 되게 만들라는 뜻이다.
예제 4-6 변수간의 대입
#include <iostream> using namespace std;
int main () { // 두 개의 변수 정의 및 초기화 int d = 1000, e = 2000;
//변수의 값 확인 cout << "d = " << d << " , e = " << e << "\n";
//e의 값을 읽어서 d로 복사 d = e;
// 변수의 값 확인 cout << "d = " << d << ", e = " << e << "\n";
return 0; } |
변수간의 대입 출력 화면
연습문제
변수 d를 추가하고 400을 넣자 그리고 변수 d의 값을 화면에 출력하자
변수 f를 추가하고 3000을 넣자. 다시 변수 d의 값을 변수 f에 넣고 화면에 출력하자
Section 02 변수를 사용하는 규칙
반드시 지켜야 할 규칙
예제4-7 합법적인 변수의 이름
int main () { // 동일한 이름의 변수에 대한 실험 int duplicated; // 올바름 int duplicated; // 오류: 이미 정의된 변수 이름 사용 불가능
// 변수의 이름으로 사용할 수 있는 문자에 대한 실험 int abcDE; //올바름: 알파벳 기능 int _abc_de; //올바름: 알파벳과 언더스코어(_) 기능 int abc123; //올바름: 알파벳과 숫자 가능 int _123abc; //올바름: 알파벳, 숫자, 언더스코어(_) 가능 int abc@!~; //오류: 언더스코어(_)를 제외한 기호는 포함 불가능 int 123abc; //오류: 숫자가 맨 앞에 위치하는 것 불가능
// 변수 이름의 길이 제한 실험 int abcdefghijklmnopqrstuvwxyz1abcdefghijklmnopqrstuvwxyz1 abcdefghijklmnopqrstuvwxyz3;
//알파벳의 대소문자와 관련된 실험 int Abc; //올바름: 중복되지 않음 int aBc; //올바름: 중복되지 않음 int abC; //올바름: 중복되지 않음 int ABc; //올바름: 중복되지 않음 int AbC; //올바름: 중복되지 않음 int aBC; //올바름: 중복되지 않음
// 키워드와 중복되는 경우 실험 int namespace; //오류: 키워드를 변수 이름으로 사용 불가능 } |
'// 오류' 라고 주석 처리된 발생
C++ 의 규칙
*중복된 이름의 변수를 사용할 수 없다.
*변수 이름에는 알파벳, 숫자, 언더스코어(_)만 포함할 수 있다.
*단, 숫자는 변수 이름의 첫번째 글자로 사용할 수 없다.
*변수 이름의 길이에는 제한이 없다.
*변수 이름에 포함하는 알파벳은 대소문자를 구분한다.
*키워드는 변수의 이름으로 사용할 수 없다.
C++ 키워드
asm |
do |
If |
Return |
typedef |
Auto |
Double |
Inline |
Short |
typeid |
Bool |
Dynamic_cast |
Nt |
Signed |
Typename |
Break |
Else |
Long |
sizeof |
Union |
Case |
Enum |
Mutable |
Static |
Unsigned |
Catch |
Explicit |
Namespace |
Static_cast |
Using |
Char |
Export |
New |
Struct |
Virtual |
Class |
Extern |
Operator |
Switch |
Void |
Const |
False |
Private |
Template |
Volatile |
Const_cast |
Float |
Protected |
this |
Wchar_t |
Continue |
For |
Public |
Throw |
While |
Default |
Friend |
Register |
True |
|
delete |
Goto |
Reinterpret_cast |
try |
변수의 이름 잘 짓는 법
*변수의 용도를 예상할 수 있게 이름을 짓자
변수의 용도를 예상할 수 있게 이름을 짓게 되면 소스 코드는 한결 이해하기 쉬워진다.
*단어와 단어를 구분할 수 있게 짓자
*필요 없이 긴 이름은 피하자
지나치게 상세한 이름을 짓는 것은 오히려 피해야 한다.
변수를 언제 정의하는 것이 좋을까
변수의 정의는 변수를 사용하기 전에만 하면 된다.
예제 4-8 함수의 앞에서 변수를 정의하는 경우
int main() { // 변수의 정의 int a , b;
// 숫자 대입 a + 100;
// 이 곳에 아주 많은 코드가 있다고 가정하자. // 코드, 코드, 코드, 코드 ...
// a의 값을 b에 대입 b = a;
return 0; } |
예제 4-9 변수를 사용하기 직전에 정의하는 경우
int main() { // 변수의 정의 int a;
// 숫자 대입 a = 100;
// 이곳에 아주 많은 코드가 있다고 가정하자. // 코드, 코드, 코드, 코드 ...
// 변수의 정의2 int b;
// a의 값을 b에 대입 b = a;
return 0; } |
사용하기 직전에 변수를 정의하는 것이 좋다
성적표 프로그램
#include <iostream> using namespace std;
int main() { // 개인 정보를 보관한다. int class_number = 5; // 반 int student_number = 45; // 번호
// 국어, 영어, 수학 점수를 보관한다. int korean_score = 90; // 국어 점수 int english_score = 100; // 영어 점수 int math_score = 80; // 수학 점수
// 총점과 평균을 보관한다. int total_score = 270; // 총점 int average = 90; // 평균
// 성적표를 출력한다. cout << "반 번호 국어 영어 수학 총점 평균\n"; cout << class_number << " " << student_number << " " << korean_score << " " << english_score << " " << math_score << " " << total_score << " " << average << "\n";
return 0; } |
성적표 프로그램
Chapter 05 타입1 – 정보의 종류
Section 01 C++에서 제공하는 타입
왜 여러 가지 타입을 배워야 할까
타입이란 변수가 보관할 수 있는 값의 종류를 의미한다. C++에서는 변수를 정의할 때 변수의 타입을 함께 명시해야 한다.
01 int a;
여기서 int가 변수의 타입을 의미한다. int는 정수(integer)의 준말
C++에서 제공하는 타입이란 기본적인 정수, 실수, 문자 타입에 이것 저것 옵션을 달아서 확장한 것 밖에 되지 않는다. 하나씩 배워보면 정말로 쉽다
다양한 종류의 int 타입
Int 는 signed int 와 같은 의미다
예제5-1 6가지 정수 타입의 범위 실험
int main() { // 변수의 정의 short int si; // short int 타입 unsigned short int usi; // unsigned short int 타입 int i; // int 타입(그 동안 사용하던 타입) unsigned int ui; // unsigned int 타입 long int li; // long int 타입 unsigned long ul; // unsigned long 타입
// 작은 값을 대입 si = 40000; // ERROR: short int에게는 너무 큰 값 usi = 40000; // OK: unsigned short int는 아직 괜찮다 i = 40000; // OK ui = 40000; // OK li = 40000; // OK ul = 40000; // ok
// 조금 더 큰 값을 대입 si = 70000; // ERROR: short int 에게는 너무 큰 값 usi = 70000; // ERROR: unsigned short int에게도 너무 큰 값 li = 70000; // OK usi = 70000; // OK li = 70000; // OK ul = 70000; // OK
// 더 큰 값을 대입 si = 2200000000; // ERROR: short int에게는 너무 큰 값 i = 2200000000; // ERROR: int에게는 너무 큰 값 li = 2200000000; // ERROR: long int에게는 너무 큰 값 usi = 2200000000; // ERROR: unsigned short int에게는 너무 큰 값 ui = 2200000000; // OK ul = 2200000000; // OK
// unsigned 와 unsigned long int의 한계는 어디? ui = 4300000000; // ERROR: unsigned int에게도 너무 큰값 ul = 4300000000; // ERROR: unsigned long int에게도 너무 큰 값
// 음수를 대입 si = -100; // OK usi = -100; // ERROR: unsigned short int는 음수 보관 불가능 i = -100; // OK ui = -100; // ERROR: unsigned int는 음수 보관 불가능 li = -100; // OK ul = -100; // ERROR: unsigned long int는 음수 보관 불가능
return 0; } |
어느 타입을 사용할 지에 대한 가이드라인
* 보관하려는 값이 short int 타입의 변수에 들어갈 수 있다면 short int를 사용하라
* 만약 더 큰 수고 음수가 아니라면 unsigned short int를 고려해보자
* 그것도 모자라다면 int나 long int를 사용하자
* 정수를 담을 때는 int를 사용하자
* 보관하려는 값이 절대로 음수가 될 일이 없다면 unsigned int를 사용하자
예제 5-2 타입의 크기를 알아보는 방법
#include <iostream> using namespace std;
int main() { cout << "short int : " << sizeof(short int) << "bytes\n"; cout << "unsigned short int : " << sizeof(unsigned short int)<< " bytes\n"; cout << "int : " << sizeof(int) << "bytes\n"; cout << "unsigned int : " << sizeof(unsigned int) << "bytes\n"; cout << "long int : " << sizeof(long int) << "bytes\n"; cout << "unsigned long int : " << sizeof(unsigned long int) << "bytes\n"; return 0; } |
10진수, 8진수, 16진수의 표현
8진수나 16진수로 숫자를 적을 때는 숫자 앞에 공백 없이 0 혹은 0x를 붙여주면 된다(영문자O 가 아닌 숫자 0이다)
예제 5-3 10, 8, 16진수의 사용
# include <iostream> using namespace std;
int main() { // 각각 10, 8, 16진법을 사용한다. int decimal = 41; // 10진수 int octal = 041; // 8진수 int hexadecimal = 0x41; // 16진수
// 출력 cout << "41 =" << decimal << "\n"; cout << "041 =" << octal << "\n"; cout << 0x41 =" << hexadecimal << "\n";
return 0; } |
실수 타입
실수를 보관할 수 있는 타입(float, double, long double)을 보통 부동 소수점 타입이라고 말한다
예제 5-4 실수 타입의 사용
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; } |
C++에서는 실수 뒤에 f가 붙어 있지 않으면 double 타입에 상응하는 실수 값이라고 생각한다
1.23E-3 = 1.23 x 10^-3 = 0.00123
문자 타입
실제 프로그래밍 시에는 char를 주로 사용하고 wchar_t는 특별히 요구되는 상황에서 사용하게 된다
예제 5-5 char 타입의 사용
#include <iostream> using namespace std;
int main() { // char 타입의 변수를 정의 char a; char b; char c;
// 문자를 대입 a = 'G'; b = 'O'; c = 'D';
// 화면에 출력 cout << a << b << c << "\n";
return 0; } |
예제 5-6 아스키 코드 값 확인
#include <iostream> using namespace std;
int main() { // 'A'의 아스키 코드 값 확인 int a = 'A'; cout << a << "\n";
// 65를 문자로 표현하면? char b =65; cout << b << "\n";
return 0; } |
이스케이프 문자열
모든 이스케이프 문자열은 역슬래쉬(/)로 시작한다
특수문자 |
아스키 코드 상에서의 표현 |
C++에서의 표현 |
개행문자 |
NL(LF) |
\n |
수평탭 |
HT |
\t |
수직탭 |
VT |
\v |
백스페이스 |
BS |
\b |
캐리지 리턴 |
CR |
\r |
폼필드 |
FF |
\f |
벨소리 |
BEL |
\a |
역슬래쉬 |
\ |
\\ |
물음표 |
? |
\? |
작은 따옴표 |
' |
\' |
큰 따옴표 |
" |
\" |
8진수 |
Ooo |
\ooo |
10진수 |
hhh |
\xhhh |
예제 5-7 이스케이프 문자열 사용
#include <iostream> using namespace std;
int main() { // hello, world!를 쓰려다 실수했음 cout << "hello, works";
// 백스페이스로 뒤에 두 글자를 지운다 cout << "\b\b";
// hello, world!를 마무리한다. cout << "ld!\n";
return 0; } |
이스케이프 문자열 출력 화면
Bool 타입
Bool 타입의 변수에는 true 혹은 false의 값이 들어갈 수 있다.
예제 5-8 bool 타입 사용
#include <iostream> using namespace std;
int main() { // bool 타입의 변수 정의 bool b1; bool b2;
// 값에 대입한다. b1 = true; b2 = false;
// 변수의 값을 출력한다. cout << "b1 = " << b1 << "\n"; cout << "b2 = " << b2 << "\n";
return 0; } |
Section 02 형변환
왜 형변환을 배워야 할까
형변환은 C++ 개발자의 일상 생활에서 빼놓을 수 없는 주제다.
형변환의 규칙
형변환 시에 값이 변경되는 경우
* 실수 타입에서 정수 타입으로 형변환이 발생하는 경우에는 실수의 소수점 이하 부분이 잘리게 된다. 반올림이 아님에 주의하자.
* 모든 타입에서 bool 타입으로 형변환할 때, 모든 0이 아닌 수는 true 즉, 1 로 바뀐다. 0은 그대로 0으로 남아 flase의 의미를 갖는다
예제 5-9 기본 타입간의 형변환
#include <iostream> using namespace std;
int main() { // 다양한 타입의 변수를 정의한다. int i = 65; float f = 66.89f; char c = 'c'; bool i2b, f2b, c2b;
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
//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 "/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; } |
문제가 발생하는 형변환
문제가 발생하는 형변환의 공통정인 조건은 큰 타입에서 작은 타입으로 형변환이 일어난다는 것이다.
에제 5-10 문제가 생기는 형변환
#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 << "\ntto unsigned short : " << i2us << "\ntto short : " << i2s << "\n\n"; cout << "double : " << d << "\ntto float : " << d2f <<"\n\n"; cout << "float : " << f << "\ntto short : " << f2s << "\n\n"; cout << "int : " << big_i << "\ntto float : " << i2f << "\n\n";
return 0; } |
명시적인 형변환
명시적인 형변환에는 임시 변수가 수반된다는 사실이다
예제 5-11 명시적인 형변환
#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"; } |
출처: 뇌를 자극하는 C++
'프로그래밍언어 > C++' 카테고리의 다른 글
성적나누기 프로그램 (0) | 2012.08.02 |
---|---|
C++ 스터디 14장 함수 1 – 관련된 코드를 모아서 담을 수 있는 가방 (0) | 2010.12.06 |