Skip to main content

변수, 자료형, 상수, 입출력

프로그램이 똑똑해 보이는 이유는 사실 거창하지 않습니다. 값을 입력받고, 잠시 기억해 두고, 다시 보여 주기 때문입니다. 계산기든 게임이든 회원 가입 화면이든 출발은 같습니다. C++에서는 이 일을 위해 변수, 자료형, 상수, 그리고 입출력 도구를 사용합니다.

변수는 프로그램의 기억 상자

변수(variable)는 값을 저장하는 이름 붙은 메모리 공간입니다. 예를 들어 나이, 키, 점수, 이름 같은 데이터를 담아 둘 수 있습니다. C++에서는 변수를 쓰기 전에 반드시 자료형과 함께 선언해야 합니다. C++이 강한 정적 타입 언어이기 때문입니다.1

int age = 20;
double height = 175.5;
char grade = 'A';
bool isStudent = true;
std::string name = "홍길동";

여기서 age와 height 같은 이름은 식별자(identifier)이고, 앞의 int, double 같은 말이 자료형입니다. 자료형은 "어떤 종류의 값을 저장할지"를 컴파일러에게 알려 줍니다.1

변수는 흔히 상자에 비유하지만, 실제로는 "이름이 붙은 저장 위치"에 더 가깝습니다. 상자 겉면에 age라고 적혀 있으면 정수 나이를, name이라고 적혀 있으면 문자열 이름을 넣는 식입니다. 상자 라벨이 바뀌면 안 되듯, 변수의 자료형도 선언 뒤에는 고정됩니다.

자료형은 값의 성격을 정한다

컴퓨터 입장에서는 결국 전부 0과 1이지만, 프로그램은 그 비트를 어떻게 읽어야 하는지 알아야 합니다. 65를 숫자로 볼지, 'A'라는 문자로 볼지, true라는 논리값으로 볼지는 자료형이 결정합니다.1

초보자가 가장 자주 쓰는 자료형은 아래 다섯 가지입니다.

자료형무엇을 저장하나예시
int정수3, -10, 2026
double소수점이 있는 실수3.14, 175.5
char문자 1개'A', 'z', '7'
bool참/거짓true, false
std::string문자열"Hello", "홍길동"

정수에는 보통 int, 실수에는 보통 double을 먼저 쓰면 됩니다. 문자 하나는 char, 예/아니오처럼 두 상태만 필요하면 bool, 여러 글자의 텍스트는 std::string이 맡습니다.24

자료형의 크기는 컴파일러와 운영체제에 따라 달라질 수 있습니다. 표준은 char가 정확히 1바이트라는 점과, short <= int <= long <= long long 같은 크기 관계를 보장합니다. 그래서 "int는 무조건 몇 바이트다"라고 외우기보다, 입문 단계에서는 "정수면 int, 일반적인 실수면 double" 정도로 감각을 잡는 편이 좋습니다.2

자주 쓰는 자료형 다섯 가지

int: 정수를 저장한다

사람 수, 점수, 페이지 번호처럼 소수점이 필요 없는 값은 int가 잘 어울립니다.

int score = 95;
int year = 2026;

double: 소수점이 있는 값을 저장한다

키, 몸무게, 온도, 평균처럼 소수점이 필요한 값에는 double을 많이 씁니다. float도 있지만, 입문 단계에서는 보통 double이 더 편하고 안전합니다.2

double temperature = 36.5;
double average = 89.75;

char: 문자 하나만 저장한다

char는 문자 한 글자입니다. 작은따옴표를 사용합니다.

char grade = 'A';
char initial = 'K';

여기서 중요한 차이가 하나 있습니다. 'A'는 문자 하나이고, "A"는 문자열입니다. 생김새는 비슷하지만 C++ 입장에서는 다른 존재입니다.

bool: 참과 거짓을 저장한다

bool은 켜짐/꺼짐, 성공/실패, 예/아니오 같은 상태를 표현할 때 딱 좋습니다.2

bool isLoggedIn = true;
bool isGameOver = false;

cout으로 출력하면 보통 true는 1, false는 0으로 보입니다. 처음 보면 조금 무뚝뚝하지만, 컴퓨터는 원래 이런 식으로 솔직합니다.

std::string: 여러 글자를 저장한다

이름, 주소, 메시지처럼 글자가 여러 개라면 std::string을 사용합니다. 큰따옴표를 씁니다. 문자열을 쓰려면 <string> 헤더도 함께 포함하는 습관을 들이면 좋습니다.4

#include <string>

std::string name = "홍길동";
std::string message = "C++는 생각보다 재미있다!";

선언, 대입, 초기화는 서로 다르다

변수를 다룰 때 초보자가 가장 먼저 헷갈리는 세 단어가 선언, 대입, 초기화입니다.

