자료출처 : 권남수님의 Game Programming을 위한 C 강의

C 기본 개념

초보의 글이므로 잘못되거나 서투른 표현이 있을 것입니다. 그러나 읽는 분을 위해 최선을....


결론 : 게임 제작이 목적이라면 C의 필수 개념만을 간단하게 이해하고, 바로 DirecX로 진입합시다!


turbo C (도스용 2.0) 다운 Tc.zip (화일은 #kns 폴더에서 찾고, 저장하게 조정했음.)

【 순서 】

순서1 : 들어가기 전에
순서2 : C의 기본 형식
순서3 : C의 기본적인 내용
순서4 : C의 특징
순서5 : 기본 개념 잡기
순서6 : 자료형 (= 데이터형)
순서7 : 연산자
순서8 : 제어문


1. 들어가기 전에
비록 초보자이지만 제가 보는 관점에서는
- (VC의 바탕위에서 DirectX를 사용하여 C를 근간으로 사용하는) API 함수를 이용하는 방법으로 게임을 제작하고자 한다면 - C에 대한 자세한 이론보다는 아주 기본 개념만을 이해하고나서, 바로 DirectX로 진입하고 이 DirectX에서 게임 흐름을 눈으로 직접 확인하면서 부족한 개념을 재정리해 나가는 것이 휠씬 효율적인 방법이라고 생각합니다.

만약 C를 비록 100% 이해했다고 하더라도 윈도우 프로그래밍은 도스와 성격이 다르므로 결국 DirectX에서는 - 개인에 따라 생각이 다르겠지만 - 상당히 많은 부분들을 다시 배워야 한다고 판단되기 때문입니다. 그런 관점에서 이제부터 C에 대해 개념 파악의 수준으로 간단하게 정리해 봅니다. (물론 자세하게 공부하는 것이 기초를 튼튼히 해 준다는 점에는 전혀 이의가 없지만..) 게임 제작에 필요한 개념은 - 제가 직접 면전에서 설명한다면 - 2시간 소요 예상 분량 정도로!

C를 맨처음 대하는 분들이라면 자세한 안내서 1권 정도는 미리 보아두어야 할 만큼 처음 듣는 생소한 용어들이 많이 나옵니다. 아무나 그리고 누구나 C를 쉽게 이해할 수는 있는 언어는 결코 아니라고 생각합니다. 게임 제작에서 꼭 알아두어야 할 기본 개념들의 방향은 변수, 상수, 데이터형, 함수, 배열, 포인터, 구조체 등이 될 것입니다.

2. C의 기본 형식
C는 보통 다음과 같은 - main 함수가 있고 또 다른 함수들이 사용되는 등 - 형식을 취하고 있다.

#include <stdio.h>

void print(int);

void main( )
{
print(......):
}

void print(...)
{
printf(........):
}

3. C의 기본적인 내용
C는 - 한 마디로 "C는 곧 함수다" 라고 할 정도로 - 함수들을 많이 사용하고 있다. 그 중에서 main() 이라는 함수는 - 다른 함수와 달리 - 자신이 스스로 실행이 가능하며 또 프로그램에서 가장 먼저 실행되는 함수로써 아주 기본적인 것이다. 함수의 성질은 크게 2가지로 나뉜다. 즉, C를 만든 회사가 만들어 놓은 "내장함수"와 필요에 따라 내가 직접 만드는 "사용자 함수"가 그것이다.

"내장함수"는 사용하기 편하도록 한 개로 묶어 놓았는데 - 이것을 "라이브러리"라고 부르는데 - 곧 헤더 화일 (.h)이다. 즉, 소스의 제일 먼저 적게 되는 - #include <stdio.h> - 와 같은 stdio.h가 바로 헤더 화일이다.

main () 함수의 위치는 중요한 의미가 있다. 즉, 소스의 맨 뒤에 적을 때는 문제가 없지만, 소스의 맨 앞에 main () 함수를 적게 된다면 이 main () 함수 아래에서 사용하게 될 여러 함수들에 대해 "선언"이라는 절차를 해 줄 필요가 생긴다. 즉, 이러 이러한 함수들이 "main() 함수 이후에 사용됩니다!" 라고 미리 신고해 주어야 하는데 이것을 "함수의 선언"이라고 한다. 함수 선언을 할 때는 끝에 ";"을 붙여 주게 된다. "선언"(= 신고한다는 뜻으로 이해할 것)을 한 다음에 함수 "정의"를 하는데 이때 함수를 실제로 사용하게 되는 것이다. (이것은 - 변수를 사용하기 전에 선언해 주는 것과 - 마찬가지 이치이다.)

4. C의 특징
읽거나 말거나의 참고용 : C는 다음과 같은 특징을 가진다고 흔히 말하고 있다.

(1) 하드웨어를 직접 접근 하기 위한 특징

포인터(Pointer)를 사용한다. 어렵다고 하는 포인터를 왜 구태여 사용하려고 하는가? 포인터를 사용하면 하드웨어의 - 주소로 접근하는 방식을 사용하므로 - 주 기억 장치에 직접 접근이 가능하기 때문이다.

(2) Bit 연산자를 사용한다.
왜 복잡하게 Bit 연산자를 사용할까? Bit 연산자를 사용하면 바로 하드웨어 주 기억 장치의 내용을 직접 다룰 수 있기 때문이다.

(3) C는 단순하기에 좋다.
C는 왜 단순하다고 하는가? (표준 라이브러리) 함수들을 사용하기 때문이다. 타 언어는 소위 예약어를 많이 사용하여 복잡하지만, C에서는 이들을 함수로 처리하기에 단순해지는 효과가 생긴다는 것이다.

5. 기본 개념 잡기
(1) 주석
소스 내용에 대한 설명을 달아놓고 싶을 때 내 마음대로 사용할 수 있는 것이다. 2가지 방법으로 표현할 수 있다. 1줄로 된 소스가 있다면 주석은 - 흔히 아래의 - 방법1을 사용하지만, 2줄 이상의 경우라면 방법2를 사용하고 있는 편이다.

방법1 // 주석을 달아봅니다.
방법2 /* 주석을 달아봅니다.*/

(2) 상수(Constant)와 변수
변수에 상대되는 말이 상수이다. 변수란 변하는 숫자인 반면, 상수는 변경할 수 없는 것을 뜻한다. 변수는 상수보다 당연히 많이 사용되고 있다. 상수의 표현으로는 숫자뿐만 아니라, 문자도 가능하다. (자세한 것은 아래에서)

(3) 예약어 (상식적인 것이니 빨리 잊어버리자!)
언어에서 '이런 것을 사용합시다!'라고 미리 약속해 놓은 것이다. 즉, for, char, int 등을 말하는 것임. (C의 예약어는 타 언어에 비해 매우 적다고 한다.)

(4) 식별자 (상식적인 것이니 빨리 잊어버리자!)
간단하게 말하면, 변수 이름이나 함수 이름을 내가 정하는 것 그 자체가 식별자이다. 다만, 기본 원칙을 벗어나지만 않게 이름을 지으면 되는 것이다.

(5) 함수의 전달값과 반환값
함수에서는 전달값과 반환값이라는 - 즉, 값을 주고 받는 - 중요한 개념을 말한다. (뒤에서)

6. 자료형 (= 데이터형)
아래 예문에서 볼 수 있듯이 int a; 라고 표현했을 때 int를 자료형이라고 부르며, 또 a는 변수라고 부른다. 또 이렇게 int a;와 같이 적어주는 것을 "변수의 선언"이라고 한다.

그런데, C에서의 int 외에도 - char, float, long, double 등- 여러 종류의 자료형을 사용하고 있다. 그렇다면 왜 이토록 복잡하게 여러 형태의 자료형을 만들어 사용하는 것일까? 결론은 입력되는 자료를 구분시켜 주기 위해서이며, 또 메모리를 효율적으로 관리하려는 것이 그 이유다,

내가 어떤 글을 적든지간에 그 내용은 항상 메모리 즉, 소위 "램"에 저장된다. 즉, 어떤 자료라도 비디오 카드에 부착된 램이건 또는 보드에 있는 램이건 간에 이 "램"으로 들어가 메모리의 그 어느 구석이던지 간에 저장이 된다. 따라서, 내가 변수 a를 int로 선언했다면 그 내용들이 - 즉, 변수 a에 대하여 int형에 대한 성질, 크기의 입력 등에 대한 일체의 것들 - 메모리에 저장되어지며 또 나의 추가 입력을 기다리고 있을 것이다.

그런데, 이때 자료형의 하나인 int와 관련된 내용이 아닌 엉뚱한 다른 자료형의 정보를 넣어 준다면 오류가 일어난다. 그러므로 "이것은 정수요, 저것은 변수요, 이놈은 문자요, 이번에는 구조체라는 것을 보내겠다!"라는 식으로 각 상황에 일치되는 정보를 전해 주어야 한다. 예를 들어보자.

void main ()
{
int a, b, c: // 이렇게 a, b, c라는 변수를 모두 int (= 정수형 자료형)로 "선언"한 것은 문제가 없는데
a = 6; // 이렇게 a에다가 6이라는 정수를 넣으면 (이처럼 = 의 오른쪽에다 값을 넣는 것을 "초기화시킨다 "라고 함) 앞서 선언한 내용과 같으므로 문제가 없다.
b = 3.291; // 그러나, 이처럼 3.291이라는 소수값을 b에 넣거나
c= 'G'; // 라는 식으로 문자 G를 c에 넣는 등 자료형과 일치되지 않는 값을 넣는다면 오류가 난다.
}

이렇게 데이터형과 변수이름을 적어 주어 먼저 "선언"을 하고 나서, 이어서 = 의 오른쪽에 값을 넣어 주게 되는데 이것을 "초기화" 시킨다고 한다.

위에서 오류는 왜 일어날까? 그 이유는 변수 b와 c는 자료형을 int로 선언해 주었기 때문에 이때 = 의 오른쪽에 넣어주는 값도 또한 int 즉, 정수형과 어울리는 정수값을 넣어주어야 하기 때문이다. 따라서 해결하는 방법은 2가지이다. 즉, 처음부터 아예 float b; 나 char c;식으로 '소수'와 '문자'를 뜻하는 자료형으로 선언하거나 또는 =에 값을 넣을 때 b = 8; 또는 c = 50; 처럼 앞서 선언한 데이터형과 일치되는 값을 넣어주면 될 것이다.

C에서의 = 란 수학에서의 equal을 의미하는 것이 아니라, 오른쪽의 값을 =의 왼쪽으로 대입시켜 준다는 뜻이다. 이점은 매우 중요하므로 반드시 이해하여야 할 사항이다. 이처럼 = 의 오른쪽에다가 어떤 값을 적어서 그 값을 왼쪽에 있는 변수에게로 전달시키는 것을 "초기화 시켜준다"고 부른다. (물론 "값을 넣어준다"는 표현이 더 일반적이지만....)

만약 int a; 식으로 변수 선언만 해 놓고 =에 값을 넣은 초기화를 시켜 주지 않는다면 변수에는 소위 "쓰레기값"이 들어가게 되므로 문제가 된다. 그래서 초기화가 필요하게 되는 것이다. 따라서 아예 int a = 6;과 같이 변수 선언과 함께 값도 바로 넣어 주는 초기화 방법을 쓰기도 한다. (변수는 이렇게 그 초기값을 메모리 주소 어딘가에 담은 채 저장된다.)

C는 몇가지 데이터형을 가지고 있다고 했다. 이들 데이터형들은 아래 도표에서 볼 수 있듯이 각각 다른 크기를 가지고 있으며 또 그것들이 사용되는 숫자의 범위도 모두 다르다.

◇ 참고 : 비트와 바이트
컴퓨터의 최소 단위는 비트(bit)인데 사용상의 편의를 위해 비트 대신에 실제로는 "바이트"라는 단위를 더 많이 사용하고 있다. ( 8개 비트를 1 바이트(byte)라고 부른다) 데이터형의 크기를 나타낼 때도 모두 "바이트"를 그 단위로 표현하고 있다.

● 각종 데이터형(=자료형)의 종류와 바이트수 및 범위

데이터형
바이트 수
범위
   
문자형
char1 바이트 - 127 ~ 128
unsigned char1 바이트 0 ~255
정수형
int4 바이트 이하는 적기가 불편하기에 생략함.
unsigned int4 바이트
long4 바이트
unsigned long4 바이트
실수형
float4 바이트
double8 바이트

(주의 : 16비트 또는 32비트라는 기준에 따라 "바이트 수"의 크기도 달라진다.)

위에서 볼 수 있듯이 자료형의 종류는 크게 3가지인데, 그 중에서 실제로 많이 쓰이는 형은 다음과 같다. 즉, 문자형의 경우에는 char(=character)형을, 정수형의 경우에는 int(=interger)형을, 소수를 나타내는 실수형 의 경우에는 float형을 많이 사용한다. 또한, - 부호 여부도 따지게 되는데 - unsigned 라는 것은 "부호가 없는" 경우이지만, 부호가 있는 signed의 경우에는 signed라는 용어는 흔히 생략하여 표현한다.

// 계속

① 정수형 자료형의 경우에는 - int는 물론 - 크기에 따라 long, short, unsigned 등으로 표현할 수도 있다. 이때 정해진 크기를 벗어나는 값을 넣게되면 overlow가 된다. (정수형은 흔히 10진법을 사용하지만 때로는 8진법, 16진법으로 표현하기도 한다.)

② 실수형이란 '소수'를 의미한다. float와 함께 역시 크기에 따라 double로 교체할 수 있다.

③ 위의 것이 기본적인 것인데 기타 다른 자료형들 - 즉, 포인터형, 배열형, 구조체형 등 - 은 또 이에 준하여 각각 맞게 사용하면 된다.

(1) 상수와 변수
상수는 변하지 않는 수라고 했다. 한편, 변수는 위의 a, b, c의 예처럼 오른쪽에 내가 임의로 넣는 값에 따라 a, b, c의 값이 결국 변하게 되므로 변수는 변하는 수가 된다. 그리고, 이들 모두는 메모리에 그 내용들이 저장되겠지만 변수는 - 상수와 달리 - 이것이 해당 메모리가 있는 '주소'로 저장된다는 점을 잘 기억해야 할 것이다. 예를 들어보자.

a = b + 30;
변수 b에는 단순한 어떤값을 넣으면 되겠지만, 이들을 받아서 저장시키는 a의 경우는 '주소'로 저장된다는 말이다.

한편, 상수는 2가지 종류로 분류한다. 즉, - 일반 변수 선언과 초기값을 넣는 방법에다가 - 그 앞에 상수를 의미하는 const(=constant)라는 키워드를 붙여주는 방법이 그 한가지 방법이다. 즉, const int a = 6; 와 같이하여 상수임을 표현한다. 주의할 점으로는 상수란 변하지 않는 값이기에 - 변수처럼 - 다른 값을 나중에 또 넣으려고 한다면 에러가 당연히 난다. 그 이유는 상수란 - 어떤 정해진 값을 - 이미 넣어 두었기에 다른 수로 바꿀수는 없기 때문이다. 이것이 - 수를 다른 것으로 임의로 바꾸어 넣을 수 있는 변수와 - 다른 점이다.

또다른 상수의 표현 방법으로는 "매크로 상수"라는 것 - 예로 #define kns 45 - 이 있다. 이 매크로 상수는 매우 효율적이다. 즉, 45를 다른 값 - 예 2000 - 으로 바꾸고 싶을 때는 이 #define에서 #define kns 2000 처럼 단 1번만 적어주면 관련된 소스에서의 모든 내용들이 한꺼번에 확 바꿔지는 그런 효율성이 있기에 많이 사용하고 있다.

(2) 형변환
여러가지 자료형이 있음을 알았다. 이번에는 각종 데이터에 대해 (데이터)형변환을 시키는 "형변환연산자"를 살펴본다. 다른 자료형을 가진 변수들을 정수형 즉, int형으로 바꾸고 싶다면 다음의 예처럼 (int)와 같이 하면 그 뒤의 변수들이 int형으로 바뀌는 것이다. 이것이 형변환이다. 형변환연산자는 - 소위 캐스트 연산자라고 부르는데 - ( ) 안에다 바꾸고 싶은 데이터형을 적어주기만 나머지는 컴퓨터가 알아서 해결해 주는 듯 하다.

void main()
{
int a;
float b, c;

b = 10.09;
c = 32.905;

a= (int) (b + c);
위의 예에서 b와 c는 소수 즉, 실수(float)였지만 b와 c를 더한 값을 a에 넣고자 할 때 (int)를 사용하면 실수가 정수형(int)으로 바뀌면서 변수 a로 값이 전달된다.

(3) 문자
정수, 실수처럼 숫자가 아닌 글씨 즉, 문자를 사용하는 경우에는 아래 예처럼 해당 문자를 ''로 해당 문자를 감싸서 표현한다. 즉,

void main ()
{
char a;
a = 'Z';
이때 이 Z와 같은 문자들이 저장되는 방식은 메모리에 - 직접 문자로 저장되는 것이 아니라 - 내부에서 자체적으로 변환되어 사실은 "정수"로 저장된다.

(4) 문자열 (String)
앞의 문자는 단 1개의 문자가 사용되는 반면, 2개 이상의 문자가 사용되면 이는 문자열(=string) 이라고 표현하며 또한 이들은 서로 구분시켜 사용하고 있는데 다음과 같은 특징이 있다. 즉, 문자열을 표현 할 때는 ' '가 아니라 " "를 사용하며, 문자와 달리 문자열의 경우는 - 2개 이상의 문자가 존재하므로 - 저절로 문자 배열로 취급되며, 또한, 문자열의 끝에는 - 문장의 끝임을 알려주어야 하기때문에 - NULL 문자가 자동적으로 추가되어진다. 따라서 내가 8글자를 썼다면 사실은 9글자로 인식하게 되는 것이다. (배열과 관련된 내용은 뒤에서)

(5) 기타
(데이터) 형변환을 시킬 때는 앞의 (int) 방식처럼 바로 눈으로 확인할 수 있는 명시적 방법과 그리고 묵시적 방법도 있다.

다음 내용들은 게임 제작에서는 중요하지 않다. 즉, 출력을 시키는 printf 함수나, 입력을 받는 scanf 함수, 그리고 단일문자 입출력과 관계되는 getch()나 getche() 또는 putch() 등. 또 이들과 관계하여 쓰이는 %d, %s, %c나 확장열을 뜻하는 \n이나 \t 등도 일단 크게 신경쓸 필요는 없는 내용들이다.

7. 연산자
계산을 하기 위해 아래와 같은 많은 연산자들이 필요하게 되는데 대부분 직관적으로 이해할 수 있기에 이해에 큰 어려움은 없을 것이다.

① 4칙 계산
+는 더하기 이며, -는 빼기, 곱하기는 *를 사용하며, 나누기는 /를 쓴다. %는 나누기를 하고 남는 수를 뜻하는 연산이기에 이 경우에는 정수만이 해당된다.

② 증감 나타내기
++ 와 --는 증감을 나타내는데 이들을 쓰는 위치에 따라 의미가 다소 다르다. 즉, (a, b 값이 10이라면)
b = ++a의 경우는 변수 a에 먼저 값을 증가시킨 후에 그 결과를 b에 넣는다는 뜻이며 (a = 11, b = 11)
b = a++의 경우는 a값을 먼저 b에 넣은 후에 a를 증가시키라는 뜻임. (a = 11, b = 10)

③ 대입을 시킬 때
=는 수학에서 '같다'라는 뜻이지만, 언어에서는 오른쪽 값을 왼쪽으로 넣어준다는 뜻이다. 이외에도 +=가 사용되어 즉, a += b의 뜻은 a = a+ b를 뜻하며, -=도 사용되는데 즉, a -= b의 뜻은 a = a - b를 뜻하는 연산 이다.

④ 관계를 나타내는 것.
equal의 의미인 "같다"의 표현은 == 를 사용한다. != 는 같지 않다는 뜻, <는 작다는 뜻, >는 크다는 뜻처럼 왼쪽을 기준으로 표현한다. 따라서 <= 는 작거나 같다의 뜻, >= 크거나 같다의 뜻이다.

⑤ 논리를 나타내는 것.
&&는 - 흔히 논리곱으로 불리며, AND의 의미인데 - 그 앞뒤의 것을 모두 포함될 때의 조건을 말하는 것이며, ||는 - 흔히 논리합으로 불리며, OR의 의미인데 - 그 앞뒤의 것 중에서 아무거나 1개를 뜻하는 조건이다. !는 아니다(NOT)를 뜻함.

위의 ④ ⑤가 실제로 사용되는 경우는 참(1), 거짓(0)이 적용된다.

⑥ 비트 단위 연산자
이것은 - 흔히 사용하는 표현인 8비트 = 1바이트라는 그 - '비트' 처리를 한다. 주기억장치의 내용을 직접 다루게 되므로 2진수 계산을 하게된다. 비트 연산자 5가지 종류 중에서 '시프트 연산자'를 가장 많이 쓰게된다.

시프트 연산자는 다시 <<와 같은 좌측 시프트 연산자와 >>와 같이 표현하는 우측 시프트 연산자로 나뉜다. 또한, 좌측 시프트는 차이가 없지만, 우측 시프트는 다시 산술 시프트와 논리 시프트로 나뉜다. 시프트 연산자는 '비트'를 좌측 또는 우측으로 이동시키면서 0을 채우거나 또는 1을 채우게 된다. 특히, 한글 출력을 할 때 비트 연산은 필수적이라고 한다. (차후 정리)

⑦ 조건 연산자.
x < y ? y : x; 와 같이 이상하게 보이는 꼴도 사용하는데, 이것을 조건 연산자라고 한다. 이것을 풀어쓰면

if(x<y) // 이것이 조건임.
then y
else x 의 의미이다.

즉, 식1 ? 식2 : 식3일 경우 식1 이것이 "조건"을 뜻하는데 즉, x < y의 상태를 따져서 참(1)이면 식2의 값을 적용시키고, 거짓(0)이라면 식3의 값을 적용시켜서 사용한다.

⑧ sizeof 연산자.
sizeof(int); 식으로 사용되며 ( )안에 있는 데이터형의 메모리 크기를 구하는 연산자로써 사용 단위는 - 비트가 아니라 - 바이트를 사용한다.

예를 들어 ( )안에 int형을 썼다면 int는 정수이기에 4바이트라는 값이 나올 것이다. sizeof(char);는 문자형이기에 1바이트라는 값이 나온다. 실수형의 하나인 double형의 크기는 sizeof(double);은 8바이트. ( )에 들어갈 그 대상으로는 배열도 가능한데 그래서 배열의 메모리 크기도 알 수 있다.

⑨ 형변환 연산자 = 캐스트 연산자
이것은 각종 데이터형을 내가 원하는 데이터형으로 바꿀 수 있는 연산자인데 내가 원하는 데이터형을 ( )안에 써 주면 되는 간단한 개념이다. 예를 들면 (변수 c가 정수이고, 변수 d가 실수라고 가정할 때) c = (int)d; 처럼 사용한다. 즉, 실수 d를 int형 즉 정수로 바꾸어서 그 값을 정수인 c변수로 전달한다는 뜻이다.

위에서 공부한 연산자에는 '우선 순위'라는 개념도 있다.

8. 제어문
앞에서 공부한 내용들 - 변수나 연산자의 경우 - 은 적힌 순서대로 적용되는 내용이라면, 이제 공부할 내용들은 - 조건과 제어에 의해 - 프로그램의 진행 순서를 인위적으로 변경시키는 내용을 공부하게 된다.

이들을 크게 분류하면 if, switch, while, for문 이며, 보조적인 제어문으로 break, continue 문 등이 있다. (goto는 중요하지 않으므로 생략한다.)

이 내용에는 어떤 '조건'이 따르게 된다. 따라서 그 조건에 만족이 되면 그에 맞게 처리를 하고, 또 조건이 맞지 않는다면 또 그에 따른 문장 처리를 해 주면 된다. 구체적인 예문들은 책에 많이 있으므로 여기서는 기본 개념만을 중심으로 간단하게 정리하고자 한다.

참고 : 참, 거짓에 대해서
C에서는 부울값(Boolean, 흔히 BOOL로 표현) 즉, 참과 거짓을 나타내는 뜻인데 이것을 구분해 주어야 할 때가 많다. 그리고, 부울값으로 정수로 표현하게 되는데 그 실제 사용법은 다음과 같은 논리를 적용한다. 즉, 거짓일 때는 0을 사용한다. 따라서 거짓이 아니라면 모두 참이 되어 보통 1을 사용한다. 참이란 이렇게 - 0 이외의 - 어떤 숫자를 써도 좋다고 뜻으로 해석된다.

① if문
if문에는 어떤 조건이 나온다. 조건이 맞으면 그대로 처리하고, 만약 조건에 맞지 않는다면 else 문의 내용으로 처리하게 된다. 개념은 쉬운 것이며, 많이 사용된다. 한 줄로 이루어진 문장이라면 끝에 ; 를 붙이겠지만, 여러 줄로 구성된 문장이라면 - main 함수의 경우처럼 - 중괄호인 { 와 }로 묶어주게 된다.

② switch문
위의 if문은 조건이 맞다 또는 맞지 않다는 등의 단순히 2가지 조건을 따질 때에 사용되는 반면, 이 보다 조건이 더 많을 때는 switch문을 사용한다.

switch문에서의 조건은 - switch (변수 또는 정수 ) - 처럼 표현하게 되는데 이 내용을 이제 여러개의 case별로 따지게 된다. 조건 내용과 같은 값이 case에 나타나게 된다면 제어를 바로 그 쪽으로 옮겨 각각 처리한다. 이 경우 { }와 같은 블럭을 사용할 필요는 없다.

이때 각각의 case별로 일을 처리하고 나면 항상 break문이 사용되는데 이것은 "끝내버리라는 뜻"이므로 바로 탈출하게 된다. (break문은 - switch문 이외에도 - 이와 같은 역할로 많이 사용되고 있다.)

그런데 만약 case 상황에 맞는 것이 없다면, 맨 아래에 위치한 default문을 수행한다. (switch문은 if문에 비해 구조적인 구문이기 때문에 보기에도 좋다.)

③ for문
(위의 if문과 switch문에 비해) 아래의 for문과 while문은 계속 "순환"시키는 특징이 있다. 즉, 반복할 것인가 또는 중지할 것인가가 이들 문들의 특징이다. 이처럼 어떤 일에 대해 반복 처리시키는 것을 '순환문'이라고 하며 for는 다음과 같은 형태를 사용하면서 반복을 유도하고 있다.

for(i = 1; i<= 100; i++)

for문은 위와 같은 형식을 주로 취한다. 이외에도 - 증감식을 따로 떼어서 표현하거나 또는 for(;;)와 같은 방식을 사용하는 등 - 의 표현 방법들도 사용된다.

( ) 안쪽에는 3가지 내용이 들어가 있다. 변수를 i로 설정했다면, i=1라는 것은 '초기값'을 의미하는 표현이다. 즉, 맨 처음 값을 1로 시작하겠다는 뜻이다. 그리고 i<= 100;은 순환시킬 마지막 값을 의미하며, 끝의 i++는 증감의 정도를 나타낸다. 위 3가지는 흔히 초기식; 조건식; 증감식이라고 부른다. 따라서 위 내용은 1부터 시작하여 1씩 증가시켜 나가면서 100까지 계속 순환시키겠다는 뜻이다.

또한, for문 안에 또 다른 for문을 넣는 - 순환 계산을 잘 이해하고 있어야 할 내용임 - '다중 for문'도 실제로 많이 사용되고 있으며 (구구단 예문 참고), 조건을 2가지로 만들어 '다중 조건"시켜 쓰기도 한다.

while문
한편, while은 - for는 1부터 100까지 라는 식의 순환 크기가 정해져 있지만 - 순환 크기가 정해지지 않은 특징이 있다. 그래서 while문은 - 탈츨을 시키지만 않는다면 - 그야말로 '무한 루프'로 계속 순환된다.

while( )의 ( )안에는 순환 여부에 대한 '조건'이 들어가게 되는데 - 결국 - 0만 아닌 상황이라면 모두 참이 되어 무한루프가 된다. 즉, while(0)은 거짓이 되지만, 그 밖의 상황 즉, 흔히 while(1) 처럼 - 식을 사용하는 대신 이처럼 숫자로도 - 많이 표현하게 되는데, 참이 되므로 무한 루프가 된다. 그냥 while( ) 처럼 표현해도 역시 1로 간주된다.

또한, ( )안에 들어가는 이러한 조건의 형태는 조건식을 사용하기도 하는데, 이러한 무한루프를 탈출시키고자 한다면 break문이 사용된다. (그 밖에 do ~ while문과 같은 형식을 취하여 표현하기도 한다.)

⑤ break, continue문
이들을 '분기문'이라 부른다. 즉, 조건에 관계없이 지시하는 곳으로 바로 이동시키는 명령이다. break는 - 진행시키지 말고 - 해당 블럭을 탈출하라는 뜻이고, continue는 break와 상대되는 개념이다. 즉, 조건식으로 다시 돌아가 계속 진행시키라는 뜻이다. (조건을 만족시키지 못할 때는 물론 다음 명령을 수행해야 겠지만..) 그 밖에 goto문이 있어 label이 있는 곳으로 가서 실행시키는 방법도 있다. break가 switch문에서 항상 사용되는 반면, continue는 while, for문에서 항상 사용된다.
(끝)

2005/08/19 04:13 2005/08/19 04:13
Trackback address :: http://4ellene.net/tt/trackback/317

Comments List

  1. female ejaclation 2008/05/23 05:30

Write a comment.

[로그인][오픈아이디란?]