C언어도 다른 언어와 같이 데이타형(deta type)을 지정할 수 있다. 프로그램을 작성할 때 제일 먼저 생각해야 될 것은 사용하려는 데이타가 어떻게 표현되는지이다. 데이타의 형을 잘못 선택하면 쓸데없는 메모리의 손실을 초래할 수 있을 뿐더러 처리의 효율이 저하될 수 있기 때문이다. 이번 호에서는 C언어에서 사용할 수 있는 데이타형을 알아보고 연산자의 종류를 살펴보기로 하자.
출력 지정 약식
C언어에서 여러 데이타를 변수에 기억시키지 않고 곧바로 출력시키는 예제를 실행시켜보고 각각 출력 지정 양식을 설명하여 보겠다. (프로그램1)은 C언어에서 사용 가능한 데이타를 printf라는 함수를 이용하여 출력시켜 본 것이다.
(프로그램1)에서 사용한 % 출력지정자는 데이타를 출력시킬 때 그양식을 지정하기 위한 것이며 출력되는 데이타의 형에 따라 (표1)과 같이 사용한다.
그리고 출력형식을 지정하는 또하나의 출력제어문자인 "\n"가 사용되고 있는데 이를 '역사선 제어 문자열'(backslash control)이라 부른다. (표2)는 이를 정리해 놓은 것이다.
(프로그램1)의 "\n"의 의미는 다음현으로 출력을 옮긴다는 의미로 '한줄을 넘긴다'로 해석하면 된다. 역사선 제어문자는 출력양식 지정과 혼합되어 사용할 수 있다.
(프로그램1)은 (프로그램2)처럼 변환시켜 볼 수 있다. 그리고 (프로그램3)에서 처럼 하나의 printf문으로 처리할 수도 있다.
이제 출력양식을 이용하여 고급의 출력 데이타를 다루어 본다. (표1)의 출력 양식 지정은 지정된 양식에 따라 데이타를 그대로 출력하는 것이며 데이타의 크기에 따라 그 출력된 형태가 다를 수 있다. 따라서 일정한 출력양식을 갖게끔 그 크기를 결정하도록 C언어는 구간 지정을 할 수 있다.
(프로그램4)는 여러가지 출력양식에 대해 구간 지정의 한 예를 보인 것이다. 실행 결과를 보면 구간 지정을 위해 사용된 수자의 의미를 이해할 수 있을 것이다. 표현하려는 데이타와 출력양식 지정자의 일치가 선행되어야 한다.
(프로그램4)에서 출력 양식의 구간을 지정하는 수자앞에 붙은-기호는 출력을 구간내에서 좌로 밀착시키라는 뜻이다. 그리고 소수점 오른쪽의 수자는 소수점이하의 표시자리수를 나타낸다.
데이타형 선언
C언어에서 취급하는 데이타형은 7가지가 있는데 그중 수자는 크게 정수형과 실수형으로 나누어진다. 7가지의 데이타 형은 다음과 같다.
unsigned
short
long
int
char
float
double
각 데이타형에 해당하는 데이타에 대해 사용 변수를 지정하기 위해 변수 선언을 하며 정수형 데이타는 unsigned, short, long, int를 사용하게 된다. 선언하는 방법에 따라 정수의 표현 구간이 다름을 유의해야 한다.
실수형 데이타는 float, double 을 사용하여 변수 선언을 하게 되며 유효자리 수의 크기에 따라 선언을 달리한다. float는 단정도(single precision) 실수에 대해서 선언하고 double 은 배정도(double precision)에 대해 선언한다.
문자에 대한 변수의 선언은 처리문자수에 따라 달라지게 되는데 단일문자일 경우에는 변수명만 쓰면되나, 문자열을 처리하도록 변수를 선언하려면 *기호를 변수명 앞에 붙여야 한다.
(프로그램5)는 변수선언의 예를 보여준다. (프로그램4)에서 데이타를 printf 함수를 사용하여 직접 출력하였으나 변수를 선언한 후 각 변수에 데이타를 기억 시켜놓고 이를 출력하고 있다. 출력 결과는 똑같다. (프로그램5)에서 사용된=기호는 대입문을 구성하기위해 사용된 것이다. 따라서 =우변의 값을 계산하여 =좌변의 변수에 기억시키는 의미로 해석되어야 한다.
변수의 초기화
C언어에서는 변수를 선언할 때 그 변수의 초기값을 줄 수 있다.
int i ;
i=5 ; 라고 쓰는 대신에 int i=5 ; 라고 쓸 수 있다.
(프로그램6)은 변수의 초기값을 변수 선언시에 처리해준 예이다.
정수 변수 선언의 예로 (프로그램7)을 보자. 정수데이타의 크기에 따라 여러 데이타형을 선언할 수 있으나 컴파일러에 따라서는 제한적으로 사용되는 수가 있다. 일반적으로 int와 long을 많이 시용하는 편이다.
(표3)은 정수데이타형에 따라 수의 사용 범위를 정리해 놓은 것이다.
(프로그램8)은 실수형 데이타 처리를 위한 실수 변수선언의 예를 보인 것이다. float와 double은 유효자리수와 지수의 크기가 서로 다르다.
배열 선언
C언어의 배열 선언은 〔 〕기호를 이용하여 그 크기를 지정하게 된다. 이 때 변수의 데이타 형이 선언되는데 주의할 것은 〔 〕기호속의 수자가 첨자의 최대 값을 나타내지 않는다는 것이다.
이 수자가 단지 배열에서 사용할 수 있는 데이타의 개수를 의미하기 때문이다. 따라서 프로그램을 작성할 때는 첨자(subscript)를 0부터 사용하기 때문에 최대첨자는 〔 〕속의 수자에서 하나를 뺀 수이다.
(프로그램9)는 배열 선언의 예를 보인 프로그램이며 float j〔3〕으로 선언된 배열 변수에 j〔2〕=1.23456으로 값을 기억시킨 것은 배열의 제일 마지막 원소의 값을 1.23456로 한다는 뜻이다.
j〔3〕의 데이타를 사용할 수 없다는 것을 알기위해 j〔3〕=1.23456으로 문장을 바꾸어서 실행시켜보면 처리할 수 없다는 메시지가 출력될 것이다.
문자열 처리
C언어에서는 문자열을 배열로 선언한뒤, 각 문자 하나씩 처리하기 위한 포인터(pointer)를 쉽게 이용할 수 있다. 특별하게 포인터 변수라고 부르기도 하지만 C언어에서는 포인터의 개념을 잘 이해하여야만 특수한 구조의 데이타를 처리할 수 있다. 여기서 말하는 포인터는 데이타가 기억된 위치를 가리키는 화살표라 생각해도 된다. 즉 다음 그림처럼 지정된 데이타를 가르킨다.
다음 (프로그램10)에서는 정수 i, *j가 선언되어있고 i에 정수 데이타 1 2 3을 기억시켜놓았지만 *j 포인터 변수가 변수i를 가리키도록 j=&i 문을 사용하고 있다.
&연산자는 어드레스연산자(address operator)라 부르며 i변수의 기억 위치를 계산해준다. i변수의 기억 위치는 한번 할당되면 프로그램이 끝날때까지 변화하지 않는다. 반면에 *j포인터 변수의 j의 값을 &연산자에 의해 여러값을 지정 할수도 있고, j에 대해 연산이 가능하기 때문에 *j포인터 변수의 값은 항상 같은 위치에 기억되지 않는다.
포인터 변수를 문자열 혹은 배열에 이용할 때는 문자열이나 배열의 처음 번지를 포인터 변수에 지정해주면 된다. (프로그램11)은 문자배열과 문자열 변수의 관계를 포인터 변수로 나타내 본 것이다.
구조체 표현 방법
구조체는 하나의 단위로 볼 수 있는 여러 종류의 변수들의 집합을 의미한다. 이 구조체를 사용하여 관련된 데이타의 집합을 통일적으로 취급할 수 있는 것이다. 구조체 멤버(member)의 선언은 다음과 같이 한다.
struct 구조체명 {
구조체 멤버
} 구조체 변수명;
(프로그램12)은 두개의 구조체 변수 x y를 선언한뒤 구조체변수에 데이타를 기억시키기 위해·(period)를 사용하여 해당 멤버를 지정한다. (프로그램12)의 구조체 변수는 구조가 같기 때문에 이를 하나로 묶어서 선언할 수 있다.(프로그램13)에서 알 수 있듯이 구조체변수명 은, 를 사용하여 동일 구조를 선언할 수 있는 것이다. 실행결과는 (프로그램12)과 같다.
구조체 변수를 선언하기위해 프로그램내에서 미리 선언되어있는 구조체를 이용하는 경우 (프로그램14)에서와 같이 구조체 이름을 미리 등록하고 이를 변수 선언에서 사용하면 된다. (프로그램14)의 실행 결과는 (프로그램12) (프로그램13)과 같다. 필요에 따라 사용하기 편한 방법을 선택하여 실제적 프로그램 작성에 응용할 수 있도록 그 사용법을 충분 하게 이해하길 바란다.