5. 변수 만들고 사용하기

  • 27 minutes to read

프로그램에서 사용되는 많은 데이터는 데이터 타입(Data Type)을 가지고 변수(Variable) 또는 상수(Constant)라는 곳에 저장되어 사용됩니다. 이번 강의는 프로그래밍의 가장 기본적인 데이터 타입과 변수에 대한 내용을 다루도록 하겠습니다.

> // 변수(Variable): 프로그램에서 사용할 데이터를 임시로 저장해 놓는 그릇

5.1. 변수(Variable)

프로그램에서 값을 다루려면 사용할 데이터를 메모리에 잠시 보관해 놓고 사용하기 위한 임시 저장 공간이 필요합니다. 이때 변수(Variable)를 사용합니다. 이러한 변수를 사용하려면 먼저 선언해야 하는데, 데이터를 담아 놓을 그릇(컨테이너)을 만드는 작업이라고 생각하면 됩니다.

변수를 만들 때에는 변수 이름과 값 그리고 데이터 타입(형식, 유형)이 필요합니다.

박용준 강사의 강의에서는 데이터 형식, 데이터 타입, 데이터 유형을 같은 단어로 표현하겠습니다.

변수는 다음처럼 선언할 수 있습니다. 변수 선언에 대한 내용을 그림으로 표현해보면 다음과 같습니다.

그림: 변수 선언하기 및 메모리 표현

변수 선언하기

C 언어에서 변수를 선언할 때에는 데이터 타입(Data Type) 다음에 변수 이름이 옵니다. 그리고 맨 뒤에 ;(세미콜론)을 붙여 하나의 문장으로 끝나야 합니다.

데이터 타입에는 숫자와 문자를 지정하는 여러 가지 데이터 타입이 있습니다.

정수 데이터타입은 integer의 축약형인 int를 사용합니다.

정수가 들어갈 수 있는 number 변수를 선언해 메모리에 임시 저장 공간을 할당 받았습니다. 이 number 변수에는 1, 2, 3, 0, -1, -2 등의 정수형 데이터가 저장됩니다.

5.2 데이터 타입(Data Type)

C 언어에서 변수를 만들 때 사용하는 데이터 타입에서 가장 많이 사용하는 것은 문자(char), 정수(int), 실수(double), 문자열입니다.

C 언어에서 자주 사용하는 데이터 타입(타입)에는 다음과 같은 종류가 있습니다. 앞으로 계속해서 배울 내용이니 간단히 읽고 넘어가세요.

데이터 타입 설명
int 정수형 데이터를 저장합니다. int 형식은 하드웨어에 따라서 크기가 달라질 수 있습니다.
char 문자 데이터를 저장합니다. 1 바이트(8 비트) 단위에 문자 하나를 저장합니다.
bool 참 또는 거짓의 값을 true와 false 키워드로 저장합니다. 기본 C 언어에서는 제공하지 않습니다.
double         실수형 데이터를 저장합니다. float 키워드로도 실수를 저장합니다.

각 데이터 타입에 대해서는 뒤에서 자세히 다루겠습니다.

참고로, C 언어에서 기본으로 제공하는 데이터 타입을 기본 형식(Primitive Type)이라고 합니다.

앞으로 배우게 될 구조체라는 것을 통해서 만들 수 있는 새로운 형식을 사용자 정의 형식(User Defined Type)이라고 합니다.

5.3 변수 이름을 짓는 법

변수를 사용하려면 변수 이름이 필요합니다.

변수 이름을 지을 때 다음과 같은 규칙을 지켜야 합니다.

이러한 규칙은 프로그래밍을 학습하면서 자연스레 익혀지는 내용이니 간단히 읽고 넘어갑니다.

  • 글자는 반드시 문자로 지정합니다. 숫자가 변수 이름의 처음에 올 수 없습니다.
  • 공백(space)을 포함할 수 없습니다.
  • 영문자, 숫자, 밑줄(_)의 조합으로 사용되고, 기타 특수 기호는 사용할 수 없습니다.
  • C 언어에서 사용하는 예약어(키워드)는 사용할 수 없습니다. 예를 들어 C 언어의 기본 코드에서 사용되는 int, main, void, return 등의 키워드는 사용할 수 없습니다.
  • 변수는 대/소문자를 구분하고, 일반적으로 소문자로 시작합니다.

