C언어 변수와 데이터형 | C언어 강의 3

이번 포스팅에서는 C언어 변수와 데이터형에 대하여 알아보겠습니다.

변수는 프로그램에서 사용하는 수이고 데이터형은 사용하려는 변수의 형식을 규정합니다.

C언어 변수와 데이터

우리가 무의식적으로 사용하는 데이터란 무엇일까요?

프로그램에서는 데이터를 사용합니다.

데이터는 프로그램이 작동하기 위해서 사용하는 자료입니다. 예를 들어 서울시의 인구밀도를 구하기 위해서는 서울시의 면적과 인구라는 데이터가 필요합니다.

C언어에서는 squareSeoul 과 populationSeoul 이라는 두개의 변수에 데이터를 담아서 처리할 수 있습니다.

아하 그러니까 변수는 데이터를 담는 상자같은 것이고, 데이터는 그 안에 들어가는 자료입니다. 그런데 상자의 크기가 다를 수 있으니 데이터형을 정해둔 것 입니다.

넓은 의미에서 숫자, 텍스트, 이미지, 동영상 등 컴퓨터에서 표현할 수 있는 모든 대상이 데이터가 될 수 있습니다만, C언어의 데이터는 엄격한 형식에 따라 저장되야 합니다.

예를 들어 8비트 정수형 char 가 있고, 32비트 정수형 int 가 있습니다. 각각의 변수에 정확한 데이터형을 지정해줘야 오류없이 사용할 수 있습니다.

한번 데이터형을 정하면 바꾸는데 제약이 많기 때문에 정적인 타입(static type) 이라고도 합니다.

반면 파이썬, 자바스크립트 같이 데이터형을 정하지 않아도 인터프리터가 알아서 데이터형을 할당하는 언어를 동적 타입(dynamic type)이라고 합니다.

동적타입이 사람의 사고방식과 닮았기 때문에 편리합니다. 보통 사람이 머리속으로 계산할 때 이 숫자는 32비트 정수야, 이건 64비트 부동소수점이야 이렇게 생각하는 사람은 없죠. 그냥 머리속에서 개념만 가지고 계산하는 것 입니다.

허나 C언어에서는 컴퓨터의 논리를 생각해야 합니다. 예를들어 64비트 부동소수점 데이터를 32비트 int 정수형에 할당이 불가능하다는 것은 컴퓨터가 볼 때는 이렇습니다.

비트가 32개 모자라고 내부에 저장하는 방식이 int 형은 2의 보수에 리틀엔디안 형식으로 저장한다면 64비트 부동소수점 수는  IEEE 754가 정한 double precision 배정도 방식으로 변환하여 비트를 나열합니다.

물론 이런 내용을 몰라도 변수를 사용할 수 있습니다. 하지만 알면 알수록 컴포터의 구조에 대한 이해가 깊어지고 통찰력이 늘어날 것 입니다.

변수란 무엇인가?

변수란 변하는 수입니다. (영어: Variable)
변하는 수에 이름을 붙여서 사용할 수 있습니다.

시험점수를 myScore 라고 하면
시험을 볼 때 마다 변하는 점수를 기록할 수 있습니다.

#include <stdio.h>
 
int main()
{
    int myScore;
    myScore = 90;
 
    printf("myScore : %d\n", myScore);
 
    return 0;
}
>> myScore : 90

변수를 사용하기 위해서는 먼저 선언을 해야합니다.

앞에 붙인 int는 데이터형이 32비트 정수임을 의미합니다.

myScore = 90;

의 문장에서 숫자 90을 myScore 에 할당합니다.

다음 printf 문장에서 출력을 합니다.

myScore 가 변수라는 것은 처음에 값 90을 할당했다가도 80도 할당할 수 있고 100도 할 당할 수 있다는 말입니다. 즉 값이 변할 수 있다는 것 입니다.

이렇게 생각하면 참 쉽습니다. myScore의 값은 변할 수 있다. 줄여서 변수다.

변수의 정확한 의미는 프로그램의 실행중에 변할 수 있는 수를 의미합니다.

약간 과도하게 설명을 하고 있습니다만, C프로그래밍은 기초가 중요하기 때문에 강조했습니다.

변수와 데이터형을 끝내면 이전학습에서 배운 C언어 문장형식 5가지 중에 1. 선언과 2. 대입까지 배운 것 입니다.

벌써 문장형식에서 40%가 끝나는 것입니다.

그래서 C언어 변수와 데이터형이 중요하다고 볼 수 있습니다.

C언어 변수와 데이터

C언어는 변수를 선언할 때 데이터의 형태를 선택합니다. (Data Type) 데이터형을 자료형이라고도 합니다.

데이터형에 대하여 이야기하기 위해서는 컴퓨터의 메모리에 데이터가 저장되는 방식에 대한 이해가 조금 필요합니다.

컴퓨터는 0과1로 작동한다는 말을 들어본 적이 있을 것 입니다. 즉 컴퓨터는 이진수 체계입니다. 그래서 메모리에도 데이터를 2진수로 저장하는데요.

메모리에 2진수로 저장된 데이터를 사람이 보면 0과1이 나열되있는 모습입니다. 예를 들어 숫자 10을 만들어 보겠습니다.

1010

2의3승과 2의1승을 더한 10의 이진수 표기는 1010 입니다. 메모리에는 데이터가 이런 식으로 저장이 되있습니다.

