icon
2장 : 변수와 데이터 타입

변수 선언과 초기화


지난 장에서 C++이 데이터를 어떤 종류로 분류하는지, 즉 데이터 타입에 대해 학습했습니다.

이제 이러한 데이터 타입들을 사용하여 실제 값을 저장하고 프로그램 내에서 활용하는 방법에 대해 알아볼 차례입니다.

그 핵심 개념이 바로 변수(Variable) 입니다.

변수는 프로그램에서 데이터를 저장하고 조작하는 데 사용되는 메모리 공간에 붙여진 이름입니다.

마치 상자에 이름을 붙여 물건을 보관하듯이, C++에서 변수는 특정 타입의 데이터를 담을 수 있는 메모리 위치에 이름을 부여하는 역할을 합니다.

이 장에서는 변수를 어떻게 '선언'하고, '초기화'하며, 그 값에 어떻게 접근하고 변경하는지에 대해 상세히 살펴보겠습니다.


변수란 무엇인가?

변수는 "변할 수 있는 값"을 저장하는 공간입니다.

프로그램이 실행되는 동안, 변수에 저장된 값은 필요에 따라 변경될 수 있습니다.

예를 들어, 게임에서 플레이어의 점수를 저장하는 변수는 게임 진행에 따라 점수가 계속해서 바뀔 것입니다.

변수는 다음과 같은 중요한 요소들을 가집니다.

  • 이름 (Name): 변수를 식별하고 접근하기 위해 사용되는 고유한 이름입니다. (예: score, userName, temperature)
  • 타입 (Type): 변수가 어떤 종류의 데이터를 저장할 것인지 명시합니다. (int, double, char 등)
  • 값 (Value): 변수에 실제로 저장된 데이터입니다.
  • 메모리 주소 (Memory Address): 변수가 컴퓨터 메모리의 어느 위치에 저장되어 있는지를 나타내는 고유한 식별자입니다. 프로그래머가 직접적으로 다루는 경우는 드물지만, 내부적으로 변수는 메모리 주소와 연결됩니다.

변수 선언 (Declaration)

변수를 사용하기 위해서는 먼저 어떤 타입의 데이터를 저장할 것이며, 그 변수에 어떤 이름을 붙일 것인지를 컴파일러에게 알려주어야 합니다.

이 과정을 변수 선언(Variable Declaration) 이라고 합니다.

변수를 선언하면, 컴파일러는 해당 변수에 적합한 크기의 메모리 공간을 할당할 준비를 합니다.

변수 선언 형식
데이터_타입 변수_이름;
변수 선언 예시
#include <iostream>

int main() {
    int age;         // 'age'라는 이름의 정수(int)를 저장할 변수 선언
    double weight;   // 'weight'라는 이름의 실수(double)를 저장할 변수 선언
    char initial;    // 'initial'이라는 이름의 문자(char)를 저장할 변수 선언
    bool isStudent;  // 'isStudent'라는 이름의 논리 값(bool)을 저장할 변수 선언

    std::cout << "변수들이 선언되었습니다." << std::endl;
    // 이 시점에서 변수들은 아직 의미 있는 값을 가지지 않을 수 있습니다.
    // (쓰레기 값을 가질 수 있습니다)

    return 0;
}

변수를 선언하는 순간 메모리 공간이 할당되지만 이 공간에는 이전에 사용했던 알 수 없는 값, 즉 쓰레기 값(Garbage Value) 이 남아 있을 수 있습니다.

따라서 변수를 선언한 후에는 반드시 유효한 값으로 채워주는 과정이 필요합니다.


변수 초기화 (Initialization)

변수를 선언하면서 동시에 처음으로 값을 할당해 주는 것을 초기화(Initialization) 라고 합니다.

초기화는 변수에 의미 있는 값을 부여하여 쓰레기 값이 사용되는 것을 방지하고, 프로그램의 안정성을 높이는 데 필수적입니다.

C++11 표준 이후에는 여러 가지 초기화 방법이 있으며, 각 방식은 미묘한 차이가 있습니다.

복사 초기화 (Copy Initialization): (C 스타일 초기화) 가장 전통적인 방법으로, 등호(=)를 사용하여 값을 할당합니다.

int score = 100; // score 변수에 100이라는 값으로 초기화
double temperature = 25.5;

직접 초기화 (Direct Initialization): 괄호 ()를 사용하여 함수 호출과 유사한 형태로 초기화합니다.

int count(50); // count 변수에 50으로 초기화
double price(99.99);

유니폼 초기화 (Uniform Initialization) / 중괄호 초기화 (Brace Initialization): (C++11 도입) 중괄호 {}를 사용하여 초기화합니다. 이 방법은 모든 데이터 타입에 일관되게 적용할 수 있어 권장됩니다. 특히, 데이터 손실이 발생하는 암묵적인 타입 변환을 방지하는 특징이 있어 더욱 안전합니다.

int level{10}; // level 변수에 10으로 초기화
double gravity{9.8};
char grade{'A'};
bool isActive{true};

만약 {} 안에 초기화 값이 없다면, 해당 변수는 0으로 초기화됩니다 (또는 해당 타입의 기본값으로). 이를 값 초기화(Value Initialization) 라고 합니다.

int zero_int{}; // 0으로 초기화
double zero_double{}; // 0.0으로 초기화
bool false_bool{}; // false로 초기화

