TeamH4C_ProjectH4C/프로그래밍 언어

[TeamH4C_C언어] 자료형들의 사용

P4P3R_H 2021. 2. 21. 03:44

여러 자료형들의 사용에 대해 정리해보겠습니다.

 

서식 지정자

문자를 표현하기 위해 printf함수를 사용합니다. printf함수는 가변 인자 값을 출력할 수 있는데 가변 인수로부터 넘겨받은 변수들을 출력하기 위해서 자료형에 대한 정보가 있어야 합니다. 이러한 자료형을 서식 지정자라 하며 서식 지정자의 종류는 다음과 같습니다.

 

변수의 사용

값들을 저장하여 사용하기 위해 변수가 필요합니다. 변수는 리터럴 값을 저장하는 공간으로 변경될 값을 저장하는데 용이하며, 변수를 만들기 위해 자료형(Type)을 선언하고 변수명을 지정하는 형식으로 변수는 만들어집니다.

[자료형 변수 이름;] 형식으로 만드는 과정이며 변수를 선언한다라 하며, 선언과 동시에 변수의 값을 초기화할 수 있는데 이는 변수를 초기화한다라는 뜻을 가집니다. 변수의 자료형에는 정수형, 실수형이 대표적으로 존재합니다.

정수 자료형은 char, short, int, long 순으로 존재하며, 실수형 자료형에는 float, double이 대표적으로 존재합니다. 여기서, void자료형이 있는데 이는 형태가 없는 자료형이며 포인터나 함수의 반환 값을 표현할 때 사용됩니다.

변수를 선언할 때 규칙이 존재하는데 문자부터 시작해야 하며, 숫자부터 시작할 수 없습니다. 또한, 영문자 숫자 사용이 가능하며 대소문자가 구분되어 변수 이름을 사용할 수 있습니다. 마지막으로 밑줄(_) 문자로 시작하는 변수를 선언할 수 있으며 C언어의 키워드는 변수의 이름으로 선언하지 못합니다.

#include <stdio.h>

int main()
{
    int num1;
    int num2 = 2;
    
    num1 = 1;
    
    printf("%d %d\n", num1, num2);
    return 0;
}

위 코드는 변수를 선언하여 값을 할당하고, 변수를 초기화한 예제입니다. 여기서 알 수 있는 것은 할당 기호가 =으로 사용되었다는 것입니다. 프로그래밍 언어에서는 =은 할당의 의미로 사용되고, 같다는 의미의 기호는 ==로 사용할 수 있습니다.

 

디버거의 사용

Visual Studio를 통해 디버거 기능을 사용할 수 있는데 디버거는 프로그램의 내부 동작 하나씩 확인하여 버그를 쉽게 파악할 수 있는 기능입니다.

f5키를 누르면 디버깅이 시작되는데 오류가 있을 시 어떤 오류인지 알려줄 것이고, 아니면 코드가 실행되어 실행하고자 하는 내용이 출력될 것입니다.

정확한 오류를 파악하기 어렵다면 중단점을 이용하여 확인할 수 있는데 이를 브레이크 포인트(Break Point)라 하며 특정 지점에 프로그램의 동작을 멈추는 것을 뜻합니다.

왼쪽 상단이 Debug로 되어있는 상태이어야 하며, f9키를 누르면 8번 줄의 코드처럼 빨간 점이 생깁니다. 빨간 점이 중단점이며 f5키를 누르면 중단점까지 코드가 실행되어 어떤 상태인지 진단할 수 있습니다. 한 줄씩 더 실행하고자 한다면 f10키를 눌러 한 줄씩 코드를 실행시킬 수 있습니다.

 

자료형의 사용

정수의 자료형은 부호의 유무로 자료형의 필요한 범위를 지정하여 사용할 수 있습니다. 부호가 있는 자료형은 signed를 사용하고, 부호가 없는 정수형을 사용할 때는 unsigned를 사용합니다. 실수형 자료형은 unsigned라는 것이 없고, 음수와 양수 부호를 항상 가집니다.

signed는 생략이 가능하고, unsigned는 0부터 시작하면서 int를 생략하여 표시할 수 있습니다. 부호의 유무로 정수 자료형의 범위와 부호가 항상 있는 실수 범위는 다음과 같아집니다.

 

여기서 원하는 자료형에 대한 변수를 선언하기 위해서는 해당 자료형에 변수명을 선언하면 자료형에 대한 변수가 만들어집니다. 그리고 자료형 변수를 호출하기 위해서는 자료형에 맞는 서식 지정자가 필요합니다. 서식 지정자는 위에 표로 나타나 있습니다. 실수는 서식 지정자 % 뒤에 소수점을 찍어 원하는 자릿수만큼 표현할 수 있습니다.

변수의 값은 해당 자료형의 범위에 맞도록 값을 지정하는 것이 좋고 저장할 수 있는 범위를 넘어서면 오버플로우와 언더플로우가 발생하기에 주의해야 합니다.

정수형의 오버플로우와 언더플로우는 최댓값에서 최솟값으로 최솟값에서 최댓값으로 바뀌는 정도지만 실수형의 오버플로우와 언더플로우는 다음과 같이 변화하게 됩니다.

 

