7. 숫자 이외의 데이터 타입(char, string, bool)

  • 16 minutes to read

숫자 이외의 데이터 타입인 문자(char), 문자열(char[], char*) 그리고 참(true) 또는 거짓(false) 값을 다뤄보도록 하겠습니다.

> // 숫자 이외의 데이터 타입: bool, char, char[] 등의 키워드로 숫자 이외의 데이터 저장
TIP

char 키워드는 캐릭터, , 중 원하는대로 발음해도 됩니다. 외국 프로그래머들의 발음을 들어보면 이 세가지 중 하나를 사용합니다. 박용준 강사는 캐릭터로 발음합니다.

7.1 문자 데이터 타입 사용하기(char)

문자 데이터 타입 변수는 1 바이트의 공간에 하나의 문자를 저장합니다. 문자형 변수는 char 키워드를 사용하여 선언하고 값을 초기화할 때에는 두개의 작은따옴표로 문자 하나를 묶어줍니다. 즉, 문자 리터럴은 반드시 작은 따옴표로 묶어야 합니다.

문자 하나를 담을 변수를 선언하고 사용하는 미리보기 샘플 코드는 다음과 같습니다.

> char c = 'A';
> c
'A'

char 변수 선언 및 초기화에 대한 내용을 그림으로 표현하면 다음과 같습니다.

그림: 문자 변수 선언 및 초기화

char-varible-init.png

