본문 바로가기

Studying/Computer Programs

C언어 프로그래밍 기초 : 변수와 자료형

여기서는 C언어로 프로그램을 작성하는데 있어서 가장 기본적인 요소들 중 하나라고 할 수 있는 변수 (variable)에 대해서 알아봅시다. 변수들의 종류를 지정하기 위한 다양한 자료형 (data type)들이 어떤 특징을 가지고 있는지에 대해서도 살펴보겠습니다. 이번 포스팅에서는 C언어 프로그램에 대해서 이야기합니다만, 여기서 다루는 내용들은 C++ 프로그램에서도 대부분 적용할 수 있습니다.

 

반응형

 

변수의 선언

컴퓨터 프로그램의 변수에 대해서 간단히 말하자면 데이터를 저장하기 위한 공간이라고 할 수 있습니다. 프로그램에서 사용하는 변수들은 메모리 혹은 RAM이라고도 부르는 주기억장치에서 할당받은 공간을 차지하게 됩니다. 그리고 프로그램 내의 여러 명령문에 따라서 변수들의 값이 달라지게 되죠. 다만 프로그램이 종료되면 메모리를 점유하고 있던 변수들 역시 사라지기 때문에, 변수들에 저장된 값들을 계속 사용하고 싶다면 파일의 형태로 보조기억장치에 저장해둘 필요가 있겠습니다.

 

변수를 사용하기 위해서는 먼저 해당 변수의 존재를 알려야 합니다. 이를 두고 변수의 선언 (declaration)이라고 하는데요. 변수의 자료형과 이름을 포함한 선언문을 소스 코드에 추가해야 합니다.

 

[자료형] [변수 이름];

 

변수 이름에는 알파벳 대소문자 및 밑줄 문자 (_)를 사용할 수 있습니다. 마지막에 붙은 세미콜론(;)은 C언어나 C++ 프로그램의 소스 코드에서 줄의 마지막을 가리키기 위해 사용됩니다. 쉼표 혹은 콤마(,)를 사용해서 동일한 자료형을 가지는 여러 변수들을 동시에 선언하는 것도 가능합니다.

 

[자료형] [변수1 이름], [변수2 이름], [변수3 이름];

 

예를 들어서 numvar이라는 이름을 가진 정수형 변수를 프로그램 내에서 사용하고 싶다면 다음과 같은 선언문이 필요합니다.

 

int numvar;

 

이 선언문은 numvar이라는 변수가 소스 코드에서 맨 처음으로 사용되는 위치보다 위에 있어야 합니다. 소스 코드에 있는 명령문들은 순차적으로 실행되기 때문에, 변수의 존재를 알아야 그 값을 바꾸고 사용할 수 있기 때문이죠.

 

자료형

자료형은 어떤 종류의 변수인지를 지정하기 위한 목적으로서, 저장하고자 하는 데이터가 문자, 정수 (integer) 혹은 실수 (floating number)인지에 따라 달라지게 됩니다. 데이터의 형태에 따라 서로 다른 값을 가질 수 있는 경우의 수가 다르기 때문에, 자료형의 크기가 달라지게 됩니다. 다시 말해서 메모리에서 얼마나 많은 용량을 차지하느냐가 자료형에 따라 달라지는 것입니다.

 

변수들의 값을 입력하거나 출력하는 경우에는 어떤 자료형을 다루고 있는지 컴퓨터에게 알려줄 필요가 있는데요. 이를 위해서 자료형마다 서로 다른 서식 지정자 (format identifier)를 가지고 있습니다. 입출력을 위한 printf, fprintf, scanf, fscanf 함수 등을 호출할 때, 인자로 들어가는 문자열 내에 서식 지정자를 포함시킴으로써 변수들의 값을 입력하거나 출력할 수 있는 것입니다.

 