C 언어에서의 예약어(키워드) 목록은 다음과 같습니다.

C 언어의 예약어 목록

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

예약어 목록은 앞으로 우리가 배우게 될 목록입니다. 지금은 이렇게 있다 정도로 훑고 넘어가면 됩니다.

5.4 변수 만들고 사용하기

변수를 선언했으면 값을 넣어주어야 합니다. 변수에 값을 저장하는 것을 변수에 값을 대입 또는 할당한다고 합니다. 변수는 다음처럼 선언한 후 값을 할당할 수 있습니다.

[그림] 변수 만들고 값 할당

변수 만들고 값 할당

변수 선언 후 값이 할당된 후의 메모리 상태를 그림으로 표현하면 다음과 같습니다. 정수형을 담을 수 있는 number 변수를 선언한 후 7을 할당한 상태입니다.

[그림] number 변수에 7을 할당한 후의 메모리 상태

number 변수에 7을 할당한 후의 메모리 상태

앞서 설명한 내용을 전체 코드로 보면 다음과 같습니다. 다음 소스 코드를 입력한 후 실행해 보세요.

코드: variable.c

// 변수(Variable)
#include <stdio.h>

int main(void)
{
    int number; //[1] 정수형 변수 선언하기
    number = 7; //[2] 변수에 값 대입(할당)하기
    printf("%d\n", number); //[3] 변수의 값을 화면에 출력하기
    return 0;
}
7

[1]번 코드에서 number 이름의 정수(int) 형식의 변수를 선언합니다. [2]번 코드처럼 정수 데이터를 저장합니다. 값을 저장할 때에는 대입 연산자라 불리는 = 기호를 사용합니다. 변수에 들어있는 값을 화면에 출력하려면 [3]번 코드처럼 printf() 함수에 변수 이름을 넣어주면 됩니다.

5.5 리터럴 사용하기

변수에 직접 정수형 또는 문자열 값을 저장할 수 있는데 이 값 자체를 리터럴(Literal)이라고 합니다. 리터럴 중에는 값 자체를 가지지 않는 널(NULL) 리터럴도 있습니다. 변수에 저장되는 리터럴은 정수 리터럴, 실수 리터럴 및 문자열 리터럴 등을 사용할 수 있습니다. 정수는 숫자 그대로 표현하고 실수는 대문자 F 또는 소문자 f를 숫자 뒤에 접미사로 붙여서 표현합니다. 문자는 반드시 작은따옴표로 묶어야 하며 문자열은 큰따옴표로 묶어야 합니다. 참고로 리터럴 단어는 상수로 표현해도 됩니다.

5.5.1 리터럴 사용하기

리터럴을 사용해보겠습니다.

코드: literal.c

#include <stdio.h>

int main(void)
{
    printf("%d\n", 1234);    //[1] 1234: 정수 리터럴
    printf("%.2f\n", 3.14F);   //[2] 3.14: 실수 리터럴
    printf("%c\n", 'A');     //[3] A: 문자 리터럴
    printf("%s\n", "HELLO"); //[4] HELLO: 문자열 리터럴

    return 0;
}
1234
3.14
A
HELLO

5.5.2 문자열 리터럴

C 언어에서 문자열 리터럴은 큰 따옴표로 묶습니다.

코드: string_literal.c

#include <stdio.h>

int main(void) 
{
    // 문자열 리터럴
    // C 언어에서 문자열은 큰 따옴표로 묶음
    // "C Language", "Hello, World"
    printf("%s, %s\n", "C Language", "Hello, World!"); 
}
C Language, Hello, World!

5.5.3 더 많은 리터럴 종류