다중 변수 선언 및 초기화: 같은 타입의 변수를 여러 개 선언할 때는 쉼표(,)로 구분하여 한 줄에 선언할 수 있습니다. 동시에 초기화도 가능합니다.

다중 변수 선언과 초기화 예시
int x = 10, y = 20, z = 30;
double a{1.1}, b{2.2}, c{3.3};
변수 선언과 초기화 예시
#include <iostream>

int main() {
    // 변수 선언과 동시에 초기화
    int studentId = 20240001; // 복사 초기화
    std::string studentName = "김철수"; // 문자열 타입 (string)은 다음 장에서 자세히 다룹니다.
    double score = 85.5; // 직접 초기화
    bool isPassed{true}; // 유니폼 초기화

    // 선언 후 값 할당 (이것은 '초기화'가 아닌 '할당'입니다. 이미 선언된 변수에 값을 변경하는 것)
    int numberOfAttempts; // 선언만 하고 초기화하지 않음 (쓰레기 값)
    numberOfAttempts = 3; // 값 할당 (초기화 아님)

    // 변수의 값 출력
    std::cout << "학생 ID: " << studentId << std::endl;
    std::cout << "학생 이름: " << studentName << std::endl;
    std::cout << "점수: " << score << std::endl;
    std::cout << "합격 여부: " << std::boolalpha << isPassed << std::endl; // boolalpha로 true/false 문자 출력
    std::cout << "시도 횟수: " << numberOfAttempts << std::endl;

    // 변수의 값 변경
    score = 92.0; // 점수를 92.0으로 변경
    isPassed = false; // 합격 여부를 false로 변경 (만약 재시험 등으로)

    std::cout << "\n--- 값 변경 후 ---" << std::endl;
    std::cout << "변경된 점수: " << score << std::endl;
    std::cout << "변경된 합격 여부: " << std::boolalpha << isPassed << std::endl;

    return 0;
}

변수 이름 규칙 (Naming Rules)

변수 이름을 지을 때는 C++ 언어에서 정한 몇 가지 규칙을 따라야 합니다.

이 규칙들을 지키지 않으면 컴파일 오류가 발생합니다.

  • 알파벳, 숫자, 밑줄(_)만 사용 가능: 한글이나 특수 문자(%, $, # 등)는 사용할 수 없습니다.
  • 숫자로 시작할 수 없음: 변수 이름은 반드시 알파벳이나 밑줄로 시작해야 합니다. (예: 1stPlayer는 안 되지만 player1은 가능)
  • 예약어(Keyword) 사용 불가: int, double, if, for, while 등 C++ 언어에서 특별한 의미를 가지는 예약어는 변수 이름으로 사용할 수 없습니다.
  • 대소문자 구분: C++은 대소문자를 구분합니다. ageAge는 서로 다른 변수로 인식됩니다.
  • 공백 포함 불가: 변수 이름에 공백을 포함할 수 없습니다. (my age는 안 됨)

좋은 변수 이름 짓기: 규칙을 지키는 것 외에도, 코드를 읽는 사람이 변수의 용도를 쉽게 짐작할 수 있도록 의미 있는 이름을 짓는 것이 중요합니다.

  • 의미 전달: totalScore, userName, isValid 등 변수의 역할이 명확히 드러나도록 이름을 짓습니다.
  • 일관된 표기법
    • 카멜 케이스 (Camel Case): 첫 단어는 소문자로 시작하고, 다음 단어의 첫 글자는 대문자로 시작합니다. (예: myVariableName) C++에서 일반적으로 선호되는 방식입니다.
    • 스네이크 케이스 (Snake Case): 모든 단어를 소문자로 쓰고 단어 사이에 밑줄을 사용합니다. (예: my_variable_name)
    • 어떤 방식을 사용하든, 프로젝트 내에서 일관성을 유지하는 것이 중요합니다.

const 키워드: 상수를 만드는 방법

때로는 프로그램에서 변경되지 않는 고정된 값을 사용해야 할 때가 있습니다.

예를 들어, 원주율(PI)이나 특정 게임의 최대 생명력과 같은 값들은 프로그램이 실행되는 동안 변하지 않아야 합니다.

이럴 때 사용하는 것이 const 키워드입니다.

const 키워드를 변수 타입 앞에 붙이면, 해당 변수는 상수로 선언되어 초기화된 이후에는 값을 변경할 수 없게 됩니다.

만약 const 변수의 값을 변경하려고 시도하면 컴파일 오류가 발생합니다.

const 변수 선언 형식
const 데이터_타입 변수_이름 = 값;
const 변수 예시
#include <iostream>

int main() {
    const double PI = 3.141592; // 원주율 PI를 상수로 선언 및 초기화
    const int MAX_LIVES = 3;    // 최대 생명력을 상수로 선언

    std::cout << "원주율: " << PI << std::endl;
    std::cout << "최대 생명력: " << MAX_LIVES << std::endl;

    // PI = 3.14; // 컴파일 오류 발생! 상수는 값을 변경할 수 없습니다.

    return 0;
}

const는 "상수"를 의미하며, 컴파일러에게 이 값이 변경되지 않을 것임을 알려주어 더 효율적인 코드 생성이나 오류 방지에 도움을 줍니다.

또한 코드의 가독성을 높여 이 값이 고정된 값임을 쉽게 알 수 있게 합니다.