중괄호 초기화와 초기값: 더 안전한 변수 초기화
5강. 중괄호 초기화와 초기값: 더 안전한 변수 초기화
이번 강의에서 해결할 문제
지역 정수에 초기값을 주지 않거나 소수 값을 정수에 암시적으로 넣으면 프로그램이 예측하지 못한 값으로 시작하거나 정보가 조용히 사라질 수 있습니다. 생성 방법이 여러 가지면 같은 타입도 파일마다 다른 모습으로 초기화됩니다.
학습 목표
- 초기화와 이후 대입을 구분합니다.
- 중괄호 초기화가 축소 변환을 막는 사례를 확인합니다.
- 구조체가 유효한 초기 상태를 갖도록 값을 제공합니다.
먼저 알아야 할 핵심 개념
초기화는 객체가 만들어질 때 첫 값을 정하는 일이고 대입은 이미 존재하는 객체의 값을 바꾸는 일입니다. {}를 사용한 목록 초기화는 다양한 타입에 일관된 형태를 제공하며 double을 int로 조용히 줄이는 축소 변환을 컴파일 오류로 막습니다.
가장 작은 실행 가능한 예제
#include <iostream>
#include <string>
struct PlayerState {
std::string name;
int lives;
float moveSpeed;
};
int main() {
PlayerState player{"Mina", 3, 2.5F};
int roundedSpeed{static_cast<int>(player.moveSpeed)};
std::cout << player.name << ' ' << player.lives << ' '
<< player.moveSpeed << ' ' << roundedSpeed << '\n';
}
핵심 코드 줄별 설명
PlayerState의 세 멤버를 선언 순서대로 초기화합니다.2.5F의F는 리터럴이float임을 나타냅니다.- 소수 값을 정수로 바꿀 때
static_cast<int>로 정보 손실 의도를 드러냅니다. int roundedSpeed{player.moveSpeed};는 축소 변환이라 컴파일되지 않습니다.- 모든 값이 생성 시점에 정해져 초기화되지 않은 멤버가 없습니다.
실행 결과와 값 변화
Mina 3 2.5 2
정수 변환은 소수 부분을 버리므로 2.5가 2가 됩니다. 이 변환이 정말 필요한지 호출부에서 검토할 수 있도록 명시적으로 작성했습니다.
단계별 실습
실습 목표
아이템 정보를 안전한 초기값으로 생성합니다.
시작 전 상태와 실행 방법
Item 구조체에 name, count, weight를 선언한 C++17 콘솔 파일을 준비합니다.
1단계: 최소 코드 작성
Item potion{"Potion", 2, 0.5F};를 만들고 세 값을 출력합니다.
2단계: 값 또는 조건을 바꿔 결과 비교
개수를 2.5로 바꾸어 축소 변환 오류가 발생하는지 확인한 뒤 올바른 정수로 복구합니다.
3단계: 작은 기능 확장
멤버 선언에 count{0}과 weight{0.0F} 기본값을 주고 이름만 지정한 생성 경로를 만듭니다.
4단계: 스스로 해결하기
아이템 개수가 음수가 되지 않도록 생성자에서 검사하는 방법을 설계하세요.
막혔을 때
멤버 순서와 초기값 순서가 다르면 타입 오류나 잘못된 값이 생깁니다. 이름이 같은 타입이 여러 개라면 생성자를 만들어 매개변수 의미를 분명하게 하는 것도 좋습니다.
흔한 실수와 해결 방법
{}가 모든 오류를 막는다고 생각: 멤버 순서를 바꾸는 논리 오류는 여전히 검토해야 합니다.- 축소 변환을 억지로 캐스팅: 정보 손실이 정말 요구사항인지 먼저 확인합니다.
- 기본값 없이 멤버 방치: 생성 경로마다 모든 멤버가 유효한지 확인합니다.
게임 개발 연결
플레이어 체력, 이동 속도, 아이템 개수는 게임 시작 전 유효한 상태가 필요합니다. Unreal의 UPROPERTY도 C++ 멤버 기본값과 에디터 설정값이 만나는 순서를 이해해야 하며, 생성자와 기본 멤버 초기값에 불변식을 분명히 둡니다.
이해 점검 질문 3개
- 초기화와 대입은 객체 수명의 어느 시점에서 다른가요?
- 중괄호 초기화가
double에서int변환을 막는 이유는 무엇인가요? - 명시적 캐스팅을 사용하기 전에 확인해야 할 것은 무엇인가요?
핵심 요약
객체는 생성되는 순간부터 유효해야 합니다. 중괄호 초기화와 기본 멤버 값을 사용하고, 정보가 줄어드는 변환은 컴파일러와 독자가 모두 볼 수 있게 명시합니다.
다음 강의 연결
6강. enum class에서 상태를 임의의 정수가 아니라 허용된 이름의 집합으로 제한합니다.
중괄호 초기화와 초기값: 더 안전한 변수 초기화 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.