크기를 정확히 확인하고자 한다면 sizeof연산을 이용하면 됩니다. 크기가 byte단위로 확인이 되며 [sizeof(표현식 or 자료형);]으로 해당 자료형의 크기를 확인할 수 있습니다.

최솟값과 최댓값을 프로그램에서 확인할 수 있는데 정수는 <limits.h> 헤더 파일이 필요하고, 실수는 <float.h> 헤더 파일을 사용하여 확인할 수 있습니다. 각 자료형을 뜻하는 단어와 _MIN, _MAX를 붙여 확인이 가능합니다.

정수형인 char는 CHAR, short는 SHRT, int는 INT, long는 LONG, long long은 LLONG입니다. 실수형은 float는 FLT, double은 DBL, long double은 LDBL로 크기를 확인할 수 있습니다.

C언어의 개정 표준안인 C99부터는 크기를 정확히 선언하여 혼동이 없도록 <stdint.h>와 같은 헤더 파일이 추가됐는데, 이를 통해 크기가 표시된 정수 자료형을 사용할 수 있도록 되었습니다. int8_t, int16_t, int32_t, int64_t와 같이 비트 크기가 표시된 자료형을 사용할 수 있게 된 것입니다. 또한, 정수형은 int앞에 u를 붙여 부호가 없는 크기를 선언할 수 있습니다.

이러한 방법은 크기를 정하여 정확하게 표시할 때 선언하여 사용합니다.

여기서, 정수형 자료형인 char은 부호가 없을 때는 바이트 단위의 데이터를 저장하는데 사용되고, 부호가 있는 char은 문자의 자료형으로도 사용이 됩니다. 하나의 문자(character)로 표현할 수 있으며 ASCII코드에 해당되는 숫자로 문자를 표현하게 됩니다. 문자는 작은따옴표('')로 묶어 표현되며, 문자열은 큰 따옴표("")로 묶여 표현됩니다.

문자를 표현할 수 있는 char 자료형은 정수 자료형이기에 정수 서식 지정자를 사용할 수 있으며, 결과는 서식 지정자에 따라 아래의 ASCII코드표에 따라 출력됩니다.

 

상수의 사용

상수는 변하지 않는 값(constant)을 말하며 변수를 수정할 수 없음을 뜻합니다. 일반적으로 고정된 값을 말하는 것이 상수지만 컴퓨터에서는 리터럴(literal)이라는 표현을 사용합니다.

두 개 모두 변하지 않는 값을 의미하지만, 상수는 정확히 변하지 않는 변수를 뜻하며 리터럴은 값 그 자체를 뜻합니다. 상수는 프로그램을 만들 때 의도하지 않게 변수에 저장된 값을 바꿀 수 없도록 하기 위해 존재하는 것으로 바뀌면 안 되는 값을 가지고 있는 것입니다.

상수는 [const 자료형 상수 이름 = 리터럴;] 형식으로 선언하며 선언 시 초기화와 변수 앞에 const를 붙여야 합니다.

여기서, 리터럴에 접미사를 사용하여 정확한 크기를 표현할 수 있는데 리터럴의 접미사는 다음과 같습니다. 접미사를 붙이면 접미사와 자료형의 크기가 같아야 합니다.

8진수와 16진수에도 접미사를 사용할 수 있지만, 8진수와 16진수 서식 지정자인 o와 x에는 u를 붙일 수 없습니다.

 

입력받기

프로그램은 표준 입력(standard input, stdin)을 받고, 표준 출력(standard output, stdout)을 할 수 있는데 C언어에서 표준 입력을 받기 위해서는 scanf함수를 [scanf(서식 지정자, 변수의 주소);] 형식으로 사용해야 합니다.

대신 scanf를 사용하기 위해서는 #define _CRT_SECURE_NO_WARNINGS 전처리기에 정의하는 방식으로 컴파일하여야 합니다. 이유는 scanf가 입력 값의 길이를 지정할 수 없어 보안에 취약하기 때문입니다. 그렇기에 최근 예제들은 scanf_s를 사용하기도 합니다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int num1, num2; //같은 자료형이면 쉼표(,)를 통해 한 줄에 표현이 가능합니다.
    
    printf("정수 2개를 입력하세요 : ");
    scanf("%d %d", &num1, &num2);
    printf("%d %d\n", num1, num2);
    return 0;
}

입력받을 값에 따라 scanf서식 지정자에 변화를 주면 됩니다. 문자의 경우 getchar()로 문자를 하나 받아 변수에 저장시켜 출력할 수 있고, 버퍼를 지우는 데에도 사용되기도 합니다. 또한 putchar(변수)를 통해 이미 있는 문자 하나를 받아와 출력하도록 할 수 있습니다.

 

이번 파트에서 저번에 정리한 파이썬과 다른 점은 자료형의 범위가 정해져 있다는 것입니다. 파이썬 3부터는 크기 제한이 없는 형태여서 아무리 큰 수라도 오버플로우가 일어나지 않았다는 점입니다.