티스토리 뷰
반응형
✅ C++ 생성자에서 멤버를 초기화하는 두 가지 방법: 생성자 vs 초기화 리스트
🔷 1. 멤버 초기화는 어떻게 해야 할까?
C++에서 클래스를 설계할 때 멤버 변수의 초기화는 가장 기본적인 작업이지만,
의외로 많은 혼동을 불러오는 주제입니다.
class Person {
int age;
public:
Person(int a) {
age = a;
}
};
class Person {
int age;
public:
Person(int a) : age(a) {}
};
🔶 2. 생성자 방식 (본문 대입 방식)
📌 정의
생성자의 본문 내부에서 멤버 변수에 값을 대입하는 방식입니다.
class Account {
int balance;
public:
Account(int b) {
balance = b;
}
};
⚙️ 작동 원리
- 멤버 변수는 기본값으로 먼저 생성됨
- 그 후 생성자 내부에서 대입 연산이 일어남
🔶 3. 초기화 리스트 방식 (initializer list)
📌 정의
생성자의 매개변수를 콜론(:
) 뒤에서 직접 멤버에 초기화하는 방식
class Account {
int balance;
public:
Account(int b) : balance(b) {}
};
⚙️ 작동 원리
- 멤버 변수는 초기화와 동시에 생성됨
- 불필요한 기본 생성이나 대입 없음
🔶 4. 두 방식의 구조적 차이 요약
항목 | 생성자 방식 | 초기화 리스트 방식 |
---|---|---|
생성 순서 | 기본 생성 → 대입 | 직접 초기화 |
생성자 호출 | 2단계 (생성 + 대입) | 1단계 |
불필요한 비용 | 복사, 대입 발생 가능 | 없음 |
🔎 특히 const, 참조형, 생성자 없는 멤버에선 초기화 리스트가 필수입니다.
🔶 5. 초기화 리스트가 필수인 상황들
✅ const 멤버 변수
class File {
const int fileId;
public:
File(int id) {
fileId = id; // ❌ 오류
}
};
class File {
const int fileId;
public:
File(int id) : fileId(id) {} // ✅ OK
};
✅ 참조형 멤버 변수
class Logger {
string& name;
public:
Logger(string& n) : name(n) {} // ✅ 필수
};
✅ 생성자가 없는 멤버
class Engine {
public:
Engine(int rpm) { }
};
class Car {
Engine engine;
public:
Car() {
engine = Engine(1000); // ❌ 기본 생성자 없음
}
};
class Car {
Engine engine;
public:
Car() : engine(1000) {} // ✅ OK
};
반응형
🔶 6. 타입 안정성과 축소 초기화 (narrowing)
C++11 이후 도입된 중괄호 초기화{}
는
초기화 리스트와 결합해 타입 안전성까지 보장합니다.
예시: 축소 초기화 금지
int x(3.14); // ✅ OK → x = 3
int y{3.14}; // ❌ 에러: 소수점 손실 방지
- → 중괄호
{}
를 사용하면 의도하지 않은 변환을 막을 수 있습니다. - → 컴파일 타임에서 오류를 잡아주는 안전한 방식입니다.
🔶 7. 공통점과 차이점 정리
항목 | 생성자 방식 (대입) | 초기화 리스트 방식 |
---|---|---|
문법 위치 | 생성자 본문 내부 | 콜론 뒤에서 초기화 |
기본 동작 | 생성 후 대입 | 생성과 동시에 초기화 |
const 멤버 지원 | ❌ 불가 | ✅ 필수 |
참조형 지원 | ❌ 불가 | ✅ 필수 |
성능 | 기본 생성 + 대입 | 직접 초기화 (더 빠름) |
안정성 | 실수 가능성 있음 | 타입 안정성 우수 |
실무 사용 | 제한적, 단순한 경우 | ✅ 실무에서 권장됨 |
반응형
🔷 8. 마무리하며
C++에서는 “객체가 생성될 때 무엇을 해야 하는가?”가 매우 중요합니다.
표면적으로 단순해 보여도, 내부적으로는 메모리, 성능, 타입 안정성과 밀접하게 연결되어 있습니다.
- 👎 생성자 내부에서 대입하는 방식은 단순하고 직관적이지만,
- 🚫 불필요한 생성·대입, const/참조 멤버 지원 불가 등 여러 문제를 가집니다.
- 👍 초기화 리스트는 정확하고 효율적인 초기화 방식이며,
- ✅ 모든 멤버를 명확하게 초기화할 수 있어 실무에서 기본 방식으로 추천됩니다.
따라서 C++에서는
“초기화 리스트를 기본으로 사용하고, 특별한 경우에만 대입을 사용”하는 습관이
모던 C++의 안전하고 일관된 설계 방식입니다.
반응형
'프로그래밍 > 홍정모의 따라배우는 C++' 카테고리의 다른 글
클래스에서 소멸자란? C++ (0) | 2025.05.12 |
---|---|
위임생성자란? (0) | 2025.05.11 |
C++에서 초기화 방법 총 정리! (0) | 2025.05.11 |
클래스에서 생성자란? (0) | 2025.05.11 |
struct와 class의 차이, 접근지정자와 멤버접근함수! (0) | 2025.05.11 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Python
- 일본어문법무작정따라하기
- 윤성우
- 회계
- 통계학
- 오블완
- 류근관
- 일문따
- K-MOOC
- 인프런
- C
- stl
- 인지부조화
- 보세사
- 사회심리학
- c++
- 파이썬
- 여인권
- 티스토리챌린지
- 강화학습
- 데이터분석
- 뇌와행동의기초
- 심리학
- 일본어
- C/C++
- 정보처리기사
- 열혈프로그래밍
- 코딩테스트
- 통계
- 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
반응형