C언어 및 C++ 프로그램에서 흔히 사용되는 자료형에는 다음과 같은 것들이 있습니다.

 

  • char : 문자
    (서식 지정자 : %c)
    키보드에서 볼 수 있는 알파벳들과 여러 특수문자들을 저장할 수 있는 자료형입니다. 단일한 문자는 작은따옴표 (' ')안에 들어가게 됩니다. 예를 들어서 알파벳 A를 나타내는 문자는 소스 코드 내에서 'A'로 나타냅니다.
  • signed char
    (서식 지정자 : %c 또는 %hhi)
    char
    형 변수와 동일한 크기를 가지는 반면에, 양의 정수와 음의 정수를 그 값으로 가질 수 있습니다. SCHAR_MINSCHAR_MAX라는 식별자들에 최소값과 최대값이 각각 정의되어 있습니다.
  • unsigned char
    (서식 지정자 : %c 또는 %hhi)
    char
    형 및 signed char형 변수와 동일한 크기를 가지지만, 음이 아닌 정수 값을 가집니다. 최소값은 0이고 UCHAR_MAX라는 식별자에 최대값이 정의되어 있습니다.
  • int : 정수
    (서식 지정자 : %d 또는 %i)
    정수형 변수를 저장하기 위한 자료형입니다. 가능한 최소값과 최대값은 INT_MIN, INT_MAX 식별자들에 각각 정의되어 있습니다.
  • unsigned int
    (서식 지정자 : %u)
    음이 아닌 정수를 저장하기 위한 자료형입니다. 음이 아닌 정수이므로 최소값은 당연히 0이고, UINT_MAX라는 식별자에 최대값이 정의되어 있습니다.
  • short int
    (서식 지정자 : %hd 또는 %hi)
    int
    형 변수에 비해 표현할 수 있는 숫자의 범위가 작지만, 그만큼 자료형의 크기 역시 작기 때문에 메모리를 절약할 수 있다는 장점이 있습니다. 참고로 음이 아닌 정수를 사용하기 위해서 unsigned 와 중복으로 사용할 수 있다는 특징도 있습니다. 다시 말해서 unsigned short int라는 자료형을 통해 음이 아닌 정수를 다루는 것이 가능합니다. short int형 변수의 최소값과 최대값은 SHRT_MINSHRT_MAX 식별자들에 정의되어 있는 반면에, unsigned short int형 변수의 최대값은 USHRT_MAX 식별자에 정의되어 있습니다. unsigned short int형 변수의 서식 지정자는 %hu입니다.
  • long int
    (서식 지정자 : %ld 또는 %li)
    int
    형 변수에 비해 표현할 수 있는 숫자의 범위가 크지만, 그만큼 자료형의 크기가 큽니다. int형 변수를 사용하기에는 큰 숫자를 다룰 때 사용하면 좋겠죠. 음이 아닌 정수를 다루기 위해 unsigned를 붙여서, unsiged long int라는 자료형을 사용할 수 있습니다. long int형 변수의 최소값과 최대값은 LONG_MINLONG_MAX 식별자들에 정의되어 있는 반면에, unsigned short int형 변수의 최대값은 ULONG_MAX 식별자에 정의되어 있습니다. unsigned long int형 변수의 서식 지정자는 %lu입니다.
  • float : 실수
    (서식 지정자 : %f, %g, %e)
    소수점 숫자를 가진 실수형 변수를 저장하기 위한 자료형입니다. 이 자료형으로 표현할 수 있는 양수의 최소값과 최대값이 FLT_MINFLT_MAX라는 식별자들에 각각 정의되어 있습니다.
  • double
    (서식 지정자 : %lf, %lg, %le)
    실수형 변수를 저장하기 위한 자료형이며, float에 비해 더 넓은 범위의 값들을 가질 수 있고 정밀도가 높다는 특징이 있습니다. 컴퓨터를 이용한 수치해석이나 시뮬레이션을 할 때 흔히 사용되는 자료형이죠. 표현 가능한 양수의 최소값과 최대값이 DBL_MINDBL_MAX라는 식별자들에 각각 정의되어 있습니다.

 