리터럴을 사용하여 소스 코드에서 정수, 실수, 문자 및 문자열을 표현해 보았습니다. 이러한 리터럴은 변수에 저장되어 사용됩니다. C 언어에서 NULL 리터럴은 "아무것도 없는 값"을 의미합니다. 널(Null) 값을 나타내는 NULL 키워드는 뒤에서 자세히 다루겠습니다. 좀 더 다양한 모양의 리터럴을 다음 코드로 살펴보고 넘어가겠습니다.

코드: literal_more.c

#include <stdio.h>

int main(void)
{
    printf("%d\n", 1234);           // 1234: 정수 리터럴
    printf("%d\n", 99);             // 99: 10진 정수 리터럴 
    printf("0%o\n", 012);           // 012: 8진 정수 리터럴 
    printf("0x%X\n", 0x1A);         // 0x1A: 16진 정수 리터럴 
    printf("%f\n", 0.12f);          // 0.120000: 실수 리터럴 
    printf("%f\n", 0.34f);          // 0.340000: 실수 리터럴 소수점 표기 
    printf("%f\n", 0.56F);          // 0.560000: 실수 리터럴 소수점 표기 
    printf("%f\n", 1.0e-3f);        // 0.001000: 실수 리터럴 지수 표기법 
    printf("%f\n", 1.0E-3F);        // 0.001000: 실수 리터럴 지수 표기법 
    printf("%c\n", 'C');            // C: 문자 리터럴 
    printf("%s\n", "C language");   // C language: 문자열 리터럴 
    printf("%p\n", NULL);           // 00000000: NULL 리터럴

    return 0;
}
1234
99
012
0x1A
0.120000
0.340000
0.560000
0.001000
0.001000
C
C language
00000000

우리가 일상적으로 사용하는 10진수는 숫자 그대로 표현합니다. 10진수와 구분을 짓기 위해서 8진수는 숫자 0을 앞에 붙이고 16진수는 0x(zero x)를 숫자 앞에 붙입니다. 8진수(Octal)는 %o를 서식 지정자로 사용하고 16진수(Hexadecimal)은 %X를 사용합니다. NULL 리터럴은 %d로 출력하면 0이 나옵니다. 하지만, 값 자체를 의미하기보다는 아무것도 없는 값을 나타내는 특별한 키워드입니다.

5.6 [실습] 변수를 만들고 값 저장 후 사용하기

5.6.1 소개

Visual Studio에서 콘솔 응용 프로그램 프로젝트를 만들고 변수를 만들고 사용하는 예제를 만들어 보겠습니다.

5.6.2 따라하기

(1) 새로운 C 언어 콘솔 프로젝트를 다음과 같이 생성합니다. 참고로 C 언어에서는 프로젝트 이름 및 C 언어 파일에 한글도 사용할 수 있습니다.

프로젝트 형식 템플릿 이름 위치
C/C++ 빈 프로젝트 VariableNote C:\C

(2) Visual Studio의 솔루션 탐색기에서 variable_note.c 파일을 추가합니다.

코드: variable_note.c

//[?] 변수(Variable): 프로그램에서 사용할 데이터를 저장해 놓는 그릇
#include <stdio.h>

int main(void)
{
    //[1] 변수 만들기(선언)
    int i; // i 이름으로 변수 만들기

    //[2] 변수에 값을 저장하기(대입, 할당)
    i = 1234;

    //[3] 변수에 들어 있는 값 사용하기(참조)
    printf("%d\n", i); // 1234

    return 0;
}
1234

(3) 변수 i에 들어 있는 값인 1234가 화면에 출력됩니다.

  1. int 키워드를 사용하여 i라는 이름의 정수를 담을 수 있는 그릇을 만듭니다. 변수를 만드는 작업을 “변수를 선언한다”라고 표현합니다. 처음 작성하는 예제이기에 i라는 변수를 사용하지만 일반적으로 의미있는 변수 이름을 사용합니다.
  2. 정수형 변수 i에 등호(=) 기호를 사용하여 1234를 저장합니다. 변수에 값을 저장하는 것을 변수 초기화, 변수에 값 대입, 변수에 값 할당 등으로 표현합니다.
  3. 변수를 선언했으니 printf() 함수로 변수의 값을 출력합니다. 이처럼 변수의 값을 사용하는 것을 “변수를 참조한다”라고 표현합니다.