데이터형이라는 것은 이 데이터를 어떻게 쓰는지 정의해놓은 것 입니다.

나름의 규칙이 있는데 8비트를 기준으로 16비트, 32비트, 64비트의 자료형이 있습니다.

위의 10은 4비트 자리죠. 그러나 데이터형은 최소한 8비트를 사용하기 때문에 00001010 이라고 표기합니다.

이진법

이진법은 0과1로 표기하는 숫자의 진법입니다.

자세한 내용은 아래 링크문서를 참고합니다.

C언어에는 데이터의 형을 규정하는 키워드가 있습니다. 세분화해서 나누면 수십개의 타입이 나오는데요. 이것들을 한번에 다 외우기는 힘드니 전체적인 구분을 할 수 있도록 노력하는게 좋습니다.

또 C언어의 자료형은 컴파일러와 운영체제에 따라 차이가 있어서 혼동스럽습니다.

그래서 처음에는 제일 쉬운 것부터 알아가는게 좋습니다.

여기서 소개하는 타입은 char, short, int, long long 입니다. 8비트, 16비트, 32비트, 64비트의 정수형 데이터형입니다.

#include <stdio.h>
#include <limits.h>
 
#define Line printf("---------------------------------\n")
 
int main()
{
 
    Line;
    printf("char min  : %20d\n", CHAR_MIN);
    printf("char max  : %20d\n", CHAR_MAX);
    Line;    
    printf("short min : %20d\n", SHRT_MIN);
    printf("short max : %20d\n", SHRT_MAX);
    Line;
    printf("int min   : %20d\n", INT_MIN);
    printf("int max   : %20d\n", INT_MAX);
    Line;
    printf("long min  : %20lld\n", LLONG_MIN);
    printf("long max  : %20lld\n", LLONG_MAX);
    Line;
 
    return 0;
}
---------------------------------
char min  :                 -128
char max  :                  127
---------------------------------
short min :               -32768
short max :                32767
---------------------------------
int min   :          -2147483648
int max   :           2147483647
---------------------------------
long min  : -9223372036854775808
long max  :  9223372036854775807
---------------------------------

위 코드를 실행하면 limit.h 에 정의된 변수로 각 데이터가 표현가능한 최대값과 최소값의 범위를 출력합니다.

결과창을 보면 대략 어떤 타입을 사용해야 하는지 느낌이 오죠?

char 형은 문자형이지만 정수값으로 저장합니다.

지금은 모든 것을 설명할 수 없지만 학습을 진행하며 이유를 알게 될 것입니다.

데이터형바이트범위포맷
char1바이트(8비트)-128 ~ 127%d, %c
short2바이트(16비트)-32768
~ 32767
%d
int4바이트(32비트)-2147483648
~ 2147483647
%d
long long8바이트(64비트)-9223372036854775808
~ 9223372036854775807
%lld
C변수와 데이터형 정수

포맷은 printf 함수가 숫자를 표기할 때의 형식을 지정해줍니다. 포맷의 표현범위도 한계가 있기 때문에 적합한 선택을 해야합니다.

자료형은 크게 정수형, 문자형, 실수형(소수형)으로 나눌 수 있는데 위의 내용은 그 중에 정수형입니다.

우선은 가장 쉬운 정수형 부터 익숙해지는게 좋습니다. 보통 가장 많이 사용하는 형태는 int입니다. int가 인텔 초창기 시스템에서는 16비트로 동작했는데 현재는 대부분 32비트를 사용합니다.

운영체제가 다르면 자료형이 달라지는 경우도 있습니다. C언어가 과거에는 이식성이 뛰어나다고 했지만 가상머신 위에서 동작하는 자바(JVM)나 다른 언어에 비해 까다로운 것이 사실입니다.

내용을 이해했다면 이제 코딩을 직접해볼 시간입니다.

아래의 간단한 실습을 해보길 바랍니다.

  1. char, short, int, long long 변수를 1개 씩 선언하고 값 할당하기
  2. int 형 변수 2개를 만들어 덧셈과 뺄셈 연산하기

실습을 하다보면 여러가지 의문이 떠오를 수 있습니다. 모든 것을 한번에 다 알 수 없으니 조급해할 필요는 없습니다.

의문이 생길 때는 구글 검색을 적극 활용합니다. 대부분의 문제에서 누군가 나와같은 고민을 한 흔적을 찾을 수 있습니다. 5년전 10년전의 문서에서도 배울게 있습니다.

요약

C언어 변수와 데이터에 대한 학습을 했습니다. 변수와 데이터형은 중요한 주제고 내용이 생각보다 많습니다. 가장 기초 개념은 여러번 읽고 실습을 하는 것이 좋습니다.

지금은 쉽지만 프로그래밍은 뒤로 갈수록 기초가 약하면 힘들어집니다. 아주 간단한 개념을 분명하게 이해할 수록 좋습니다.

세상에서 당연한 사실을 가장 잘 이해한다는 느낌으로 지식을 쌓아나가시길 바랍니다.

외부참조문서

C언어 2 – 1 | 자료형 | char 형 변수의 사용

C언어 2 – 2 | 자료형 | 아스키코드

C언어 2 – 3 | 자료형 | short형과 int형| 2바이트와 4바이트

Leave a Comment