문자 데이터 타입인 char 키워드로 선언된 변수는 문자 하나를 저장하기 위해 사용됩니다. char 데이터 타입은 8비트(1바이트) 저장공간을 차지합니다. 단일 문자는 작은따옴표(')로 묶습니다. char 자료 형에는 여러 개의 문자를 저장할 수 없습니다. 즉, 작은따옴표 안에는 단 하나의 문자만이 들어올 수 있습니다.

char 변수에는 정수 데이터가 들어올 수 있습니다. 정수 데이터를 표현할 때에는 부호 있는 정수일 때에는 char 키워드를 사용하고 부호 없는 정수일 때에는 unsigned char 키워드를 사용합니다. char 변수가 담을 수 있는 정수의 범위는 다음과 같습니다.

  • char의 범위: -128 ~ 127
  • unsigned char의 범위: 0 ~ 255

7.2 예제: 문자 변수 선언하기

문자 변수에 문자를 저장하고 출력하는 내용을 살펴보겠습니다.

코드: character_demo.c

// char 키워드: 문자 데이터 타입 변수를 선언할 때 사용 
#include <stdio.h>

int main(void)
{
    char grade = 'A'; // 문자 하나 저장
    char num = -128; // -128 ~ 127 사이의 정수 저장 가능
    unsigned char age = 255; // 0 ~ 255 사이의 정수 저장 가능

    printf("%c\n", grade); // A
    printf("%d\n", num); // -128
    printf("%d\n", age); // 255

    return 0;
}
A
-128
255

char 변수에 'A'와 같이 문자 하나를 작은따옴표로 묶어서 저장했습니다. char 변수는 -128부터 127까지의 정수 데이터도 저장이 가능합니다. unsigned char 변수는 음수를 표현하지 못하지만 양수의 값이 char 보다 두 배 많습니다.

7.3 이스케이프 시퀀스 사용하기

앞서도 살펴본 내용인데요. 백슬래시(\) 기호 뒤에 한 문자를 지정하는 것을 "이스케이프 시퀀스"라고 합니다. 백슬래시 기호는 한글 글꼴을 사용할 때에는 원(₩) 기호로 표시되고 영문 글꼴을 사용할 때에는 백슬래시(\, 역슬래시) 기호로 표현됩니다. 이스케이프 시퀀스는 줄 바꿈 문자, 작은따옴표 기호 자체, 탭 이동과 같은 제어 문자를 표현할 때 사용됩니다.

콘솔 창에서 한 줄을 내리는 \n 기호를 사용해보겠습니다.

코드: character_escape_sequence.c

#include <stdio.h>

int main(void)
{
    char ch1 = 'A';
    char ch2 = 'B';
    char newLine = '\n'; // \n: 줄 바꿈 문자
    printf("%c%c%c\n", ch1, newLine, ch2);

    return 0;
}
A
B

'\n'과 같은 이스케이프 시퀀스는 2개의 문자로 표현되지만 실제로는 하나의 문자로 인식합니다.

7.3.1 C 언어에서의 백슬래시(\) 기호

C 언어에서 백슬래시 기호는 이스케이프 시퀀스를 표현하는 특수 기호입니다. 만약, 문자열로 백슬래시 기호 자체를 표현하려면 '\\' 형식으로 백슬래시 기호 두 개를 함께 나열해야 합니다.

7.4 문자열 데이터 타입(char*) 맛보기

일반적으로 가장 많이 사용되는 데이터 타입은 문자열입니다. char* 또는 char * 형태를 사용하면 문자열 데이터 타입의 변수를 선언할 수 있습니다. 문자열은 반드시 큰따옴표(")로 묶습니다. 참고로, char*는 한참 뒤에서 자세히 배울 포인터라는 개념입니다. 지금은 문자열을 담을 수 있는 그릇을 만들 때 char* 키워드를 사용하는 것만 기억하면 됩니다. printf() 함수에서 문자열을 출력하려면 %s 자리 표시자를 사용합니다.

문자열 변수를 선언하고 초기화 후 사용하는 내용을 살펴보겠습니다.

코드: string_demo.c

#include <stdio.h>

int main(void)
{
    char* message = "안녕하세요.";
    printf("%s\n", message);

    message = "반갑습니다.";
    printf("%s\n", message);

    return 0;
}
안녕하세요.
반갑습니다.

하나 이상의 문자로 이루어진 문자열은 큰따옴표로 묶어서 문자열 변수에 담습니다. 문자 하나 이상을 저장할 때에는 char* 키워드로 문자열을 저장해서 사용할 수 있습니다.

7.5 문자 배열로 문자열 저장하기

문자열을 저장하는 또 다른 개념은 배열입니다. 우리는 아직 배열 개념을 배우지 않았습니다. C 언어에서는 기본적으로 문자열 형식 키워드를 제공하고 있지 않기에 문자열을 저장할 때 포인터 또는 문자 배열을 사용합니다. 자세한 내용은 배열과 포인터를 배우고 더 알아보겠지만, 지금은 다음 코드를 간단히 실행해보고 넘어가면 됩니다.

코드: string_with_char_array.c

#include <stdio.h>

int main(void)
{
    // 문자 배열 개념으로 문자열을 저장
    char s[5] = "Code"; // 저장할 문자열 보다 +1한 값만큼 배열 생성 

    // 문자열을 %s 자리 표시자를 사용하여 출력
    printf("%s\n", s); // 문자 배열 이름으로 문자열 출력

    return 0;
}
Code

char s[5] 형태로 변수를 선언하면 최대 4개의 문자를 보관할 수 있습니다. 문자열 마지막에는 눈에 보이지 않게 널 종결 문자라 불리는 '\0' 문자가 추가로 포함됩니다.

7.6 문자열의 길이 확인 및 문자열의 일부 내용 변경하기

문자열은 문자 하나 하나가 붙어 있는 형태입니다. 문자열에서 문자열의 길이를 확인하고 문자 하나를 변경하는 내용을 살펴보겠습니다.

코드: string.c

#include <stdio.h>

int main(void)
{
    //[1] 문자열 변수 선언과 동시에 초기화 
    char message[] = "C Language";

    //[2] 문자열 출력: %s 서식 지정자 사용
    printf("%s\n", message); // C Language

    //[3] 문자열 길이: sizeof() 연산자 사용
    printf("문자열 길이: %llu\n", sizeof(message)); // 10 + 1

    //[4] 문자열 중에서 문자 하나만 [n - 1] 형태로 출력: 위치는 0번째 숫자부터 시작
    printf("%c\n", message[0]); // C

    //[5] 문자열 중에서 특정 위치에 있는 문자 변경
    message[0] = 'Z'; // 첫 글자를 'Z'로 바꾸기

    //[6] 다시 전체 문자열 출력
    printf("%s\n", message); // Z Language

    return 0;
}
C Language
문자열 길이: 11
C
Z Language
  • [1] 문자열 변수에 문자열을 저장하면 맨 마지막에 눈에 보이지 않게 '\0' 문자 하나가 더 추가됩니다. 이것을 널 종결 문자라고 합니다. message 변수에는 다음 그림과 같이 문자들이 저장된 형태입니다.

그림: 문자열 변수가 저장된 상태

message-variable.png

  • [2] 문자열을 출력할 때에는 %s 자리 표시자를 사용합니다. %s는 널 종결 문자를 만날 때까지 출력됩니다.

  • [3] 문자열의 길이는 sizeof() 연산자를 사용하여 구할 수 있는데, 널 종결 문자까지 포함하여 문자열의 길이 보다 1이 더 큰 값을 출력합니다.

  • [4] 문자열에서 문자 하나만을 가져올 때에는 [n – 1] 형태를 사용하여 n – 1번째에 위치한 문자를 가져올 수 있습니다.

그림: 문자열 변수의 문자 위치

message-variable-index.png

  • [5] 만약, 문자열에서 특정 위치의 문자를 변경하려면 [n – 1] 번째 위치에 새로운 문자를 할당하면 됩니다.

7.7 변하는 값과 변하지 않는 값

상수는 변하지 않는 값을 저장할 때 유용하고 변수는 변하는 값을 저장할 때 유용합니다. 문자열 변수에 const 키워드를 붙여 상수로 만들어 보겠습니다. 코드에 나오는 문자열은 원하는 다른 문자열 또는 영문으로 변경해서 실행해보세요.

코드: immutable.c

#include <stdio.h>

int main(void)
{
    // 상수: 변하지 않는 값
    const char* name = "백두산";

    // 변수: 변하는 값
    int age = 102;

    // 이름: 백두산, 나이: 102
    printf("이름: %s, 나이: %d\n", name, age);

    return 0;
}
이름: 백두산, 나이: 102

영어 단어로 Mutable'변할 수 있는'이고, Immutable'변경할 수 없는'입니다. 변수(Variable)Mutable이고 상수(Constant)Immutable입니다. 이 두 개의 영어 단어는 프로그래밍 세계에서는 반드시 알아야하기에 영어로 정리를 해보았습니다.

7.8 실수와 문자열을 저장하는 상수

실수 데이터와 문자열 데이터를 저장하는 상수를 사용해보겠습니다.

코드: const_double_string.c

#include <stdio.h>

int main(void)
{
    //[1] 상수 선언과 동시에 초기화
    const double PI = 3.14;
    const char* SITE_NAME = "비주얼아카데미";

    //[2] 상수 참조
    printf("%.2f\n", PI); // 3.14
    printf("%s\n", SITE_NAME); // 비주얼아카데미

    return 0;
}
3.14
비주얼아카데미

변수를 선언할 수 있는 모든 데이터 타입 앞에 const를 붙여 상수로 만들었습니다. 이 강의에서는 상수 이름은 주로 대문자 형태로 표현합니다.

7.9 논리 데이터 타입(bool) 맛보기

논리 데이터 타입인 참(true) 또는 거짓(false) 값을 저장하려면 bool 키워드를 사용합니다. bool 키워드로 선언하는 변수는 논리형 값인 참(true)과 거짓(false) 정보를 저장합니다. 이를 사용하면 어떤 상태를 참과 거짓으로 구분하여 제어할 수 있습니다. bool 데이터 타입은 1비트의 저장 공간을 차지합니다. 1비트 공간을 채우는 키워드는 truefalse 키워드입니다. bool 데이터 타입에는 truefalse 키워드로 표현되는 2개의 값만을 저장할 수 있습니다. 이를 통해서 결과 값이 참/거짓, 예/아니요 등을 표현할 수 있습니다.

7.10 #include <stdbool.h>

C99 표준에서 추가된 논리 데이터 타입을 사용하려면 stdbool.h 파일을 포함해야 합니다.

7.11 C 언어에서 bool, true, false 키워드 사용하기

코드: bool_demo.c

#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    bool bln1;
    bool bln2;

    bln1 = true;	// 참(1)
    bln2 = false;	// 거짓(0)

    printf("%d %d\n", bln1, bln2); // 1 0

    return 0;
}
1 0

C 언어에서 참과 거짓을 표현하는 true, false 키워드는 실제로는 1과 0으로 저장되어 사용됩니다.

7.12 논리 자료형 사용하기

이번에는 bool 변수를 사용해보겠습니다.

코드: boolean_demo.c

//[?] 논리 자료형: 참(True) 또는 거짓(False) 값 저장
#include <stdio.h>
#include <stdbool.h> // bool, true(1), false(0)

int main(void)
{
    bool bln = true; // 참(1)
    printf("%d\n", bln); // 1

    bool isFalse = false; // 거짓(0)
    printf("%d\n", isFalse); // 0

    return 0;
}
1
0

C 언어의 stdbool.h 헤더 파일에서 논리 데이터 타입에 사용될 미리 정의된 키워드는 truefalse입니다. 다만, printf() 함수를 통해서 출력되는 값은 숫자 형식으로 10으로 표현됩니다. 이처럼, C 언어에서는 true1이고 false0입니다.

7.13 장 요약

이번 장에서는 문자, 문자열 그리고 논리 타입에 대해서 다루었습니다. 간단히 데이터 타입만 사용해봤지만, 앞으로 이루어지는 모든 영역에서 더 많이 다루고 더 자세히 다룰 예정입니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com