5.6.3 마무리

다음처럼 변수를 선언하면서 값을 바로 지정할 수도 있습니다.

int i = 1234;

5.7 쓰레기 값

C 언어는 변수 선언 후 초기화하지 않아도 실행이 되었습니다. 그렇게하면 해당 변수에는 쓰레기 값이 보관됩니다. 그래서, 최근 컴파일러는 강제로 변수를 초기화하게 합니다.

코드: garbage.c

#include <stdio.h>

int main(void)
{
    int number;

    // 변수 초기화 필요
    number = 1234;

    // 변수 선언만하고 사용하면 매번 쓰레기 값이 출력
    printf("number 변수의 값: %d\n", number);

    return 0;
}
number 변수의 값: 1234

코드에서 number 이름을 갖는 변수를 초기화하는 부분을 빼고 실행하면, Visual Studio와 같은 최근 도구는 에러로 판단하여 실행이 되지 않습니다.

5.8, 변수 선언과 동시에 초기화

이번 예제에서는 변수를 선언과 동시에 값을 할당하여 초기화해주는 내용을 다뤄보겠습니다.

변수 초기화란 변수가 선언되면 메모리 공간에 변수 이름으로 변수가 만들어지는데 처음에는 쓰레깃값이 저장되어 있습니다.

이곳에 실제 사용할 값을 저장하는 것을 초기화라고 합니다.

다음 그림은 변수를 선언하고 초기화하는 표현한 것입니다.

그림: 변수 선언과 동시에 초기화

변수 선언과 동시에 초기화

변수를 만들고 바로 값을 초기화 한 후 사용하는 예제를 만들어보겠습니다. 다음 코드를 소스 코드 편집창에 입력한 뒤 실행해보세요.

코드: variable_demo.c

#include <stdio.h>

int main(void)
{
    int number = 7; //[1] 변수 선언과 동시에 초기화 
    printf("%d\n", number);

    return 0;
}
7

int 키워드를 사용하여 number 이름의 정수를 저장할 수 있는 변수를 생성하고 값으로 7을 대입한 후 콘솔 화면에 출력해 보는 내용이었습니다.

지역 변수

코드: LocalVariable.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int i;
	int j;
	int k;

	i = 1234;
	j = 2345;
	k = 3456;

	printf("%d\n", i + j + k); // 7035

	system("pause");

	return 0;
}
7035

5.8.1. 콤마 기준으로 여러 개의 변수 동시 생성

변수 선언 및 초기화도 콤마를 기준으로 여러 개를 동시에 할 수 있습니다.

코드: variable_initialize.c

#include <stdio.h>

int main(void)
{
    //[1] 변수 선언과 초기화를 한 번에 처리 
    int first = 10;

    //[2] 콤마를 사용하여 여러 개의 변수를 동시에 선언 및 초기화
    int second = 20, third = 30;

    printf("%d, %d, %d\n", first, second, third);

    return 0;
}
10, 20, 30

변수 선언 구문 뒤에 = 기호를 붙여서 값을 바로 할당하는 방법으로 선언과 동시에 초기화를 시켜줄 수 있습니다.

5.8.2 참고: int 형식에 실수 데이터 입력 시도

실수 자료는 int 형 변수에 값을 넣을 수는 있습니다. 예를 들어 다음 코드와 같이 int 형식 변수인 number에 3.14 값을 넣으면 소수점 자리는 떨어져 나가고 정수 데이터만 담깁니다.

코드: integer_value.c

#include <stdio.h>

int main(void)
{
    //int number = 3; // 정상 실행
    int number = 3.14; // 잘못된 데이터 저장
    printf("%d\n", number);

    return 0;
}
3

