7. 숫자 이외의 데이터 타입(char, string, bool)
숫자 이외의 데이터 타입인 문자(char
), 문자열(char[]
, char*
) 그리고 참(true
) 또는 거짓(false
) 값을 다뤄보도록 하겠습니다.
> // 숫자 이외의 데이터 타입: bool, char, char[] 등의 키워드로 숫자 이외의 데이터 저장
TIP
char
키워드는 캐릭터
, 차
, 카
중 원하는대로 발음해도 됩니다. 외국 프로그래머들의 발음을 들어보면 이 세가지 중 하나를 사용합니다. 박용준 강사는 캐릭터
로 발음합니다.
7.1 문자 데이터 타입 사용하기(char)
문자 데이터 타입 변수는 1 바이트의 공간에 하나의 문자를 저장합니다. 문자형 변수는 char
키워드를 사용하여 선언하고 값을 초기화할 때에는 두개의 작은따옴표로 문자 하나를 묶어줍니다. 즉, 문자 리터럴은 반드시 작은 따옴표로 묶어야 합니다.
문자 하나를 담을 변수를 선언하고 사용하는 미리보기 샘플 코드는 다음과 같습니다.
> char c = 'A';
> c
'A'
char
변수 선언 및 초기화에 대한 내용을 그림으로 표현하면 다음과 같습니다.
그림: 문자 변수 선언 및 초기화
문자 데이터 타입인 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 변수에는 다음 그림과 같이 문자들이 저장된 형태입니다.
그림: 문자열 변수가 저장된 상태
[2] 문자열을 출력할 때에는
%s
자리 표시자를 사용합니다.%s
는 널 종결 문자를 만날 때까지 출력됩니다.[3] 문자열의 길이는
sizeof()
연산자를 사용하여 구할 수 있는데, 널 종결 문자까지 포함하여 문자열의 길이 보다 1이 더 큰 값을 출력합니다.[4] 문자열에서 문자 하나만을 가져올 때에는 [n – 1] 형태를 사용하여 n – 1번째에 위치한 문자를 가져올 수 있습니다.
그림: 문자열 변수의 문자 위치
- [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비트 공간을 채우는 키워드는 true
와 false
키워드입니다. bool
데이터 타입에는 true
와 false
키워드로 표현되는 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
헤더 파일에서 논리 데이터 타입에 사용될 미리 정의된 키워드는 true
와 false
입니다. 다만, printf()
함수를 통해서 출력되는 값은 숫자 형식으로 1
과 0
으로 표현됩니다. 이처럼, C 언어에서는 true
가 1
이고 false
가 0
입니다.
7.13 장 요약
이번 장에서는 문자, 문자열 그리고 논리 타입에 대해서 다루었습니다. 간단히 데이터 타입만 사용해봤지만, 앞으로 이루어지는 모든 영역에서 더 많이 다루고 더 자세히 다룰 예정입니다.