정수형 및 실수형 변수들이 가질 수 있는 최소값과 최대값들은 C언어 표준 라이브러리에서 제공되는 헤더 파일들에 매크로 형태로 정의되어 있는데요. 정수형 변수들과 실수형 변수들의 범위는 limits.hfloat.h 헤더 파일들에 각각 정의되어 있습니다. 이들을 사용해서 여러 자료형의 크기와 범위를 출력하는 간단한 프로그램을 만들어볼 수 있습니다.

 

C언어 소스 코드입니다.

 

test1_datatype_range.c [다운로드]

 

더보기
#include<stdio.h>
#include<limits.h>
#include<float.h>

int main(int argc, char *argv[]) {
    printf("\n");
    printf("Various data types\n");
    printf("==================\n");
    printf("\n");

    printf("  char (size = %lu)\n", sizeof(char));

    printf("\n");
    printf("  signed char (size = %lu)\n",
        sizeof(signed char));
    printf("    min = %d / max = %d\n",
        SCHAR_MIN, SCHAR_MAX);

    printf("\n");
    printf("  unsigned char (size = %lu)\n",
        sizeof(unsigned char));
    printf("    min = 0 / max = %d\n",
        UCHAR_MAX);

    printf("\n");
    printf("  int (size = %lu)\n",
        sizeof(int));
    printf("    min = %d / max = %d\n",
        INT_MIN, INT_MAX);

    printf("\n");
    printf("  short int (size = %lu)\n",
        sizeof(short int));
    printf("    min = %d / max = %d\n",
        SHRT_MIN, SHRT_MAX);

    printf("\n");
    printf("  long int (size = %lu)\n",
        sizeof(long int));
    printf("    min = %ld / max = %ld\n",
        LONG_MIN, LONG_MAX);

    printf("\n");
    printf("  unsigned int (size = %lu)\n",
        sizeof(unsigned int));
    printf("    min = 0 / max = %u\n",
        UINT_MAX);

    printf("\n");
    printf("  unsigned short int (size = %lu)\n",
        sizeof(unsigned short int));
    printf("    min = 0 / max = %u\n",
        USHRT_MAX);

    printf("\n");
    printf("  unsigned long int (size = %lu)\n",
        sizeof(unsigned long int));
    printf("    min = 0 / max = %lu\n",
        ULONG_MAX);

    printf("\n");
    printf("  float (size = %lu)\n",
        sizeof(float));
    printf("    positive min = %e / max = %e\n",
        FLT_MIN, FLT_MAX);

    printf("\n");
    printf("  double (size = %lu)\n",
        sizeof(double));
    printf("    positive min = %le / max = %le\n",
        DBL_MIN, DBL_MAX);

    printf("\n");
}

 

자료형의 크기를 얻기 위해 sizeof라는 연산자를 사용했는데요. 이렇게 하면 하나의 변수가 메모리의 용량을 얼마나 차지하는지를 바이트 (byte) 단위로 알려줍니다. printf는 표준 입출력 라이브러리에 포함된 함수로서, 문자열을 인자로 받아서 화면에 출력해주는 기능을 가지고 있습니다. 문자열은 큰따옴표 (" ")안에 포함되며, \n이 들어갈때마다 줄바꿈을 하게 됩니다. 프로그램을 실행시켜보면 다음과 같은 결과 화면을 볼 수 있습니다.

 

screenshot of terminal console&#44; showing execution of a program to print the size and range of various data types in C language

 

실수들을 출력할 때 e+e-가 등장하는 것을 볼 수 있는데, 이는 10의 몇 제곱인지를 나타내기 위한 것입니다. 예를 들어서 2.0e+3은 10의 세제곱에 2를 곱한 2000과 같고, 2.0e-30.002와 같은 것입니다. 대문자 E가 들어간 서식 지정자들인 %E 또는 %lE를 사용하게 되면, E+E-로 대신 표기됩니다.

 