선언은 변수를 "만들겠다"고 알리는 일입니다.

int age;

대입은 이미 있는 변수에 값을 넣는 일입니다.

age = 20;

초기화는 변수를 만들면서 처음 값을 넣는 일입니다.

int age = 20;

가능하면 선언과 동시에 초기화하는 습관이 좋습니다. 초기화되지 않은 지역 변수는 예측할 수 없는 값을 가질 수 있기 때문입니다.15

요즘 C++에서는 중괄호를 사용하는 초기화도 자주 보입니다.

int count{10};
double pi{3.14159};

이 방식의 장점은 실수로 값이 잘리는 상황을 더 잘 잡아준다는 점입니다. 예를 들어 int x{3.9};는 컴파일 단계에서 문제가 드러나기 쉽습니다.5 초보자에게는 "실수를 빨리 들키게 해 주는 안전벨트"처럼 느껴지면 충분합니다.

변수 이름은 아무 말 대잔치가 아니다

변수 이름에는 규칙이 있습니다. 문자, 숫자, 밑줄(_)을 사용할 수 있고, 숫자로 시작할 수 없습니다. 또한 C++ 키워드인 int, double, return 같은 이름은 변수 이름으로 사용할 수 없습니다. 그리고 C++는 대소문자를 구분합니다. age, Age, AGE는 서로 다른 이름입니다.1

좋은 변수 이름은 값을 설명해 줍니다.

int a = 20;          // 가능은 하지만 의미가 약함
int userAge = 20;    // 훨씬 읽기 쉬움

코드는 컴퓨터보다 사람이 더 자주 읽습니다. 미래의 나도 결국 남입니다. 친절한 이름은 최고의 협업 도구입니다.

상수는 바뀌지 않는 약속이다

프로그램 안에는 처음 정한 뒤 바뀌면 안 되는 값이 있습니다. 원주율 비슷한 값, 최대 인원 수, 세금 비율 같은 것들입니다. 이런 값은 const로 선언합니다.4

const double PI = 3.141592;
const int MAX_USERS = 100;

const가 붙은 변수는 반드시 선언할 때 값을 함께 주는 것이 기본입니다.4 이렇게 해 두면 실수로 값을 바꾸려 할 때 컴파일러가 막아 줍니다.

const int DAYS = 7;
// DAYS = 8;  // 오류

상수를 쓰면 코드가 읽기 쉬워지고, "이 값은 바뀌면 안 된다"는 의도가 분명해집니다. 말하자면 프로그램 안의 규칙 표지판입니다.

cout: 저장한 값을 화면으로 보내기

이제 데이터를 꺼내 보겠습니다. std::cout은 표준 출력 스트림으로, 보통 콘솔 화면에 값을 보여 줄 때 사용합니다. 값은 << 연산자를 이용해 이어 붙이듯 출력합니다.3

#include <iostream>
#include <string>

int main() {
    std::string name = "홍길동";
    int age = 20;
    double height = 175.5;

    std::cout << "이름: " << name << 'n';
    std::cout << "나이: " << age << 'n';
    std::cout << "키: " << height << "cmn";
}

여기서 <<는 "오른쪽 값을 cout으로 보낸다" 정도로 이해하면 됩니다. 문자열도 되고, 숫자도 되고, 변수도 됩니다.3

줄바꿈은 'n'이나 std::endl로 할 수 있습니다. 둘 다 줄을 바꿔 주지만, std::endl은 버퍼를 비우는 동작까지 같이 합니다. 처음에는 둘 중 아무거나 써도 되지만, 단순 줄바꿈이라면 'n'을 더 가볍게 쓰는 편이 흔합니다.3

cin: 사용자에게 값을 입력받기

프로그램이 진짜 프로그램처럼 느껴지는 순간은 사용자의 입력을 받을 때입니다. std::cin은 표준 입력 스트림으로, 보통 키보드에서 값을 읽어 옵니다. >> 연산자를 사용합니다.3

#include <iostream>

int main() {
    int age;

    std::cout << "나이를 입력하세요: ";
    std::cin >> age;

    std::cout << "입력한 나이는 " << age << "살입니다.n";
}

cin >> age;는 사용자가 입력한 값을 age에 저장합니다. 변수의 자료형을 보고 어떤 형식으로 읽을지 결정한다는 점도 중요합니다. int라면 정수를 기대하고, double이라면 실수를 기대합니다.3

여러 값을 한 번에 받을 수도 있습니다.

int x, y;
std::cin >> x >> y;

이 코드는 공백이나 줄바꿈으로 구분된 두 정수를 차례대로 읽습니다.3

문자열 입력에서 가장 많이 하는 실수

cin >>는 아주 편하지만, 문자열을 읽을 때는 한 가지 함정이 있습니다. 공백을 만나면 거기서 입력을 멈춥니다.3

