728x90

기본 데이터형 int

이제부터 C에서 사용하는 기본 데이터형의 특징을 살펴볼 것입니다. 여러가지 데이터형의 변수를 선언하는 방법, 5 또는 2.78과 같은 리터럴 값으로 상수를 나타내는 방법, 변수를 사용하는 방법을 설명할 것입니다. 일부 오래된 C 컴파일러들은 일부 데이터형들을 지원하지 못할 수도 있으니 어떤 데이터형을 사용할 수 있는지 미리 확인해주세요.


int형
C는 다양한 정수형을 제공합니다. 굳이 여러 개를 제공하는 이유는 프로그래머가 용도에 따라 선택해서 사용할 수 있게 하기 위해서입니다. 특히, C의 정수형들은 제공되는 값의 범위와 음수의 사용 여부에 따라서 자료형이 달라질 수 있습니다. 정수의 기본 형태는 int형이지만, 특정 작업을 할 때나 컴퓨터의 요구에 따라 다른 선택을 해야 할 수 있습니다.

int형은 부호가 있는 정수형(signed integer)입니다. int형은 반드시 정수여야 하며 양수, 음수, 0이 될 수 있습니다. 허용되는 값의 범위는 컴퓨터 시스템마다 차이가 있지만, 일반적으로 int는 해당 컴퓨터의 1워드 크기로 저장됩니다. 따라서 16비트 워드를 사용하는 구형 IVM PC 호환 기종에서 int는 16bit로 저장됩니다. 이것은 -32768에서 32767까지의 값 범위를 허용합니다. 컴퓨터의 1워드 크기에 따라 다른 범위를 가질 수 있습니다. 일반적으로 현재의 PC들은 32bit와 64bit 프로세서를 사용하고 있지만, 64bit의 경우 int형의 크기가 반드시 8byte(64bit)여야 할 필요는 없습니다. 만일 64비트의 int형을 8byte로 설정할 경우 32비트에서 64비트로 가면서 모든 프로그램을 수정해야 할 수도 있기 때문이라고 합니다. ISO C에서도 int형의 최소범위만을 지정하고 있는데, -32767부터 32767이라고 규정하고 있습니다. 또한, 컴퓨터 시스템들은 1bit의 값을 부호를 지정하는 데 사용합니다.


int형 변수의 선언
앞의 강좌에서 보았듯이 키워드 int는 정수형 변수를 선언하는 데 사용됩니다. 변수를 선언하는 방법은 int를 맨 앞에 적고, 그 뒤에 변수의 이름을 적고, 마지막에 세미콜론을 붙입니다. 여러 개의 변수를 선언하려면, 각각의 변수들을 따로따로 선언하거나, int를 맨 앞에 적고, 쉼표로 분리한 변수 이름들의 리스트를 적어준 다음, 세미콜론을 붙여주면 됩니다.

int one;
int two, three, four;

각각의 변수를 하나씩 따로따로 선언해도 되고, 4개의 변수를 하나의 선언문에 몰아서 선언해도 됩니다. 둘 다 결과는 같습니다. 즉, 4개의 int형 변수를 위한 기억 공간을 할당한 뒤 각각 변수들과 연결합니다.

이와 같은 선언들은 변수를 만들지만, 값을 넣어주지는 않습니다. 그렇다면 변수에 값을 대입하기 위해서는 어떻게 해야 할까요? 프로그램에서 변수가 값을 얻게 되는 두 가지 방법을 우리는 이미 살펴보았습니다. 먼저 대입이 있습니다.

one = 1;

두 번째 방법으로는, 특정 함수에 의해 값을 전달받는 것입니다. (예를 들면, scanf()) 우리는 이제 세 번째 방법에 대해 알아볼 것입니다.


변수의 초기화
변수를 초기화(initialize)한다는 것은 변수에 초깃값(또는 시작 값)을 대입하는 것입니다. C에서는 변수를 선언하면서 초기화를 같이 할 수 있습니다. 변수 이름 뒤에 대입 연산자(=)를 적은 후, 대입할 값을 적으면 됩니다.

int one = 1;
int two = 2, three = 3;
int four, five = 5;        // 이렇게 초기화하는 것도 가능은 하지만, 좋은 방법이 아닙니다.

마지막 라인에서는 five 변수만 초기화됩니다. 언뜻 보기에는 four 변수도 5로 초기화된다고 생각할 수 있어서 초기화시킬 변수와 초기화시키지 않을 변수를 같은 라인에 적는 것은 피하는 것이 좋습니다.