프로그램을 작성하다보면, 변수의 값을 그대로 유지한 채 유형을 바꿔야 할 때가 있습니다. 예를 들어서 값이 3인 정수형 변수를 가지고 3.0인 실수로 바꿔서 사용하고 싶을 때가 있죠. 이 때 사용할 수 있는 방법으로 형변환 (type casting)이 있습니다. 기존 변수의 이름 앞에 어떤 자료형으로 변환하고 싶은지를 괄호안에 넣어서 붙여주면 됩니다. int형 변수 i의 값을 float형 실수로 바꾸고 싶다면 (float)i와 같이 형변환을 해줄 수 있겠습니다.

 

int i;
float ii;

i = 3;
ii = (float)i;
/* i = 3
 * ii = 3.0 */

 

배열 (array)

프로그램의 기능에 따라서 서로 관련이 있는 데이터들을 하나로 묶어서 취급하는 것이 편리할 때가 있는데요. 이를 위해서 배열이라는 것을 사용할 수 있습니다. 예컨대 띄어쓰기를 포함한 문장 혹은 문자열을 이루는 여러 개의 문자형 변수들을 단일한 이름을 가진 배열에 저장하면, 소스 코드를 작성하기도 쉬워지고 실수를 할 가능성도 낮아지게 되어 편리합니다.

 

배열을 선언하기 위해서는 자료형, 이름 뒤에 대괄호 ([ ])를 추가해서 배열의 크기를 지정해주면 됩니다. 크기가 10인 정수형 배열 numset을 다음과 같이 선언할 수 있습니다.

 

int numset[10];

 

이렇게 하면 정수형 변수 10개 묶음을 사용할 수 있게 되는데, 각 성분 (element)에 접근하기 위해서는 대괄호 안에 몇번째 성분인지를 지정해주면 됩니다. 여기서 주의해야 할 점은 크기가 N인 배열의 경우 0번째부터 N-1번째까지의 성분을 가진다는 것입니다. 앞서 선언한 배열 numset의 경우 numset[0]부터 numset[9]까지의 성분을 가지고 있죠. 대괄호 안에 들어가는 숫자가 배열의 범위를 벗어나게 되면, 런타임 오류나 segmentation fault가 뜨면서 프로그램이 정지됩니다.

 


 

선언된 변수들이 어떤 값을 가지는지 정의하고, 사칙연산을 포함한 여러가지 연산문을 통해서 그 값을 바꾸는 방법에 대해서는 다음 포스팅에 더 자세한 내용이 소개되어 있습니다.

 

 

C언어 프로그래밍 기초 : 연산문과 사칙연산

이번 포스팅에서는 C언어 또는 C++ 프로그램에 등장하는 변수들의 값을 바꾸기 위한 연산문들에 대해 알아봅시다. 여러 개의 연산문들을 순차적으로 실행함으로써, 궁극적으로는 원하는 기능을

swstar.tistory.com

 

문자형 변수를 저장하기 위한 자료형인 char에 대해서 언급을 했었는데, 이를 사용하면 문자열을 복사하거나 문장으로부터 단어를 추출하는 등의 기능을 C언어로 구현할 수 있습니다. 여기에 대한 더 자세한 내용은 다음 포스팅에 소개되어 있습니다.

 

 

C언어 문자와 문자열 사용하기

여기서는 C언어 프로그램에서 문자와 문자열을 다루는 방법에 대해 살펴보겠습니다. 컴퓨터는 이진수를 다루는 기계이지만, 인간에게 가장 친숙한 건 알파벳 같은 문자들이죠. 컴퓨터도 결국

swstar.tistory.com

 


 

C언어나 C++ 소스 코드를 가지고 실행이 가능한 프로그램을 만드는 과정에 대해서는 다음 포스팅에 더 자세한 내용이 소개되어 있습니다.

 

 

C/C++ 코드가 프로그램이 되는 과정

여기서는 C언어 또는 C++로 작성된 소스 파일, 헤더 파일의 개념과 이들을 빌드하여 하나의 프로그램을 만드는 과정에 대해 간략하게 짚어보겠습니다. 여러 개의 소스, 헤더 파일들로 이루어진

swstar.tistory.com