std::string name;
std::cin >> name;

여기서 사용자가 홍 길동이라고 입력하면 홍만 들어갑니다. 한 줄 전체를 읽고 싶다면 getline을 사용합니다.3

std::string fullName;
std::getline(std::cin, fullName);

다만 cin >>와 getline을 섞어 쓸 때는 주의가 필요합니다. 숫자를 cin >>로 읽고 나면 엔터 문자가 입력 버퍼에 남아 있어서, 바로 다음 getline이 빈 줄을 읽어 버릴 수 있습니다. 이때는 남아 있는 줄 전체를 비워 주는 편이 더 안전합니다.

#include <iostream>
#include <limits>
#include <string>

int main() {
    int age;
    std::string comment;

    std::cin >> age;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
    std::getline(std::cin, comment);
}

std::cin.ignore();처럼 한 글자만 무시하는 방식도 아주 단순한 상황에서는 동작할 수 있지만, 입력 버퍼에 무엇이 얼마나 남아 있는지에 따라 부족할 수 있습니다. 그래서 초보자에게는 줄 끝까지 비운다는 의도가 드러나는 위 패턴이 더 안전합니다.

한마디로 요약하면 이렇습니다. "한 단어는 cin >>, 한 줄 전체는 getline." 그리고 둘을 섞으면 버퍼 정리를 의식해야 합니다.

작은 예제로 한 번에 정리하기

이제 입력, 저장, 출력이 한 흐름으로 이어지는 예제를 보겠습니다.

#include <iostream>
#include <string>

int main() {
    std::string name;
    int age;
    double height;
    char bloodType;
    bool beginner = true;
    const std::string language = "C++";

    std::cout << "이름: ";
    std::getline(std::cin, name);

    std::cout << "나이: ";
    std::cin >> age;

    std::cout << "키(cm): ";
    std::cin >> height;

    std::cout << "혈액형 한 글자(A, B, O): ";
    std::cin >> bloodType;

    std::cout << "n--- 자기소개 카드 ---n";
    std::cout << "이름: " << name << 'n';
    std::cout << "나이: " << age << 'n';
    std::cout << "키: " << height << "cmn";
    std::cout << "혈액형: " << bloodType << 'n';
    std::cout << "배우는 언어: " << language << 'n';
    std::cout << "초보자 여부(true=1): " << beginner << 'n';

    return 0;
}

이 프로그램은 아주 평범해 보이지만, 사실 많은 것을 보여 줍니다. name은 문자열, age는 정수, height는 실수, bloodType은 문자, beginner는 논리값, language는 바뀌지 않는 상수입니다. 그리고 이 값들은 모두 입력받거나 저장되었다가, 마지막에 cout으로 출력됩니다.

프로그램의 첫 수업치고는 꽤 근사합니다. 컴퓨터가 드디어 "입을 열고 귀도 가지게 된" 셈이니까요.

자주 하는 실수

초보자들이 특히 자주 만나는 실수는 몇 가지로 좁혀집니다.

  • 초기화하지 않은 변수를 바로 사용한다.

  • char와 string을 헷갈려서 'A'와 "A"를 섞어 쓴다.

  • cin >>로 공백이 들어간 이름을 받으려다가 반만 입력받는다.

  • 정수를 넣어야 하는 변수에 소수나 문자를 넣고도 괜찮을 거라 기대한다.

이런 실수는 이상한 결과를 만들기보다는, 오히려 빨리 만나 보는 쪽이 좋습니다. 에러 메시지는 귀찮은 적이 아니라, 아직 덜 배운 부분을 알려 주는 선생님에 가깝기 때문입니다.

정리

이번 장의 핵심은 단순합니다. 프로그램은 데이터를 입력받고, 저장하고, 다시 출력합니다. 변수는 그 데이터를 잠시 보관하는 이름 붙은 자리이고, 자료형은 그 값의 성격을 정합니다. int, double, char, bool, std::string은 앞으로 정말 자주 만나게 될 기본 멤버들입니다. 여기에 const로 바뀌지 않는 값을 표시하고, cin과 cout으로 사용자와 대화하면 비로소 프로그램다운 프로그램이 시작됩니다.

다음 장에서는 이 값들로 실제 계산을 하고, 비교하고, 판단하는 법을 배웁니다. 데이터를 손에 쥐었으니, 이제 본격적으로 움직여 볼 차례입니다.

참고

1Variables and types - C++ Users

2Fundamental types - cppreference.com

3Basic Input/Output - C++ Users

4Chapter 2: Variables, Data Types, and Basic I/O in C++

5Variables and Data Types in C++

책 목록

초보자를 위한 C++ 수업: 기초부터 현대 C++까지 한 권으로 끝내기

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기