5.9 같은 형식의 변수 여러 개를 한 번에 선언하기

이번 예제에서는 한 번에 여러 개의 변수를 선언하는 방법에 대해서 알아보겠습니다. C 언어에서는 동일 데이터 타입을 갖는 변수를 콤마(,) 기호로 구분해서 여러 개 선언할 수 있습니다.

> 데이터 타입 변수1, 변수2, 변수3;

다음 그림처럼 따로 따로 변수를 선언하는 방법과 동일하게 콤마를 구분으로 여러 개의 변수를 선언할 수 있습니다.

[그림] 같은 데이터 타입을 가지는 3개의 변수 선언하기

같은 데이터 타입을 가지는 3개의 변수 선언하기

5.10 콤마 기호로 여러 개의 변수 선언

콤마를 구분으로 한 줄에 여러 개의 변수를 선언하는 방법을 살펴보겠습니다. 다음 코드를 소스 코드 편집창에 입력한 뒤 실행해보세요.

코드: variable_comma.c

//[?] 콤마를 사용하여 동일 데이터 타입을 갖는 변수 여러 개 만들기
#include <stdio.h>

int main(void)
{
    //[1] 콤마(,) 기호로 여러 개의 변수 선언
    int number1, number2, number3;

    number1 = 1;
    number2 = 2;
    number3 = 3;

    printf("%d, %d, %d", number1, number2, number3);

    return 0;
}
1, 2, 3

정수형 변수를 선언할 때 사용하는 int 키워드 뒤에 콤마 구분으로 변수 이름을 나열하면 동일 데이터 타입으로 여러 개의 변수가 선언됩니다. 데이터 타입이 다르면 따로 변수를 선언해야 합니다.

5.11 여러 개의 변수를 선언하고 같은 값으로 초기화하기

여러 개의 변수를 같은 값으로 초기화할 때 좀 더 편하게 하기 위해서는 = 기호를 사용하여 다음 코드와 같이 a = b = c = 10; 형태로 초기화하면 됩니다.

코드: variable_same_value.c

#include <stdio.h>

int main(void)
{
    int a, b, c;

    //[1] 여러 개의 변수를 선언하고 같은 값으로 초기화하기
    a = b = c = 10;

    printf("%d, %d, %d\n", a, b, c);

    return 0;
}
10, 10, 10

이번 코드와 같이 동일한 데이터로 초기화하는 방법이 있더라도 최근에는 변수는 한 줄에 하나씩만 선언하고 초기화하는 방법을 주로 사용합니다.

5.12 계산식 사용하기

변수에 값을 대입할 때에는 계산식도 들어올 수 있습니다. 계산식은 소괄호 기호로 묶어도 됩니다.

코드: calculation.c

int calc = 0;
calc = (3 + 5); // 계산식 
printf("3 + 5 = %d\n", calc); // 3 + 5 = 8
3 + 5 = 8

5.13 표기법(Notation)

변수 이름을 지을 때 헝가리안(Hungarian) 표기법, 파스칼(Pascal) 표기법, 낙타 표기법(Camel Case), 스네이크(Snake) 표기법 등이 있습니다. 그 내용을 간단히 정리하면 아래와 같습니다.

  • 헝가리안(Hungarian) 표기법: 변수 이름은 데이터 타입에 맞는 접두사를 붙입니다.
    • int intNum = 0; // int 접두사 붙임
  • 파스칼(Pascal) 표기법: 단어를 대문자로 구분합니다.
    • int MyNum = 0; // 대문자로 구분
    • 클래스 이름은 MyNum 형태로 사용
  • 낙타(Camel) 표기법: 변수 이름의 첫 문자는 소문자로 시작하고, 그 다음 단어들의 첫 문자는 대문자로 시작합니다.
    • int myNum = 0; // 마치 낙타 등 모양처럼 들쑥날쑥하게 구분
  • 스네이크(Snake) 표기법: 접두사와 단어를 _(언더스코어 문자)로 구분합니다.
    • int my_num = 0; // _로 구분

