티스토리 뷰

반응형
C++ 생성자 멤버 초기화 방법 정리

✅ 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++의 안전하고 일관된 설계 방식입니다.
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함
반응형