'cout<<"Input number="<
와 같은 뜻을 지닌 명령문입니다. 따라서 printf() 함수에서는 숫자를 보여주기 위하여 %d를 사용하고 %d에 변수 a의 내용을 대입시켰습니다. 그러나 cout에서는 %d 기호를 사용하지 않고 바로 a라는 변수 이름을 대입시켰습니다. 주의할점은 변수 a의 좌우로 큰 따옴표가 없다는 점입니다.
cout<<"input * input="<
이제 이 문장은 쉽게 이해하실 수 있으리라 생각합니다. 앞서 사용한 문장과 같은 모습이죠. 단지 변수 a 대신에 변수 b가 들어갔을 뿐입니다.
이렇게 해서 test005.cpp와 test0051.cpp는 전혀 다른 명령문을 사용했지만 똑 같은 결과를 보여주는 프로그램이 되었습니다. 어떤 명령문을 이용하여 프로그램을 작성할 것인지는 여러분의 마음에 달렸습니다.
일단 이 책에서는 표준입출력 객체의 사용법을 익히기 위하여 printf() 함수 대신에 cout 객체를 사용하는 방향으로 예제를 만들어가겠습니다.
^^^그림: test0051.exe를 실행시킨 화면도 test005.exe와 같습니다.
**요약: printf() 함수와 scanf() 함수 대신에 표준입출력 객체인 cout과 cin 명령문을 이용하여 프로그램을 만들어도 결과는 같습니다. <<연산자나 >>연산자는 연속적으로 사용 가능합니다.
[연습문제]
test0051.cpp의 내용을 고쳐서 ex06.cpp로 저장합니다. 입력객체를 이용하여 세 개의 수를 연달아 입력받은 후에 입력받은 세 개의 수를 더해서 보여주는 프로그램으로 만듭니다.
[연습문제 정답]
// EX06.CPP -- 두 개의 수를 입력받아 곱한 결과를 보여주기
#include
#include // 표준입출력 객체에 관한 헤더파일
void main(void)
{ int a, b, c, d;
cout<<"INput 1st Number: "; // 첫번째 숫자를 입력받음
cin>>a; // 입력객체인 cin을 사용하여 숫자를 입력받아 a에
저장
cout<<"INput 2nd Number: "; // 두번째 숫자를 입력받음
cin>>b; // 두번째 숫자는 변수 b에 저장
cout<<"INput 3rd Number: "; // 세번째 숫자를 입력받음
cin>>c; // 세번째 숫자는 변수 c에 저장
cout<<"1st number="<
2.5.11.컴파일러의 도움말 보기
컴파일러에서 제공하는 함수에 대한 설명을 담은 책을 라이브러리책이라고 합니다.
이제 어느 정도 함수에 대해서 알아보았으니 구체적으로 C++언어의 함수를 어떻게 사용하는지 알아보겠습니다. 그동안 사용한 함수는 printf()함수와 scanf() 함수뿐입니다. 그러나 배워야 할 기본 함수는 무척 많으며, 기본적인 함수의 사용법만 간단하게 설명해도 두꺼운 책 한 권이 넘습니다. 때문에 저는 모든 함수의 사용법을 다 설명하기가 곤란합니다. 대신 중요한 함수의 사용법만 말씀드리겠습니다. 그러나 단 하나의 함수 사용법만 제대로 이해할 수 있다면 나머지 함수의 사용법은 쉽게 배울 수 있습니다. printf() 함수의 사용법만 제대로 이해하고 활용할 수 있다면 C++언어의 모든 함수 사용법을 익히는 일이 그리 어렵지 않을 겁니다.
가장 많이 사용하면서도 가장 복잡하고, 또한 가장 기본적인 함수인 printf()함수에 대한 설명은 라이브러리 책을 참고해야 합니다. C++언어 책이나 C의 함수설명을 담아놓은 라이브러리 책(또는 매뉴얼)을 보면 printf()함수의 사용서식이 매우 복잡하게 나옵니다.
라이브러리 책이란 컴파일러의 함수사용법을 간단하게 설명해놓은 책을 말합니다. 간단하게 설명해놓은 책이라도 하지만 몇 백 쪽이 넘는 두꺼운 책입니다. 그렇기 때문에 항상 라이브러리 책을 곁에 두고 참고하면서 프로그램을 짜야 합니다.
함수에 대한 설명은 컴파일러에 내장된 도움말을 참고하면 편리합니다.
C의 함수가 워낙 방대하고 복잡하기 때문에 라이브러리 책을 곁에 끼고 살아야하지만 두꺼운 책을 들고 다니기란 쉬운 일이 아닙니다. 이럴 때는 컴파일러프로그램 안에 들어 있는 도움말을 참고해서 프로그램을 짭니다. 프로그램 안에 도움말이 들어 있는 것을 도움말이 내장되었다고 표현합니다. 덕분에 볼랜드C++에서도 간단하게 도움말을 볼 수 있습니다.
BC에서는 [Ctrl]+[F1]을 누르면 커서가 위치한 낱말의 도움말을 볼 수 있습니다.
BC에서는 [F1]을 눌렀을 때 현재 작업중인 영역에 대한 포괄적인 설명이 나옵니다. 예를 들어서 test0051.cpp의 편집화면에서 [F1]을 누르면 현재 작업중인 화면이 편집화면(Edit window)이라고 알려줍니다.
^^^그림: BC에서 [F1]을 누르면 작업중인 화면에 대한 도움말을 볼 수 있습니다.
그리고 다음과 같은 경고문이 표시되고 경고문으로 표시된 줄이 선택되었을 경우 [F1]을 누르면 선택된 문장 전체에 대한 도움말이 표시됩니다.
예를 들어서 다음 화면은 컴파일 과정에 발생한 에러에 대한 메시지를 보여주고 있는 상태입니다. 편집화면에서는 에러가 발생한 명령문이 반전되어 있고, 하단의 에러 메시지 창에는 소스파일의 문제가 무엇인지 알려주고 있습니다. 에러 메시지는 'Unable to open include file 'MINE.H''입니다.
^^^그림: 컴파일 과정에서 발생한 에러에 대한 경고문.
이 상태에서 [F1]을 누르면 에러 발생문에 대한 도움말을 볼 수 있습니다. 이처럼 [F1]은 화면 전체나 문장과 같이 폭이 넓은 영역의 도움말을 제공합니다.
^^^그림: 경고문이 선택되었을 때 [F1]을 누르면 경고문에 대한 도움말이 표시됩니다.
때로는 현재 사용중인 함수나 명령어의 좀더 자세한 사용법을 알고싶을 때가 있습니다. 이처럼 함수나 명령어에 대한 도움말이 필요할 때도 내장된 도움말을 참고하면 편합니다.
BC에서 도움말이 필요한 함수나 명령어의 낱말 위에 커서를 이동시킨 후에 [Ctrl]+[F1]을 누르면 자세한 도움말이 나타납니다.
^^^그림: printf() 함수 위에서 [Ctrl]+[F1]을 눌렀을 때 나오는 도움말 화면
그리고 도움말을 색인(Index)순으로 모두 보고싶다면 [Shitf]+[F1]을 누르면 됩니다. [Shitf]+[F1]을 누르면 다음 화면처럼 가나다순으로 BC에서 사용할 수 있는 명령어와 함수들의 목록이 나타납니다. 화살표키를 이용해서 보고 싶은 낱말 위로 이동시키면 선택된 낱말이 반전됩니다. 반전된 낱말 위에서 [Enter]를 누르면 그 낱말에 대한 도움말이 표시됩니다.
^^^그림: [Shift]+[F1]을 누르면 사용 가능한 명령어가 가나다순으로 표시됩니다.
**요약: BC에서는 [F1]을 누르면 작업중인 화면에 대해서, [Ctrl]+[F1]을 누르면 커서가 놓인 낱말에 대한 도움말을 볼 수 있습니다. [Shitf]+[F1]을 누르면 전체 명령어를 가나다순으로 살펴볼 수 있습니다.
BCW의 도움말은 BC와 같습니다.
BCW에서도 BC와 마찬가지 키를 사용합니다. 또 도움말의 구조도 같습니다. 그러나 마우스를 이용해 메뉴의 Help 메뉴를 선택하는 방법도 있습니다. 즉 [Shitf]+[F1]을 누르거나 메뉴에서 Help 메뉴를 선택하고 Index 메뉴를 선택하는 방법을 사용할 수 있습니다.
^^^그림: 마우스로 Help 메뉴를 선택하면 도움말을 볼 수 있습니다.
[Shitf]+[F1]을 누르거나 메뉴에서 Help 메뉴를 선택하고 Index 메뉴를 선택하면 다음 화면과 같이 Index 형식의 도움말이 나타납니다. 초록색으로 밑줄 친 낱말을 마우스로 선택하면 해당 주제를 보여주는 화면으로 바뀝니다. BCW의 도움말 사용법은 윈95/98의 도움말 사용법과 같기 때문에 따로 설명드리지 않겠습니다.
^^^그림: [Shift]+[F1]을 눌렀을 때 나오는 도움말 화면
그리고 printf 낱말 위에 커서를 이동시킨 후에 [Ctrl]+[F1]을 눌렀을 때는 printf() 함수에 대한 도움말 화면이 나타납니다. 윈도용 도움말로 나타나기 때문에 BC의 화면과는 조금 달라졌지만 기본적인 설명 내용은 같습니다.
^^^그림: printf() 함수 위에서 [Ctrl]+[F1]을 눌렀을 때는 나오는 printf() 함수에 대한 도움말
그리고 [F1]만 눌렀을 때는 작업 창이나 작업줄 전체에 대한 도움말이 나옵니다.
^^^그림: [F1]을 누르면 작업중인 창에 대한 도움말이 나타납니다.
BCW에서는 창닫기 아이콘을 눌러 경고문 창을 닫을 수 있습니다.
예를 들어서 test005.cpp 파일을 컴파일할 때는 에러가 없지만 링크 과정에서 에러가 발생할 수 있습니다. 링커에 대한 환경설정을 바꾸지 않고 볼랜드C++의 기본 환경으로 설정된 경우 다음과 같은 경고문을 보여줍니다.
BC와는 달리 BCW는 독립된 창으로 뜨기 때문에 BC처럼 경고문이 화면을 분할하지 않습니다. 따라서 경고문 창이 뜨면 창닫기 아이콘을 눌러서 닫아주면 경고문 창이 사라집니다. 또 편집화면으로 돌아가고 싶다면 편집화면 창을 마우스로 선택하면 됩니다.
링커 과정에서 문제가 있다는 경고문 창을 보면 3줄이 있는데 맨 밑에 있는 'Linker Warning:'이라는 줄을 선택하면 반전된 상태로 표시됩니다. 이 상태에서 [F1]을 누르면 이 경고문에 대한 도움말이 나타납니다.
^^^그림: 링크 과정에서 문제가 발생했다는 경고문을 별도의 창으로 보여줍니다.
'Linker Warning:'이라는 줄에서 [F1]을 누르면 이 경고문에 대한 도움말이 나타나는데 역시 또 하나의 창이 뜹니다. 따라서 이 창을 닫으려면 창닫기 아이콘을 눌러주어야 합니다.
^^^그림: 경고문 창에서 한 줄을 선택하고 [F1]을 눌렀을 때 나오는 도움말
**요약: BCW에서 [F1]을 누르면 작업중인 화면에 대해서, [Ctrl]+[F1]을 누르면 커서가 놓인 낱말에 대한 도움말을 볼 수 있습니다. [Shitf]+[F1]을 누르면 전체 명령어를 주제별로 살펴볼 수 있습니다.
2.5.12.함수와 인수의 사용법
가장 기본이 되는 printf() 함수의 사용법을 통해 함수 사용법을 익힙니다.
도움말이나 라이브러리 책을 보시면 아시겠지만 printf() 함수의 설명만 몇 쪽이 넘습니다. 때문에 printf() 함수의 사용법 설명만 봐도 아마 머리가 아플겁니다. 대부분의 사람은 printf() 함수의 사용법만 보고도 기가 질려서 언어 배우기를 포기할 지 모릅니다.
반면에 printf() 함수의 사용법만 제대로 익혔다면 C++언어의 함수는 대부분 통달했다고 볼 수 있습니다. printf() 함수는 가장 쉽고 기초적인 함수지만 또한 C++언어의 모든 내용을 포함하고 있는 함수이기도 합니다. 그래서 printf() 함수를 자유롭게 쓸 수 있는 사람은 다른 함수도 자유롭게 사용할 수 있습니다.
하여간 도움말을 통해서 대충의 내용은 알겠지만 여전히 함수의 사용법은 어렵습니다. 그러므로 몇 개의 보기를 통해서 간단하게 printf() 함수의 사용법을 익혀보도록 하겠습니다.
앞서 써먹었던 문장을 다시 살펴봅시다.
printf("Hello, Kim JoongTae. \n");
printf("Input number=%d \n",a);
이 두 문장이 printf() 함수의 기본 문장 형식입니다. printf() 함수는 ()안의 문장을 화면으로 출력해줍니다. 그런데 괄호 안의 내용은 일정한 형식이 있어야 합니다.
printf() 함수에서 문장을 출력할 때는 큰 따옴표로 묶습니다.
첫번째 지켜야할 형식입니다. 원하는 문장을 출력하고 싶을 때는 원하는 문장을 큰따옴표로 앞 뒤를 묶어주어야 합니다.
(X)틀림 : 괄호 안의 문장을 큰 따옴표로 묶지 않았습니다.
printf(Hello, Kim JoongTae.);
(O)맞음 : 괄호 안의 문장을 큰 따옴표로 묶었습니다.
printf("Hello, Kim JoongTae.");
함수 안에 사용하는 요소를 인수라고 하며 따옴표로 각 인수 사이를 구별합니다.
이때 괄호 안에 넣어서 사용하는 인자나 구성 요소들을 인수라고 말합니다. 인자가 되는 수라는 뜻입니다. 그러니까 "Hello, Kim JoongTae."라는 문장 전체가 하나의 인수가 되는 겁니다.
인수는 하나만 사용할 수 있는 것이 아니고 여러 개를 사용할 수 있습니다. 두번째 문장에서는 두 개의 인수를 사용하고 있습니다. "Input number=%d \n"라는 인수와 a라는 인수입니다. 두 인수를 구별하기 위해서 두 인수 사이에 쉼표를 넣었습니다. 그러니까 printf() 함수는 "Input number=%d \n"이라는 문장형식을 첫번째 인수로 삼고, a라는 변수를 두번째 인수로 삼고 있는 겁니다.
(X)틀림 : 인수 사이에 따옴표로 구분하지 않았습니다.
printf("Input number=%d \n"a);
(O)맞음 : a 인수 앞에 따옴표(,) 기호를 넣어 두 인수를 구분했습니다.
printf("Input number=%d \n",a);
C언에서 사용하는 인수라는 개념은 도스명령어의 매개변수라는 개념과 비슷합니다. 요즘은 도스를 사용하는 분이 별로 없지만 도스를 사용할 때는 도스 명령어 뒤에 매개변수를 붙여서 사용하는 경우가 많습니다.
예를 들어 dir이라는 도스명령어에 여러 개의 인수를 사용할 수 있습니다. 예를 들면 'dir *.exe /w /p'과 같은 명령어인데 이를 C++언어의 형식으로 나타내면 이렇게 나타낼 수 있을 겁니다.
dir 인수 인수 ...
그러니까 dir 뒤에는 인수를 계속해서 사용할 수 있다는 뜻이 됩니다. ... 기호는 뒤에 더 많은 인수가 올 수 있다는 것을 줄여서 나타내는 기호입니다. 물론 인수로 사용할 수 있는 갯수는 한정되겠지만 dir 명령어 뒤에 매개변수를 사용하는 것처럼 C++언어의 함수도 여러 개의 인수를 사용할 수 있습니다. 그리고 도스 명령어가 매개변수를 통해서 좀더 세밀하게 명령어를 제어할 수 있는 것처럼 C++언어 역시 인수를 통해서 세부적으로 함수를 제어할 수 있습니다.
**요약: printf() 함수에서 문장을 보여주려면 큰 따옴표로 싸야 합니다. 함수 안에는 여러 개의 인수를 넣어서 사용할 수 있는데 각 인수는 따옴표로 구분합니다. 인수란 함수나 명령어에서 사용하는 인자들, 또는 함수나 명령어의 요소들을 가리키는 말입니다. 인수는
함수나 명령어의 실행과정에 사용되며 인수가 변하면 실행 결과도 바뀝니다.
2.5.13.\n 기호의 의미와 ESC문자열
\n 기호는 줄바꿈문자를 나타내는 특수문자입니다.
다시 첫번째 문장을 세부적으로 살펴보겠습니다. "Hello, Kim JoongTae. \n"이라는 문장의 맨 마지막에 붙은 \n에 대해서는 간단하게 말씀드렸습니다. 줄바꿈문자를 나타내는 특수한 기호입니다. \라는 문자와 n이라는 문자를 출력하라는 뜻이 아닙니다.
줄을 바꾸라는 명령을 내리면 커서는 다음 줄의 첫번째 칸에서 깜박거립니다. 우리들이 도스명령어를 치거나 글틀에서 문서를 작성하면서 큰글쇠를 치면 다음 줄의 첫번째 칸으로 가는 것을 볼 수 있습니다. 이것을 줄바꿈이라고 말하는데 컴퓨터는 두 단계 과정을 거쳐서 줄바꿈을 합니다.
컴퓨터에서 줄바꿈은 캐리지리턴과 라인피드의 두 가지 과정이 합쳐진 것입니다.
캐리지리턴(carriage return)과 라인피드(line feed)라는 두 가지 단계를 거칩니다. 캐리지리턴은 커서를 그 줄의 처음으로 옮긴다는 뜻입니다. 라인피드는 커서 위치에서 한 줄 밑으로 커서를 옮긴다는 뜻입니다. 그러니까 다음줄 첫번째 칸으로 커서가 이동하는 과정은 먼저 캐리지리턴이라는 동작을 통해서 현재 줄의 첫번째 칸으로 이동한 뒤에 그곳에서 다시 한 칸을 내리는 과정(라인피드해서)이 추가되어 이루어집니다. 간단한 그림으로 설명하면 다음과 같은 과정입니다.
sample_ : 원래는 이런 문장입니다. 커서가 맨 끝에 와 있죠.
sample[Enter] : [Enter]를 입력합니다.
←
_sample[Enter] : 먼저 캐리지리턴을 해서 첫번째 칸으로 커서를 이동시킵니다.
↓sample[Enter] : 라인피드를 해서 커서를 밑줄로 이동시킵니다.
_
sample : 그래서 커서가 다음줄 첫번째 칸에서 깜박이는 겁니다.
_
만약 \n이라는 줄바꿈 문자를 사용하지 않는다면 이어서 나오는 printf() 함수의 문장은 지금 출력한 문장에 붙어서 화면에 출력될 겁니다. 그럼 보기가 좋지 않겠죠? 그러니까 원래는 "" 안에 원하는 문장을 아무 것이나 넣을 수 있지만 문장 안에 \라는 문자가 나오면 일단 특수기호라고 생각을 합니다. 그래서 컴파일러가 기계어로 번역을 할 때 특수문자로 번역을 하는 겁니다.
\ 기호를 표시하려면 '\\'이라는 특수문자를 이용해야 합니다.
그럼 그냥 문자로서 \를 표현하려면 어떻게 해야 할까요?
그때는 \\라고 써주면 됩니다.
다음과 같은 문장을 화면에 출력하고자 한다고 합시다.
C:\ is C Drive's Root Directory
이때 C:\이라는 글자에 \가 들어갑니다. 만약 아무런 생각 없이 C:\라고 쓰면 이상한 결과가 나올겁니다. 한 번 시험삼아서 써보시기 바랍니다. 아마 \ 글씨가 화면에 출력되지 않을 겁니다. 이럴 때는 다음과 같이 쓰면 됩니다.
printf("C:\\ is C Drive's Root Directory");
또는 cout을 이용할 때는 다음과 같이 사용합니다.
cout<<"C:\\ is C Drive's Root Directory";
조금 번거롭기는 하지만 이렇게 해서 \ 글자를 화면에 출력할 수 있습니다. 그렇다면 " 기호도 사용할 수 없다는 것을 눈치챌 수 있습니다. 큰따옴표는 출력할 문장의 처음과 끝을 나타내는 특수기호이기 때문입니다. " 기호를 사용하려면 \" 형식을 이용해 표시할 수 있습니다.
그러므로 이쯤에서 중요한 \ 기호를 몇 가지 알아두는 것이 좋겠습니다. printf()함수를 비롯해서 C++언어의 출력함수에서 아래와 같이 쓸 경우 오른쪽의 뜻으로 쓰겠다는 뜻입니다.
이때 한글윈도를 사용하는 국내 사용자들이 주의할 점이 있습니다. \ 기호는 원래 각 나라의 화폐단위를 대신할 수 있도록 설정된 기호입니다. 때문에 영문도스나 영문윈도에서는 \ 기호 모습 그대로 보이지만 한글도스나 한글윈도에서는 우리나라의 화폐단위인 ₩ 기호로 나타납니다. 따라서 컴퓨터에서 ₩ 기호로 표시되는 부분은 \ 기호와 같은 기호임을 숙지하기 바랍니다.
예를 들어서 다음과 같은 예제 소스파일를 만들어 s01.cpp로 저장하여 실행해보기 바랍니다.
// s01.cpp
#include
#include
void main(void)
{
cout<<"C:\\ is C Drive's Root Directory.";
// 소스파일에서는 \기호로 보임
}
^^^그림: s01.cpp에서는 \ 기호로 입력되었습니다.
BC나 BCW에서는 소스파일에 \ 기호로 표시되는 기호가 실행파일로 바뀌어 실행될 경우 한글윈도에서는 다음 예제 화면처럼 ₩ 기호로 바뀌어 표시됩니다.
^^^그림: s01.exe를 실행시키자 ₩기호로 바뀌어 표시됩니다.
표: C++언어에서 사용하는 \기호(ESC문자)의 종류
\a : bell 소리를 냅니다. 그러니까 컴퓨터에서 에러를 나타내기 위해서 '삑'하고 울리는 소리가 납니다. 컴퓨터에서는 '삑' 하는 소리도 일종의 문자에 해당하는 셈입니다.
\b : 백스페이스를 뜻합니다. 그러니까 화면에 글씨를 출력했다면 커서를 다시 앞으로 한 칸 이동시킵니다.
\n : 라인피드를 뜻하므로 줄을 바꾸어 새로운 줄을 시작하라는 뜻입니다. 원래는 커서를 다음줄로 이동시키는 일만 합니다. 그런데 C에서는 특별한 명령이 없는 한 다음 줄의 첫번째 칸으로 이동시킵니다.
\r : 캐리지 리턴을 뜻합니다. 그러니까 커서를 현재 줄의 첫번째 칸으로 이동시킵니다.
\t : 탭을 뜻하는 기호입니다. 탭을 설정한 크기만큼 커서를 이동시킵니다. 당분간은 탭을 사용할 일이 없으므로 탭에 대한 설명은 생략하겠습니다.
\\ : 역빗금(\)문자를 표시하라는 뜻입니다.
\' : 작은 따옴표를 표시합니다.
\" : 큰 따옴표를 표시합니다.
\기호는 확장문자, 또는 확장열, ESC코드, ESC 문자, ESC 문자열 등으로 부릅니다.
\ 기호를 앞에 붙인 문자를 확장문자, 또는 확장열, ESC코드, ESC 문자, ESC 문자열 등으로 다양하게 부릅니다. \ 기호가 의미하는 것은 ESC sequence code를 의미하므로 가장 정확한 표현은 ESC따름문자가 됩니다. 그러나 이 책에서는 많은 사람들이 사용하는 ESC문자열이라는 낱말을 사용하겠습니다.
ESC문자열은 특수한 문자를 표시할 때 주로 사용합니다. 보통 우리가 사용하는 A~Z, a~z까지의 문자나 숫자 등은 타자를 쳐서 바로 나타낼 수 있습니다. 그러나 줄바꿈 문자를 비롯해서 backspace문자, tab문자, 삑 소리, 라인피드기호, 괘선문자 등은 타자를 쳐서 나타낼 수 없습니다. 그래서 이런 특수한 문자를 표시하기 위해서 \ 기호를 사용합니다.
컴퓨터는 이진수와 1바이트의 아스키코드만 이해합니다.
많은 사람들이 쉽게 이해하지 못하는 부분은 backspace나 빈칸, 탭, 캐리지리턴도 문자라는 점입니다. a, b, c, d만 문자로 알고 있던 분들은 탭이나 캐리지리턴, 삑 소리도 하나의 문자라는 사실을 잘 이해 못합니다.
그러나 컴퓨터의 입장에서 생각해보면 이해가 될 겁니다. 컴퓨터는 기본적으로 이진수만을 이해합니다. 그러나 이진수로 대화나누기가 어렵기 때문에 1바이트로 표현되는 숫자를 이용해 컴퓨터와 대화를 나눕니다. 1바이트로 표현할 수 있는 256가지 경우에 문자를 배정한 미국의 표준 코드를 아스키코드라고 하니다.
그래서 65번이라는 숫자가 들어오면 65번에 해당하는 약속을 실행합니다. 그런데 65번 코드는 A자 모양을 화면에 표시하는 것으로 약속되어 있습니다. 그래서 화면에 A자를 보여주는 겁니다. 마찬가지로 7이라는 기호가 들어오면 7번 코드에 해당하는 약속을 실행하는데, 7번 코드는 '삑'하는 소리를 내라는 약속이 되어있는 겁니다. 사람 눈에는 전혀 다른 글자로 보이겠지만 컴퓨터 입장에서 보면 어떤 숫자에 해당하는 약속된 기능을 실행한다는 점에서는 다 같은 놈으로 보이는 겁니다.
1바이트로 표현할 수 있는 문자를 정한 미국 표준코드가 아스키코드입니다.
이처럼 0부터 255까지의 숫자에 특별한 기능을 약속해놓은 코드체계를 ASCII코드라고 합니다. 그러니까 \ 기호는 ASCII코드(아스키코드) 중에서 우리가 글판(키보드)으로 입력할 수 없는 기호들을 표현하고자 할 때 주로 사용합니다.
\ 기호를 이용해 약속된 형식에 맞게 표현식을 사용하면 원하는 특수문자를 표시할 수 있습니다. 앞에서 우리가 배운 \ 기호는 자주 쓰이는 열 종류의 문자만 표현했습니다만 실제로는 더 많은 종류의 특수문자가 있고, 이런 문자를 사용하기 위한 표현방법도 다양합니다. 아스키코드가 256개의 문자를 가지고 있으므로 \ 기호를 이용해서 나타낼 수 있는 문자도 매우 많습니다. 그러나 당장은 앞서 배운 중요한 ESC문자열로 충분하기 때문에 나머지는 다음 기회에 배우는 것으로 하겠습니다.
'\n'은 라인피드를 나타내지만 예외적으로 C++언어에서는 '\r\n'의 값으로 출력해줍니다.
위의 ESC문자열을 보면 \n이 라인피드이고, \r이 캐리지 리턴이므로 다음줄 첫번째 칸으로 이동하기 위해서는 \r\n이라고 써야하지 않을까 하고 생각하는 분이 있을 겁니다. 맞습니다. 제대로 쓴다면 먼저 캐리지리턴을 하고 라인피드를 해야 하므로 \r\n이라고 써야 맞습니다. 그러나 C언어 프로그램에서는 특별한 약속이 없는 한 \n이라는 기호를 만나면 캐리지리턴과 라인피드 동작을 동시에 해서 화면에 커서를 이동시킵니다. 저장할 때는 \n이라고 저장하고 화면이나 프린터로 문장을 보여줄 때는 \r\n처럼 행동하는 겁니다. 그 까닭은 \r\n이라고 저장하다보니 자료의 크기가 많아지기 때문입니다. 그래서 저장할 때는 라인피드를 뜻하는 \n으로만 저장하고, 이를 화면에 출력할 때는 \r\n으로 출력하는 겁니다. 가능하면 자료를 저장할 때 적은 바이트수로 저장하려다보니 이런 예외규칙을 만든 겁니다.
**요약: \ 기호를 붙여서 사용하는 문자를 ESC문자열이라고 하는데, 특수문자를 출력하고자 할 때 주로 사용합니다. 따옴표나 역빗금을 표시하려면 앞에 \ 기호를 붙여서 사용합니다.
이제 위의 특수기호 사용법으로 간단하게 예를 들겠습니다.
C:\ is "ROOT" Directory
이와 같은 문장을 화면에 출력하고 싶다면 다음과 같이 써야 합니다.
printf("C:\\ is \"ROOT\" Directory\n");
또는
cout<<"C:\\ is \"ROOT\" Directory\n";
위와 같이 쓰면 커서가 그 줄의 뒤에서 깜박거릴 겁니다. 그리고 다음과 같이 쓰면 커서가 다음 줄의 첫번째 칸에서 깜박거릴 겁니다.
printf("C:\\ is \"ROOT\" Directory\n");
또는
cout<<"C:\\ is \"ROOT\" Directory\n";
\n을 쓴 횟수만큼 커서가 내려갑니다.
그렇다면 하나의 문장 안에 \n기호를 여러 번 쓰면 그 수만큼 커서가 밑으로 내려갈까요? 예. \n 기호를 쓴 만큼 커서가 내려갑니다. 따라서 printf() 함수에 쓴 문장은 한 문장이라 하더라도 실제로 화면에 출력할 때는 여러 줄 짜리로 출력할 수 있습니다. 다음과 같이 printf() 함수를 적어서 실행시켜 보기 바랍니다.
printf("1st line.\n\n3rd line.\n4th line.\n\n\n7th line.");
또는
cout<<"1st line.\n\n3rd line.\n4th line.\n\n\n7th line.";
결과를 보기 전에 미리 한 번 예상해보기 바랍니다. '1st line.'이라는 문장을 출력한 다음에 커서를 다음 줄, 다음 줄로 옮겼습니다. 두 줄 밑으로 옮긴 것이죠. 그리고 나서 '3th line.'이라고 적고, 다시 커서를 다음 줄 첫번째 칸으로 옮기고 '4th line.'라고 출력하고, 다시 세 칸 밑으로 옮겨서 '7th line.'이라고 적는 겁니다. 그리고 마지막에는 \n을 안 썼으니 커서는 '7th line' 뒤에서 깜박거릴 겁니다.
다음과 같이 s02.cpp으로 소스파일을 만들어 실행시켜보기 바랍니다.
// s02.cpp
#include
#include
void main(void)
{
cout<<"1st line.\n\n3rd line.\n4th line.\n\n\n7th line.";
}
^^^그림: s02.cpp의 내용
s02.cpp를 이 문장대로 프로그램을 작성하고 컴파일하면 아래와 같이 화면에 출력됩니다.
1st line.
3rd line.
4th line.
7th line.
^^^그림: 소스파일에 \n\n\n을 넣으면 세 칸 밑으로 이동합니다.
**요약: \n은 라인피드를 뜻하는 ESC문자열인데, 특별한 약속을 하지 않으면 화면에 출력할 때 캐리지리턴과 라인피드코드를 동시에 출력해줍니다. 즉 다음 줄 첫번째 칸으로 이동하라는 뜻을 지닌 특수문자입니다.
[연습문제]
s01.cpp의 내용을 고쳐서 ex07.cpp로 저장합니다. 프로그램의 실행결과는 다음과 같이 나오도록 만듭니다. 보기 문장의 '' 기호는 제외하고, 가운데 있는 따옴표만 나오면 됩니다.
첫번째 줄에는 '디렉토리 이름은 "C:\GAME\TETRIS"입니다.'라는 문장을 보여줍니다.
두번째 줄에는 '그의 이름은 '김중태'입니다.'라는 문장을 보여줍니다.
위의 두 문장을 보여준 다음에는 '삑' 소리가 연달아 세번 나오도록 합니다. 그러니까 세번째 줄에는 문장을 보여주는 것이 아니라 소리를 내도록 합니다.
[연습문제 정답]
// EX07.CPP -- ESC 문자열의 사용 보기
#include
#include
void main(void)
{
cout<<"디렉토리 이름은 \"C:\\GAME\\TETRIS\"입니다.";
// 소스파일에서는 \ 기호로 보임
cout<<"그의 이름은 \'김중태\'입니다.";
cout<<"\a\a\a"; // 삑 소리가 세번 납니다.
}
이제 원하는 문장을 화면에 출력하는 것을 하실 수 있을 겁니다. 문장을 출력하는 방법을 배웠으니 이번에는 문장 안에 변수의 내용을 대체시켜서 출력하는 방법을 배우겠습니다.
printf("Input number=%d \n",a);
위에서 % 기호 역시 \ 기호와 마찬가지로 특수기호입니다. % 기호는 다른 인수로부터 입력받은 변수나 상수로 대체시켜서 출력하라는 뜻입니다. 다른 말로 변수나 상수를 대입시켜서 출력한다고 합니다. 위의 문장에서 %d라고 썼는데, 이 기호는 정수로 바꾸어 출력하겠다는 뜻입니다. 그리고 쉼표 뒤에 a자를 써놓았으니 대입할 내용은 변수 a의 내용이라는 것을 알 수 있습니다.
자 그럼 여기서 다시 % 기호의 종류를 알아보겠습니다.
**표: % 기호의 종류
%c 인수를 하나의 글자로 바꾸어 출력합니다.
%d 인수의 내용을 10진수인 정수로 바꾸어 출력합니다.
%e 인수를 float나 double의 형태, 즉 실수로 바꾸어 출력하는데 지수표시 방법으로 출력합니다. 예를 들어서 123.45 라는 수는 1.23450e+02 라는 형태로 출력됩니다.
%f 인수를 float나 double의 형태, 즉 실수로 바꾸어 출력합니다.
%g 인수를 %e나 %f의 형식으로 출력하는데 출력하는 글자수가 적은 쪽을 택해서 출력합니다.
%o 인수의 내용을 8진수로 바꾸어 출력합니다.
%s 인수를 문자열, 즉 문장으로 바꾸어 출력합니다.
%u 인수를 부호가 없는 10진수로 바꾸어 출력합니다. 즉 음수로는 표기하지 않습니다.
%x 인수의 내용을 16진수로 바꾸어 출력합니다.
%% %문자를 출력하고자 할 때 사용합니다.
%가 나오면 특수기호로 알아듣기 때문에 %를 특수기호가 아닌 일반 글자로 출력하고자 할 때는 %%라고 써주면 됩니다.
This is 100%
위와 같은 문장을 화면에 출력하고 싶다면 다음과 같이 쓰면 됩니다.
printf("This is 100%% \n");
위와 같이 고쳐서 한 번 출력해보시기 바랍니다. 원하는 결과를 얻을 수 있을 겁니다.
% 기호의 사용법은 생각보다 까다롭습니다. 그러나 이중에서 우리들이 배워야 할 기호는 몇 가지만 간단하게 배우도록 하겠습니다. 중요한 %기호는 %c, %d, %f, %s의 네 가지입니다.
자 다음과 같이 프로그램을 짜서 test006.cpp로 저장하고 컴파일, 링크, 실행시키기 바랍니다.
// test006.cpp
#include
void main(void)
{
printf(" This is %c \n",'c'); // 문자 c를 보여줌
printf(" This is %d \n",10 ); // 정수 10을 보여줌
printf(" This is %f \n",12.34); // 실수 12.34를 보여줌
printf(" This is %s \n","This is String.");
// 문장 This is String.을 보여줌
}
^^^그림: test006.cpp의 소스 내용
[Alt]+[F5]로 확인해보거나 BCW를 빠져나가서 test006.exe를 실행시키면 다음과 같은 내용이 화면에 출력될 겁니다.
This is c
This is 10
This is 12.340000
This is This is String.
^^^그림: test006.exe를 실행했을 때 나오는 화면
이제 %기호를 어떻게 쓰는지 알 수 있을 겁니다. %c는 글자 하나만 화면에 출력하고자 할 때 사용합니다. %d는 정수를 출력하고자 할 때 사용합니다. %f는 실수를 화면에 출력할 때 사용합니다. %s는 문장을 출력할 때 사용합니다.
cout을 이용할 경우에는 다음과 같이 << 연산자를 연이어 사용하면 됩니다.
// test0061.cpp
#include
#include
void main(void)
{
cout<<" This is "<<'c'<<" \n"; /* 문자 c를 보여줌 */
cout<<" This is "<<10<<" \n"; /* 정수 10을 보여줌 */
cout<<" This is "<<12.34<<" \n"; /* 실수 12.34를 보여줌 */
cout<<" This is "<<"This is String."<<" \n";
/* 문장 This is String.을 보여줌 */
}
^^^그림: test0061.cpp의 소스 내용
test0061.c를 실행파일로 만들어 실행보면 test006.c와 같습니다. 그러나 실수 부분을 표시하는 내용은 조금 다릅니다. test006.exe에서는 12.340000로 나왔지만 test0061.exe에서는 12.34로 나옵니다.
^^^그림: test0061.exe를 실행했을 때 나오는 화면
인수로 사용하는 문자 옆에는 작은 따옴표를 붙입니다.
test006.cpp의 예제 프로그램을 한 문장씩 다시 확인해봅시다.
printf(" This is %c \n",'c');
또는
cout<<" This is "<<'c'<<" \n";
%c는 한 글자를 출력하라는 뜻입니다. 그리고 인수로는 'c'를 사용했습니다. 여기에서 c 라는 글자 좌우에 작은 따옴표를 붙이는 것을 잘 기억해두시기 바랍니다. C++언어에서는 하나의 글자를 표시할 때 글자 좌우에 작은 따옴표를 붙입니다.
만약 작은 따옴표를 붙이지 않는다면 무엇으로 인식하겠습니까? c라는 변수로 받아들일 겁니다. 그러면 에러가 나오고 컴파일이 되지 않습니다.
인수로 사용하는 숫자는 작은 따옴표를 안붙이고 숫자 그대로 적어줍니다.
printf(" This is %d \n",10 );
또는
cout<<" This is "<<10<<" \n";
%d는 정수로 변환해서 보여준다는 뜻입니다. 인수로는 10을 사용하고 있습니다. 이때 10 좌우에는 작은 따옴표를 붙이지 않습니다. 10은 숫자로 인식하기 때문입니다. 만약 '5'라고 썼다면 5라는 수가 아닌 5라는 글자로 인식하게 될 겁니다.
실수는 기본적으로 소숫점 이하 6자리까지 표시됩니다.
printf(" This is %f \n",12.34);
또는
cout<<" This is "<<12.34<<" \n"
%f는 실수를 표현하고자 할 때 사용합니다. 역시 인수로 사용할 수 있는 것은 숫자이므로 12.34라는 실수를 사용했습니다. 그런데 결과는 조금 이상하게 나왔습니다. test006.exe와 test0061.exe의 결과가 각기 다릅니다.
This is 12.340000
위와 같이 나왔습니다. 그러니까 소숫점 이하 자리수를 소수 6번째 자리까지 표시한 겁니다. 이것은 볼랜드C++의 기본값입니다. 따라서 소숫점 둘째 자리까지만 표시하도록 하고 싶다면 별도의 기호를 더 넣어주어야 합니다.
그러나 test0061.cpp의 실행결과는 제대로 12.34로 나옵니다. 그 까닭은 test0061.cpp에서는 %f 기호를 사용하지 않고 숫자를 직접 입력했기 때문입니다.
인수로 사용하는 문자열은 큰 따옴표로 싸줍니다.
printf(" This is %s \n","This is String.");
또는
cout<<" This is "<<"This is String."<<" \n";
%s는 문자열(=문장)을 출력하라는 소리입니다. 그리고 인수로는 "This is String"을 사용했습니다. 앞의 %c의 인수로 사용한 것과 차이점을 알 수 있을 겁니다. 문자열은 앞뒤로 큰따옴표를 붙인다는 사실입니다. 그러니까 작은 따옴표를 붙이면 글자 하나를 뜻하고, 큰 따옴표를 붙이면 여러 개의 글자를 나열한 문장으로 인식하는 겁니다.
**요약: %기호는 변수의 내용을 %기호에 대입하라는 뜻을 지닌 특수기호입니다. %c는 글자 하나를 대입할 때, %d는 정수를 대입할 때, %f는 실수를 대입할 때, %s는 문장을 대입시킬 때 사용합니다. 인수로 사용하는 문자는 작은따옴표로, 문자열은 큰따옴표로
감싸줍니다.
실수의 자릿수를 조정할 때는 - . 등의 기호를 사용합니다.
그럼 %f로 출력되는 숫자의 칸이나 자릿수를 조절하고 싶다면 어떻게 하면 되는지 알아보겠습니다. %기호 바로 뒤에 다음과 같은 형식을 사용하면 됩니다.
printf(" This is %-10.3f \n",12.34);
%기호 다음에 나오는 빼기(-) 기호는 출력할 때 그 줄의 왼쪽부터 출력을 시작하라는 뜻입니다. 그러니까 왼쪽 정렬을 하라는 뜻입니다. 다음의 숫자 10은 출력할 때 10칸짜리로 출력하라는 뜻입니다. 다음의 마침표(.)는 소숫점 이하의 자릿수를 구별하기 위해서 사용합니다. 그 뒤의 3이라는 숫자는 소숫점 3번째 자리까지 출력하라는 뜻입니다. 그러면 이 문장을 실행하면 다음과 같이 출력될 겁니다.
This is 12.340
그런데 빼기(-) 기호를 사용하지 않을 경우에는 C언어 프로그램이 보통 오른쪽정렬을 기준으로 맞춥니다. 그렇다면 명령문을 다음과 같이 바꾸어서 출력하면 어떻게 나올까요?
printf(" This is %10.1f \n",12.34);
그러면 다음과 같은 출력이 나올겁니다.
This is 12.3
10칸으로 출력하는데 오른쪽으로 붙여서 정렬하기 때문에 'This is'라는 문장 사이에 빈 칸이 6칸 들어간 겁니다. 그리고 .1f라고 했으니 소수 첫째 자리까지만 출력한 겁니다. 그래서 12.34의 둘째 자리인 4는 탈락해버린 겁니다.
실수는 기호의 조합에 따라서 화면에 나타나는 모양이 다릅니다.
이제 이 형식에 맞추어서 몇 가지 출력을 해보도록 하겠습니다. 아래와 같이 프로그램을 작성하고 test007.cpp로 저장해서 실행파일을 만들어보기 바랍니다. 이제 컴파일하고 링크한 다음에 실행한다는 것이 어떤 것인지 아실테니 앞으로는 프로그램을 실행해보라는 말로 대신하겠습니다. 앞으로 제가 프로그램을 실행하라고 하면 컴파일하고 링크한 다음에 실행까지 하는 과정을 합쳐서 말한 것으로 받아들이시기 바랍니다. 다시 한 번 말씀드리지만 볼랜드C++에서 프로그램을 컴파일하고 링크하고 실행까지 하는 지름글쇠는 [Ctrl]+[F9]입니다.
// test007.cpp
#include
#include
void main(void)
{
printf(" This is %10.1f \n",123.456);
printf(" This is %10.2f \n",123.456);
printf(" This is %-10.1f \n",123.456);
printf(" This is %-10.2f \n",123.456);
printf(" This is %5.1f \n",123.456);
printf(" This is %5.5f \n",123.456);
}
^^^그림: test007.cpp의 소스 내용
프로그램의 결과를 예측하면 이렇습니다.
printf(" This is %10.1f \n",123.456);
123.456을 오른쪽 정렬을 해서 10칸에 맞추어서 소수점 첫째 자리까지만 출력하라.
printf(" This is %10.2f \n",123.456);
123.456을 오른쪽 정렬을 해서 10칸에 맞추어서 소수점 둘째 자리까지만 출력하라.
printf(" This is %-10.1f \n",123.456);
123.456을 왼쪽 정렬을 해서 10칸에 맞추어서 소수점 첫째 자리까지만 출력하라.
printf(" This is %-10.2f \n",123.456);
123.456을 왼쪽 정렬을 해서 10칸에 맞추어서 소수점 둘째 자리까지만 출력하라.
printf(" This is %5.1f \n",123.456);
123.456을 오른쪽 정렬을 해서 5칸에 맞추어서 소수점 첫째 자리까지만 출력하라.
printf(" This is %5.5f \n",123.456);
123.456을 오른쪽 정렬을 해서 5칸에 맞추어서 소수점 다섯째 자리까지 출력하라.
그러면 아래와 같은 출력이 화면에 나올 겁니다.
This is 123.5
This is 123.46
This is 123.5
This is 123.46
This is 123.5
This is 123.45600
^^^그림: test007.exe을 실행시켰을 때 나오는 화면
실수로 연산할 때는 반올림 기능에 주의해야 합니다.
이렇게 출력이 나왔다면 제대로 프로그램을 작성한 겁니다. 자 이 화면에서 무엇인가 이상한 것을 발견했을 겁니다. 123.456을 지정했으므로 123.4나 123.45가 나와야 할 것 같은데 123.5와 123.46이 나왔습니다. 왜 그럴까요? 반올림을 했기 때문입니다. 즉 소수 첫째 자리만 표시하기 위해서 소수 둘째 자리 이하를 계산한 겁니다. 그래서 소수 둘째 자리가 5가 넘으면 반올림을 해서 첫째 자리에 표시하고, 5 미만이면 첫째 자리에 표시하지 않는 겁니다.
따라서 C++언어를 이용해서 숫자를 계산할 때는 주의해야 합니다. 비록 소수점 아래의 숫자지만 오차가 나올 수 있기 때문입니다. 그래서 컴퓨터언어로 프로그램을 짜서 정밀한 숫자를 다룰 때는 항상 컴파일러의 프로그램이 가지는 반올림을 염두에 두고 짜야 합니다. 안 그러면 엉뚱한 계산결과가 나올 수 있습니다.
이제 이정도로 하면 기본적인 printf() 함수의 사용법을 배운 셈입니다. 사실 printf() 함수의 사용법은 더욱 복잡하지만 일단은 이정도로만 끝내겠습니다. 좀더 자세한 사용법은 다음에 낼 책에서 다루도록 하겠습니다. 다만 이 책에서 배운 내용을 바탕으로 '볼랜드 C++'의 라이브러리 책을 보신다면 어렵지 않게 쉽게 이해할 수 있을 것으로 생각합니다.
**요약: 실수는 특수기호의 조합에 따라서 출력결과가 완전히 다르게 출력됩니다. 또한 반올림 기능이 있어 예상했던 결과와 다른 계산결과가 나올 수 있다는 점을 염두에 두어야 합니다.
2.5.14. C++언어에서 사용하는 자료형의 종류
상수의 형태를 자료형이라 하며 정수형, 실수형, 문자형을 가장 많이 사용합니다.
앞서의 함수에 사용된 인수는 글씨와 문장, 숫자로 구별됨을 알 수 있습니다. 또한 숫자는 정수와 실수로 구분된다는 사실을 알 수 있습니다. 컴퓨터라는게 결국은 자료를 다루는 것이기 때문에 C++언어를 비롯한 모든 언어는 자료의 형태나 종류를 분류해서 사용합니다. 자료형은 다른 말로 상수라고 할 수 있습니다.
예를 들어서 1이나 2라는 숫자는 정수형의 자료입니다. 그리고 1과 2는 변수를 설명할 때 말씀드린 것처럼 상수입니다. 1은 언제나 1의 값을 가질 뿐이며 3이나 4의 값을 가질 수 없습니다. A라는 문자도 역시 상수(constant)입니다. A자는 언제나 A자라는 값을 가지기 때문입니다. 이때 1이나 2는 정수 상수라고 하고, A나 B는 문자 상수라고 합니다. 3.45는 실수상수라고 합니다.
물론 변수(variable) 역시 자료형을 가지고 있습니다. 그에 따라 정수형 변수, 문자형 변수 등으로 구분됩니다.
가장 손쉽게 생각할 수 있는 자료형(date type) 또는 상수(constant)의 구분은 숫자와 문자입니다. 그러나 실은 그보다 더 세부적으로 나누어집니다. C++언어의 자료형은 구분 방법에 따라서 수가 달라지겠지만 대충 50여종 정도 됩니다. 이를 더 세분화하여 분류하고 더구나 여기에서 파생되는 자료형을 모두 포함한다면 백 여 가지도 훨씬 넘습니다.
이 모든 자료형을 기억했다가 올바른 형식에 맞추어 사용하기란 쉬운 일이 아닙니다. 그리고 각각의 자료형이 사실은 동일한 자료를 뜻하는 경우도 있습니다. 그래서 그 중에서 가장 많이 사용하는 자료형만 정리하면 다음과 같습니다.
우선 C++언어의 자료형은 크게 다음의 세 가지 형태로 구분됩니다.
기본형(basic type)
파생형(derived type)
클래스형(class type)
이 중에서 가장 많이 사용하는 기본형은 다시 다음과 같이 구분됩니다. 다섯 가지로 구분했지만 열거형은 거의 사용하지 않으며 void형 역시 실체가 없기 때문에 실제로 주로 사용하는 자료형은 정수형, 실수형, 문자형의 세 가지뿐입니다.
정수형(int)
int
long
unsigned
unsigned long
실수형(또는 부동소수점형.float)
float
double
문자형(char)
char
unsigned char
열거형(enum)
void형(void)
정수형은 수학에서 사용하는 정수를 뜻합니다.
먼저 정수형부터 살펴보겠습니다. 정수형 자료는 우리가 수학시간을 통해서 배운 정수와 같은 개념입니다. 흔히 0, 12, -33과 같은 숫자가 정수형입니다. 실수형(또는 부동소수점형)은 우리가 흔히 말하는 실수와 거의 같은 개념입니다. 당연한 이야기이겠지만 실수형은 정수형을 포함하고 있습니다. 0, 12, -33의 정수 숫자는 물론 소수점이 들어간 숫자들도 포함합니다. 예를 들면 0.1, -3.45, 3.56E7과 같은 숫자들이 실수형 자료(상수)입니다.
문자형의 1, 2, 3은 도형적 의미만 있지만 정수형의 1, 2, 3은 계산이 가능하다는 차이가 있습니다.
그리고 문자형은 우리가 사용하는 문자를 말합니다. a, B, 1과 같은 문자들입니다. 여기서 주의할 점은 문자형의 문자 1과 정수형이나 실수형의 1은 다른 형태의 자료라는 것입니다. 문자로서의 0, 1, 2, 3은 계산을 할 수 없고 단지 화면에 그 형태를 보여주기만 하는 도형적인 의미를 가지고 있을 뿐입니다. 그러나 정수형이나 실수형에서 사용하는 0, 1, 2, 3은 더하기 곱하기를 할 수 있고 계산이 되는 숫자를 말하는 겁니다.
이는 종이에 연필로 1000이라고 쓴 종이와 5000이라고 쓴 종이의 숫자와 천원 짜리 지폐와 5000원 짜리의 지폐에 적힌 숫자의 개념이 다른 것과 같습니다.
종이에 연필로 낙서한 것처럼 쓴 1000이라는 숫자는 그저 사람이 눈으로 볼 수 있는 도형적인 개념에 불과합니다. 5000이라고 써진 종이를 준다고 해서 1000이라 써진 종이 다섯 장과 교환하지는 못합니다. 숫자는 그냥 종이에 써진 도형일 뿐입니다. 종이 한 장은 종이 한 장의 가치를 인정받을 뿐입니다.
그러나 5000원 짜리 지폐를 주면 1000원 짜리 지폐 5장과 교환이 가능합니다. 5천원을 주고 1천원 짜리 물건을 사면 4천원을 거슬러 받습니다. 이처럼 지폐에 써진 숫자는 계산이 가능한 숫자라는 특징을 가집니다.
낙서한 숫자와 지폐의 숫자가 매우 다른 의미를 가지는 것처럼 문자 1은 그저 도형일 뿐이고, 숫자 1은 계산이 가능하다는 차이점이 있습니다.
정수형은 부호와 숫자의 범위에 따라서 int, long, unsigned, unsigned long으로 구분해 사용합니다.
정수형은 다시 int, long, unsigned, unsigned long로 나눕니다. int형으로는 -32768에서부터 32767까지만 다룰 수 있다고 보시면 됩니다. 그럼 10만이 넘는 숫자는 다루지 못한다는 이야기인가? 예 그렇습니다. 10만이 넘는 숫자는 다루지 못합니다. 그 까닭은 정수형의 자료는 2바이트의 크기를 이용해서 자료를 다루기 사용하기 때문입니다.(시스템에 따라서 이런 자료형의 길이는 변합니다. 대형 기종에서는 4바이트의 크기를 사용하기도 합니다.)
1바이트로는 256을 표현할 수 있습니다. 그러므로 2바이트 즉, 16비트로는 256×256=65536가지의 경우를 표현할 수 있습니다. 그래서 -32768에서 32767까지의 수를 다룰 수 있습니다. 그러나 음수를 사용하지 않는다면 0부터 65535까지의 수를 표현할 수 있습니다. 음수를 사용하지 않는 정수 상수를 unsigned init라고 표시합니다. 줄여서 unsigned라고 합니다. 그러니까 int형은 -32768~32767까지를 다루고, unsigned형은 0~65535까지 다루는 자료형입니다.
왜 2바이트의 크기로 정수를 다루는가 하는 의문을 가지는 분도 있을 겁니다. 2바이트의 크기로 정수를 다루는 까닭은 쓸 데 없는 낭비를 줄이기 위해서입니다. 예를 들어서 정수 하나를 다루는데 2바이트를 사용한다면 100개의 숫자를 다루거나 저장하기 위해서는 200바이트가 필요합니다. 또 정수 하나를 다루는데 4바이트를 사용한다면 똑 같은 100개의 숫자를 다루기 위해서 400바이트가 필요한 셈입니다. 2배나 더 큰 크기가 필요합니다. 이렇게 되면 램도 2배, 디스크에 저장할 때도 2배의 크기가 필요합니다. 그러나 대부분의 경우 정수를 다룰 때는 만 단위를 넘지 않습니다. 그래서 2바이트 크기로 정수를 다루는 정수형 자료를 만든 겁니다.
long형은 int형보다 큰 숫자를 다룰 때 사용하며 4바이트의 크기를 가집니다.
long형은 int형보다 큰 숫자를 다룰 때 많이 사용합니다. long형은 4바이트로 된 정수형 상수입니다. 4바이트이므로 65535×65535=4294967296 가지의 자료를 다룰 수 있습니다. 음수를 포함한 정수형을 다룬다면 -2147483648~2147483647까지 다룰 수 있습니다.
unsigned long형은 음수를 안 쓰고 양수만 다루겠다는 뜻이므로 0~4294967295까지 다룰 수 있습니다. 42억까지 다룰 수 있으므로 어지간한 수는 다 다룰 수 있는 셈입니다. 그러나 실제로 프로그램을 짜다보면 long형 자료(long형 상수)를 쓸 일이 그리 많지 않다는 것을 알게될 겁니다. 대부분은 int형으로도 해결할 수 있기 때문입니다.
**요약: 정수형 자료(정수 상수)를 다음과 같은 4종류를 가장 많이 사용합니다.
자료형 사용바이트 수 표현가능한 숫자
int 2 -32768~32767
unsigned 2 (부호 없음) 0~65535
long 4 -2147483648~2147483647
unsigned long 4 (부호 없음) 0~4294967295
정수형보다 큰 수를 다룰 때는 실수형을 사용합니다.
그럼 정수형보다 큰 숫자를 다루거나 소수점이 있는 실수를 다룰 때는 무엇을 사용해야 할까요? 실수형을 사용해야 합니다. 실수형 중에서 float형은 4바이트 즉, 32비트의 자료크기를 가지고 자료를 처리합니다. 그리고 double형은 8바이트 즉, 64비트 정도의 자료를 다룹니다. 따라서 어지간한 숫자는 대부분 float형만으로도 다룰 수 있습니다.
얼핏 생각하기에는 float형이나 정수형의 long형의 자료크기가 같기 때문에 같은 float형도 0~4294967295까지만 다룰 수 있는 것으로 알기 쉽습니다. 그러나 같은 4바이트를 사용하지만 float형은 지수부와 가수부라는 형태로 나누어서 수를 표시하기 때문에 더 큰 수도 표시할 수 있습니다. 예를 들어서 100억이라는 수를 10000000000으로 표시하는 것이 아니고 1.0+e10으로 표시합니다. 즉 1.0을 표시하는 부분과 +e10을 표시하는 두 부분으로 나눌 수 있기 때문에 가수부분의 백 억, 천 억도 어렵지 않게 표시할 수 있습니다. 물론 숫자가 4294967295처럼 각 자리의 숫자가 각기 다르다면 long형으로 표시할 수 있는 정도의 숫자밖에는 표시할 수 없지만 끝의 몇 자리가 0으로 끝난다면 훨씬 큰 수를 표시할 수 있습니다.
실수 상수는 지수 형태로 표현하기 때문에 표현가능한 숫자의 범위가 정수형보다 큽니다.
때문에 float형은 최대 표현가능한 지수를 통해서 최대 표시 가능 숫자가 나옵니다. 그리고 가수부분의 숫자가 어느 정도로 복잡하냐에 의해서 숫자의 정밀도가 달라집니다. 보통 float형의 최대지수는 10의 38제곱까지 가능합니다. 그러니까 1.0e+38이라는 표현을 통해서 최대 10의 38제곱이라는 엄청난 숫자를 표시할 수 있습니다. 그러나 가수부분의 숫자 때문에 보통 유효정밀도는 7자리를 삼습니다. 7자리까지는 오차가 거의 없다는 뜻이니 백 만 단위나 소수 7째 자리까지 별 오차가 없다는 뜻입니다.
그리고 double형은 최대 표현 가능한 지수가 308제곱이며, 유효정밀도는 16자리입니다. 조 단위까지도 오차 없이 사용할 수 있다는 뜻입니다.
**요약: 실수형 자료형(실수 상수)은 다음 같이 두 종류를 가장 많이 사용합니다.
자료형 사용 바이트 수 표현가능한 숫자 유효정밀도
float 4 10의 38제곱 7자리
double 8 10의 308제곱 16자리
문자 상수는 영문 1글자를 표시할 수 있습니다.
숫자가 아닌 문자형 자료 즉, 문자 상수로 char과 unsigned char 두 종류가 있습니다. char형은 1바이트를 사용합니다. 따라서 256가지 경우를 표현할 수 있습니다. 숫자로 말하자면 0~255까지 표현할 수 있는데, 이 숫자를 가지고 문자를 표시합니다. 즉 0~255까지의 숫자를 이용해서 아스키코드를 표현합니다. 이렇게 해서 문자 상수 1바이트로 영문 한 글자를 표시할 수 있습니다.
char형은 -128~127까지 사용하므로 음수도 사용합니다. 그럼 음수를 통해서 아스키코드를 표현할 수 있는가? 안됩니다. 그러나 C언어 프로그램에서는 char 상수가 음수일 경우에는 이를 128~255까지의 확장코드로 변환해서 사용합니다. 즉 unsigned char형은 0~255라는 숫자를 통해서 확장문자까지 표현하고, char형은 음수로 255번 아스키코드까지 표현할 수 있습니다.
**요약: char형 문자 상수는 1바이트를 이용해서 문자를 표시하는데 -128~127까지의 숫자를 통해서 문자를 표시합니다. unsigned char형 문자 상수는 0~255까지의 숫자를 통해서 문자를 표시하는 자료형입니다.
변수가 어떤 형의 자료형을 쓸 것인지 미리 알려주는 것이 '변수의 선언'입니다.
자료형을 이렇게 나누는 이유는 프로그램에서 다룰 자료의 형태를 미리 정해두고 다루기 위해서입니다. 때문에 변수나 상수를 사용할 때는 반드시 자료의 형태를 알려주어야 합니다. 예를 들면 'a라는 변수는 정수만을 다룰 것이다'라든지 'b라는 변수는 실수를 다룰 것이다'라고 알려주어야 하는데, 이것을 변수의 선언이라고 합니다.
**요약: 변수를 쓰기 위해서는 변수의 이름과 자료형을 미리 알려주어야 하는데 이를 '변수를 선언한다'고 표현합니다.
2.5.15. 변수의 선언방법과 정의방법, 초기화방법
변수를 선언할 때는 자료형을 적고 쉼표로 구분한 변수이름을 적어주면 됩니다.
변수의 선언방법은 사실 앞에서 이미 여러 번 사용했습니다. 다음과 같이 선언하면 됩니다.
int a;
int a, price, tax;
float a;
floadt a, dollar, won;
double rate;
char a;
char team, group;
변수를 선언할 때 변수의 값도 같이 대입해주는 것을 변수의 초기화라고 합니다.
먼저 자료형을 앞에다 적어주고, 한 칸을 띄고 변수이름을 적어주면 됩니다. 변수는 여러 개를 사용할 수 있는데, 쉼표로 구분하면서 여러 개의 변수를 동시에 선언할 수도 있습니다. 그리고 변수를 선언하면서 변수에 들어갈 내용 즉, 변수의 값도 같이 대입해줄 수 있습니다. 아래의 경우처럼 변수의 기본형을 선언하고 여기에 값을 대입하는 것을 변수의 초기화 또는 정의라고 말합니다. 그러나 가장 많이 쓰는 표현은 '변수에 값을 대입한다'는 표현입니다.
int price=35000, tax=-3500;
float dollar=1, won=800;
char teamname='a';
변수도 선언과 동시에 정의가 가능합니다.
앞서 함수의 선언과 정의에 대해서 설명드리면서 정의와 선언의 차이점을 설명드렸습니다. 변수에서도 선언은 앞으로 변수를 사용하겠다는 말 그대로 선언에 불과합니다. 그러나 정의는 변수의 본체를 밝혀줍니다. 다시 말해서 변수에 값을 대입하는 것은 변수의 정의에 해당합니다. 위의 예문처럼 int price=35000이라고 적으면 정수형 변수 price의 정체는 숫자 35000이 됩니다. 따라서 아래 예문의 경우는 변수의 선언과 동시에 정의도 이루어지는 경우가 됩니다.
이때 음과 양의 부호를 가지지 않는 자료 즉 양의 부호만 가진 자료를 다루겠다면 변수형 앞에 unsigned라는 낱말을 넣으면 됩니다. 정수형일 경우에는 unsigned만 넣어도 됩니다.
unsigned int price=35000;
unsigned long number;
unsigned char moonja;
이렇게 하면 price라는 변수는 이제 양의 정수만을 다루게 됩니다.
변수에 내용을 넣는 행위를 '변수에 값을 대입한다'고 표현합니다.
그런데 변수는 앞서도 몇 차례 말씀드렸듯이 내용이 계속 변하는 수입니다. 그러므로 변수에 다른 내용을 넣을 수도 있습니다. 이때 변수에 다른 내용을 넣는 동작을 보통 변수에 값을 대입한다고 말합니다. 보통은 다음과 같이 합니다.
price=35000;
price=35000+a;
price=a+b;
price=(a+b)*c
첫번째 문장은 price라는 변수에 35000이라는 숫자를 바로 대입한 것입니다. 이렇게 해서 price는 35000이라는 숫자를 지닌 변수가 됩니다. 두번째 문장은 35000에 a의 값을 더한 값을 대입한다는 뜻입니다. 세번째 a라는 변수와 b라는 변수를 더한 값을 price의 값으로 가지라는 문장입니다. 네번째 문장은 a라는 변수와 b라는 변수를 더한 뒤에 c라는 변수를 곱한 값을 price에 대입하라는 뜻입니다.
다시 한 번 앞서 배운 소스파일을 검토해가면서 설명하겠습니다. test005.cpp의 내용을 다시 살펴봅시다.
void main(void)
{ int a, b;
printf("INput Number: ");
scanf("%d",&a);
printf("Input number=%d \n",a);
b=a*a;
printf("input * input=%d \n",b);
}
변수는 사용 전에 반드시 선언해주어야 합니다.
함수 본체의 첫머리에 변수를 선언했습니다. int a, b; 라고 했으니까 정수형인 변수 a와 b를 앞으로 사용하겠다는 선언문입니다. 만약 이 선언문을 하지 않고 중간에 a나 b라는 변수를 쓰겠다고 하면 바로 에러가 나고 맙니다. 물론 컴파일할 때부터 에러가 납니다.
함수와 마찬가지로 변수는 사용 전에 반드시 선언해주어야 한다고 보면 됩니다. 꼭 그래야 할 필요는 없지만 보통 프로그램의 첫부분이나 함수 본체의 첫부분에 변수를 선언합니다. 그래야 그 함수에서 어떤 변수들을 사용하는지 쉽게 알아볼 수 있기 때문입니다.
변수는 선언했지만 변수에 값을 대입하지는 않았습니다. 따라서 값이 대입될 때까지 변수 a와 b는 아무 내용도 없는 빈 변수로 빈둥거립니다. 마치 아직 일감이나 자료를 받지 못해서 노는 직원과도 같습니다. 그러다가 3번째 줄에서 scanf() 함수를 통해서 입력받은 숫자를 a라는 변수에 대입합니다. 그리고 a*a를 해서 b에 대입합니다. 만약 입력받은 숫자가 5라면 a라는 변수에는 5가 들어가고 b라는 변수에는 25가 대입될 겁니다.
변수는 선언한 자료형에 맞는 변수만 대입해야 합니다.
그러다가 새로운 수를 다시 입력받으면 전에 받은 값은 버리고 새로 받은 값으로 변수를 채웁니다. 이때 알아두셔야 할 점은 선언한 자료형에 맞게 자료를 입력하고 출력해야 한다는 겁니다. 정수형으로 선언한 변수에 실수나 문자를 입력해도 안되고, 문자형으로 선언한 변수에 실수를 입력할 경우에는 에러가 발생합니다. 때문에 프로그램을 짤 때는 변수의 자료형을 잘 기억하면서 프로그램을 짜나가야 합니다.
**요약: 변수는 사용하기 전에 반드시 선언해주어야 합니다. 변수를 선언하는 방법은 자료형을 먼저 적고 변수 이름을 적는데 여러 개일 경우 쉼표로 구분해줍니다. 변수를 선언할 때 변수에 값을 대입할 수도 있으며 나중에 대입할 수도 있습니다. 변수에 값을
대입할 때는 자료형에 맞게 대입해야 합니다. 변수에 값을 대입하는 행위를 변수의 정의라고 합니다.
2.5.16. 연산자란?
프로그램에서 다루는 자료형에 대해서 대충 감을 잡으셨다면 이제는 실제로 각 자료를 이용해서 간단한 수학공식을 처리해보도록 하겠습니다. 다음과 같은 프로그램을 짜서 test008.cpp로 만들고 실행해보기 바랍니다.
// test008.cpp
#include
#include
void main(void)
{
int a=10, b=3, c; // 정수형 변수 a, b, c를 선언
c=a+b; // a+b의 값을 c에 대입
cout<<" a+b= "<
^^^그림: test008.cpp의 내용
이 프로그램을 실행시키면 화면에 아래와 같은 결과가 나올겁니다.
a+b= 13
a*b= 30
a/b= 3
^^^그림: test008.exe를 실행시켰을 때 나오는 화면
변수 C는 새로운 값을 대입시킬 때마다 이전에 가지고 있던 값을 버립니다.
함수의 내용을 한 줄씩 살펴보도록 하겠습니다.
int a=10, b=3, c;
정수형 변수로 a, b, c를 선언했는데 a에는 10이라는 정수를, b에는 3을 대입시켰고 c는 선언만 한 상태입니다.
c=a+b;
cout<<" a+b= "<
c라는 변수에 a와 b를 더한 값을 대입시켰습니다. 그러므로 c=10+3이 되어 13이 대입되었습니다. 그리고 cout 명령을 통해서 c를 화면으로 출력한 겁니다.
c=a*b;
cout<<" a*b= "<
이번에는 c 변수에 a와 b를 곱한 수를 대입시켰습니다. 그래서 c=30이 되었습니다. a와 b는 여전히 10과 3이지만 c는 전에 가지고 있던 13이라는 값을 버리고 새로 부여받은 30이라는 숫자를 가지게 된 겁니다. 역시 cout 명령을 이용해서 c가 가진 30이라는 값을 화면으로 출력했습니다.
c=a/b;
printf(" a/b= %d \n",c);
10÷3은 3.33...이지만 정수형이기 때문에 3이라는 계산결과를 돌려줍니다.
이번에는 c에 a를 b로 나눈 값을 대입시켰습니다. 10/3을 정확하게 계산하면 3.333...이라는 무한소수가 됩니다. 그러나 c라는 변수는 정수형이므로 소수 첫째 자리에서 반올림을 계산한 후에 밑을 잘랐습니다. 그래서 3이라는 숫자가 나온 겁니다.
**요약: 변수는 새 값이 대입되면 이전에 가지고 있던 값을 버립니다. 그리고 계산 결과는 자료형에 맞게 바뀌므로 정확한 계산결과를 원한다면 변수의 자료형에 주의하면서 사용해야 합니다.
덧셈, 곱셈 등에 이용하는 기호를 연산자라고 합니다.
이때 a+b라든지 a*b라는 계산을 할 때 사용하는 +나 * 같은 기호를 연산자라고 합니다. 수학을 배운 분이라면 대충 알고 있는 내용입니다. 그러므로 연산자의 개념을 어렵지 않게 이해할 수 있을 겁니다. C++언어에서 사용하는 연산자는 꽤나 종류가 많습니다. 그중에서 자주 사용하는 중요한 연산자만 적어보면 아래와 같습니다.
표: 중요한 연산자의 종류와 특징
구분 연산자 형태 결합방향 우선순위
으뜸연산자 () [] -> . -> ^
단항연산자 ! ~ ++ -- - * & sizeoff 캐스트연산자 <- |
(곱하기부터 논리OR까지 이항연산자에 속함)
곱하기, 나누기 * / % -> |
더하기, 빼기 + - -> |
밀기, 입출력 << >> -> |
비교 < <= > >= -> |
같음, 다름 == != -> |
비트AND & -> |
비트XOR ^ -> |
비트OR | -> |
논리AND && -> |
논리OR || ->
삼항연산자 ? : <-
대입연산자 = += -+ *= /= %= >>= <<= &= ^= != <-
순서연산자 , ->
결합방향은 좌우중 어느 쪽의 자료부터 계산을 하느냐를 따지는 것입니다.
결합방향이란 어느 쪽의 것부터 계산을 하느냐를 말합니다. → 표시된 방향은 왼쪽부터 차례대로 계산해서 오른쪽으로 계산한다는 뜻입니다. 더하기연산자(+)나 곱하기연산자(*)는 왼쪽에서 오른쪽으로 계산합니다. 그러니까 3+5+2이라고 할 때 먼저 3을 더하고, 다음에 3에 5를 더해 8을 만들고, 다음에 2를 더해서 10을 만드는 겁니다. 2*3*4/2라면 2에 3을 곱하고 여기에 다시 4를 곱하고, 이 수를 다시 2로 나누는 것입니다.
우선순위는 어떤 연산자부터 계산할 것이냐를 따지는 것입니다.
우선순위는 어떤 연산자부터 먼저 계산할 것인가를 정하는 겁니다. 표에서는 위에 적힌 것이 가장 우선순위가 높습니다. 그러니까 더하기(+) 빼기(-) 연산자보다는 곱하기(*) 나누기(/) 연산자가 더 우선 순위가 높으므로 곱하기 나누기부터 먼저 계산합니다. 2+3*4-8/4 라는 계산식이 있다면 3*4를 먼저 계산하고 8/4을 계산한 다음에 더하기와 나누기를 계산해야 합니다. 그러므로 2+3*4-8/4=2+12-2=14-2=12 가 됩니다.
**요약: 연산자란 어떤 수식이나 공식을 계산할 때 사용하는 기호를 뜻하는데 결합방향과 우선순위에 따라서 계산을 합니다.
C++언어에서 - 기호는 빼기의 뜻을 가진 뺄셈연산자가 아니라 대입의 뜻을 가진 대입연산자입니다.
연산자의 종류를 가만 보면 단항연산자의 -와 더하기 빼기의 -가 같아 보이는데, 단항연산자의 -는 음의 수를 뜻하는 마이너스부호이고, 빼기의 -는 왼쪽에 있는 수에서 오른쪽에 있는 수를 빼라는 빼기 기호입니다. 그리고 단항연산자의 &는 번지연산자라는 것입니다.
한 가지 주의할 점이 있는데 C++언어에서는 =가 수학에서 말하는 등식부호가 아닙니다. C++언어에서는 등식부호로 ==를 사용합니다. 즉 a==b라는 문장은 a와 b는 같다는 문장입니다. 그리고 a=b라고 하면 b의 값을 a에 대입하라는 대입연산자가 됩니다.
이러한 연산자를 모두 알 필요는 없습니다. 실제로 초급자가 사용하는 연산자는 수학시간에 배운 연산자 이상은 거의 사용하지 않기 때문입니다. 그러므로 필요한 연산자는 그때 그때 프로그램을 짜가면서 설명드리도록 하겠습니다.
연산자와 변수의 특성을 이용해 간단한 덧셈과정을 구현해봅니다.
이제 이 연산자를 이용해서 간단한 덧셈을 보여주는 소스파일을 하나 만들도록 하겠습니다. 다음과 같이 프로그램을 짜고 test009.cpp로 만들어서 저장하고 실행해보기 바랍니다.
// test009.cpp
#include
#include
void main(void)
{
int a=1; // 정수형 변수 a를 선언하고 1을 대입
초기화시킴
printf(" a= %d \n",a);
a=a+1; // a에 1을 더했기 때문에 a의 값은 2가
됩니다.
cout<<" a= "<
^^^그림: test009.cpp의 소스파일 내용
이 프로그램을 실행하면 다음과 같은 결과가 화면에 출력될 겁니다.
a= 1
a= 2
a= 3
^^^그림: test009.exe의 실행 화면
이 프로그램을 하나씩 살펴봅시다.
int a=1;
정수형 변수인 a를 선언하면서 1이라는 값을 대입시켰습니다.
printf(" a= %d \n",a);
a라는 변수를 %d에 대입시켜서 화면에 출력하라는 명령입니다. 현재 a라는 변수에는 1이 대입되어 있으므로 a= 1이 화면에 출력됩니다.
a에 a+1을 대입하라는 명령문이니까 a=1+1이 되어서 2가 대입됩니다. 그리고 이를 다시 화면에 출력하니 2가 나옵니다. 변수는 자신의 값에 어떤 연산을 한 결과를 다시 자신의 값으로 가질 수 있습니다. 연산자의 우선 순위가 있기 때문에 가능한 일입니다.
다시 a에 a+1을 대입하라는 명령문입니다. 현재 a에는 2라는 값이 들어가있는 상태입니다. 따라서 a=2+1이 되므로 3이 대입되고 'a= 3'이라는 문장이 화면에 출력됩니다.
지금까지 배운 내용을 잘 기억하고 이해하신다면 여러분은 간단한 글자를 화면에 보여주거나 간단한 숫자를 보여주는 프로그램을 만들 수 있습니다. 그러나 지금까지 배운 내용만으로는 더 복잡하고 경우의 수가 많은 경우를 처리하기 어렵습니다. 컴퓨터는 대량의 자료를 다루는 기계인데 대량의 자료를 다루기 위해서는 많은 작업과정을 컴퓨터 혼자서 하도록 자동화를 시켜주어야 하기 때문입니다. 그러므로 지금까지 배운 C언의 기본개념을 토대로 해서 다음 마당에서는 작업을 효율적으로 할 수 있는 자동화방법을 배우도록 하겠습니다.
**요약: 변수는 새로운 값이 대입될 때마다 이전에 있던 값을 버리고 새로 대입된 값을 가집니다. 또 연산자의 우선 순위에 따라서 자신의 값에 변화를 준 값을 다시 자신이 값으로 가질 수 있습니다.
[연습문제]
test008.cpp의 내용을 고쳐서 ex08.cpp로 저장합니다.
세 개의 변수 a, b, c를 선언하면서 a에는 99를 b에는 3을 대입합니다. a를 b로 더하고, 빼고, 곱하고, 나눈 네 가지 값을 c에 대입하여 각 결과의 값을 한 줄씩 차례대로 보여주도록 합니다.
[연습문제 정답]
// EX08.CPP -- 변수의 선언과 연산자 이용하기
#include
#include
void main(void)
{
int a=99, b=3, c; // 정수형 변수 a, b, c를 선언
c=a+b; // a+b의 값을 c에 대입
cout<<" a+b= "<