프로그래밍에서 변수 이름을 짓는 스타일은 위와같이 일반적으로 4가지 스타일을 제공합니다. 스타일은 가이드라인이지 규칙이 아니기에 반드시 따를 필요는 없습니다. 단, C 언어는 스네이크 표기법을 가장 선호합니다.

5.14 상수(Constant) 사용하기 – const로 상수 사용하기

변수를 선언할 때 const 키워드를 앞에 붙이면 이 변수는 상수가 되어 한번 선언 후 다시 초기화되지 않습니다. 이러한 const 키워드를 붙인 변수를 상수 또는 지역(Local) 상수라고 합니다. 상수는 반드시 선언과 동시에 리터럴로 초기화해야 합니다.

const int MAX = 100;	 

const를 붙여 만든 상수는 선언과 동시에 반드시 초기화해야 하고 새로운 값으로 다시 설정하려고 하면 에러가 발생합니다.

상수(Constant)를 한줄로 정의하면 "변하지 않는 변수, 읽기 전용 변수"로 표현할 수 있습니다. 아래 리스트는 상수에 대한 여러 가지 의미를 적어본 내용이므로 한번 가볍게 읽고 넘어갑니다.

  • 변수와 마찬가지로 메모리 상의 임시 데이터 저장소를 의미합니다.
  • 변수와 달리 선언 후 그 값이 변하지 않는 수를 의미합니다.
  • 읽기전용 변수로 봐도 무관합니다.
  • 반드시 선언과 동시에 특정 리터럴로 초기화를 해야 합니다.

상수를 사용해보겠습니다. 모든 변수 앞에 const를 붙여 상수로 만들 수 있습니다.

코드: constant_demo.c

//[?] 상수(Constant): 변하지 않는 변수, 읽기 전용 변수
#include <stdio.h>

int main(void)
{
    const int MAX = 100;        // 정수 형식의 상수 선언과 동시에 초기화 
    const double NUM = 0.1;     // 실수 형식의 상수 선언과 동시에 초기화 
    const char MY_GRADE = 'A';  // 문자 형식의 상수 선언과 동시에 초기화 

    printf("%d, %.2lf, %c\n", MAX, NUM, MY_GRADE); // 100, 0.10, A

    return 0;
}
100, 0.10, A

int MAX = 100; 코드 앞에 const 키워드를 붙여 MAX 변수를 상수로 만들었습니다. 상수는 한번 선언 후 그 값을 변경할 수 없습니다. 상수는 반드시 선언과 동시에 초기화를 해주어야 합니다. 그렇지 않으면 에러가 발생합니다. double, char와 같이 모든 데이터 타입에 const를 붙여 상수로 만들고 사용할 수 있습니다. 참고로, const 키워드는 int const 형태로 데이터 타입 뒤에 위치해서 사용해도 됩니다.

5.14.1 상수를 한 줄로 정의하기

상수를 한 줄로 정의하면 변하지 않는 변수, 읽기 전용 변수라고 합니다.

코드: 상수_한줄정의.c

//[!] 상수(Constant): 변하지 않는 변수, 읽기 전용 변수
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	//[1] 상수 선언과 동시에 초기화
	const double PI = 3.14;

	//[2] 상수 참조
	printf("%.2f\n", PI); // 3.14

	system("pause");
}

3.14

용어: Immutable

TIP

Immutable

프로그래밍 환경에서 자주 나오는 용어 중에는 MutabilityImmutable이 있습니다. Mutability변할 수 있는 의미로 변수와 같고, Immutable변할 수 없는 의미로 상수와 같습니다.

5.15 장 요약

하나의 이름으로 하나의 데이터 타입을 임시로 보관해 놓는 그릇 역할을 하는 변수에 대해서 알아보았습니다. 계속해서 변수 선언에 사용되는 여러 가지 데이터 타입들을 알아보겠습니다.

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