정리하면, 위의 선언들은 변수를 저장하기 위해 기억 공간을 할당하고, 그 공간에 변수의 이름을 연결한 다음, 각각의 변수에 초깃값을 대입합니다.


int형 상수
위의 선언에서 1, 2, 3, 5는 정수형 상수(integer constant)입니다. 정수형 리터럴(integer literal)이라고도 부릅니다. C는 소수점과 지수가 없는 수를 정수로 인식합니다. 따라서 10-10은 정수형 상수이지만, 10.0-10.0 그리고 10E2는 정수형 상수가 아닙니다. C는 대부분의 정수형 상수를 int형으로 취급하지만, 매우 큰 정수는 다르게 취급될 수 있습니다.


int형 값 출력
printf()
함수를 이용하면 int형의 값을 출력할 수 있습니다. 2장에서 살펴봤듯이 %d는 정수가 출력될 위치를 지정해줄 때 사용됩니다. printf()가 값을 출력할 때 이처럼 포맷을 지정해주기 때문에, %d를 포맷 지정자(format specifier)라 부릅니다.

포맷 문자열에 있는 각각의 %d는 출력될 값들의 리스트에 있는 각각의 int 값의 개수와 정확히 일치해야 합니다. 그 값은 int형 변수, int형 상수 또는 계산 결과가 int 값인 수식이 될 수 있습니다. 예제 3.2는 변수를 초기화하고 변수의 값, 상수의 값, 수식의 결괏값을 출력하는 간단한 프로그램입니다. 또한, 이 프로그램은 printf() 함수를 사용할 때 주의하지 않으면 무슨 일이 벌어질 수 있는지를 보여줍니다.

예제 3.2 - printint.c 프로그램 

/* printint.c -- printf()의 몇 가지 특성을 확인 */
#include <stdio.h>

int main(void) {
    int ten = 10;
    int two = 2;

    printf("포맷 지정자를 올바르게 지정했을 때 \n");
    printf("%d - %d = %d \n", ten, 2, 10 - two);

    printf("포맷 지정자를 틀리게 지정했을 때 \n");
    printf("%d - %d = %d \n", ten);    // 뒤의 전달인자를 두 개 빼먹었습니다.

    return 0;

}


이 프로그램을 어떤 시스템에서 컴파일하고 실행시켰더니 다음과 같은 결과가 나왔습니다.

포맷 지정자를 올바르게 지정했을 때
10 - 2 = 8
포맷 지정자를 틀리게 지정했을 때
10 - 17961030 = 17961030


두 번째 출력 라인에서, 첫 번째 %dint형 변수 ten을 나타내고 있습니다. 두 번째 %dint형 상수 2를 나타내고, 세 번째 %d는 결괏값이 int형인 수식 10 - two의 값을 나타냅니다. 네 번째 출력 라인에서, 프로그램은 첫 번째 %d를 위한 값을 제공하기 위해 ten을 사용했습니다. 하지만 나머지 2개의 %d에 대해서는 정의해주지 않아서 현재 메모리에 들어있는 엉뚱한 값들이 나왔습니다. (독자의 실행 결과는 위와 다를 수 있습니다. 실행될 때 메모리의 내용이 다를 뿐만 아니라, 서로 다른 컴파일러들은 서로 다른 방식으로 메모리를 관리하기 때문입니다.)

컴파일러가 이처럼 명백한 에러를 잡아내지 못하는 이유는 printf()의 특이한 설계 때문에 벌어진 일입니다. 함수 대부분은 전달인자의 개수가 정해져 있습니다. 그래서 컴파일러는 정확한 개수의 전달인자가 사용되었는지를 확인할 수 있습니다. 하지만 printf() 함수는 전달인자를 사용하지 않거나, 한 개 이상의 전달인자를 사용할 수 있습니다. 또한, 컴파일러가 에러를 검사하는 통상적인 방법을 자신에게 적용하지 못하도록 막습니다. 하지만 일부 컴파일러들은 특별한 방식으로 에러를 확인하고 프로그래머가 무언가를 잘못하고 있다고 경고합니다. 그렇더라도 printf() 함수에 제공하는 포맷 지정자의 개수와 출력할 값의 개수가 일치하는지 항상 확인하는 것이 좋습니다.

728x90
728x90