본문 바로가기

Language/C C++

[C++] 클래스 생성자

반응형
[C++] 클래스 생성자

클래스의 인스턴스를 생성할 때 반드시 생성자가 호출된다. 생성자를 통해 클래스가 어떻게 생성되는지 살펴보자.

암시적 생성자와 명시적 생성자

객체를 생성하는 방법은 클래스 내 멤버을 어떤 방식으로 초기화하느냐에 따라 호출되는 생성자가 달라지게 된다. 아래 예시 코드를 통해 알아보려 한다.

아래와 같은 Point 클래스를 정의해보았다.

멤버 변수로 x, y를 가지고 있으며 세 개의 생성자를 가지고 있다. 인스턴스를 생성해보자

위와 같이 다양한 방법으로 Point 인스턴스를 생성할 수 있으며, 방법마다 다른 생성자가 호출되는 것을 확인할 수 있다. 기본적으로 전달되는 인자에 따라 호출되는 생성자가 달라진다.

여기서는 p5를 생성하는 방법을 자세히 보려고 한다. p5의 인스턴스를 생성하기 위해 컴파일러는 아래 방식 중 하나를 선택할 수 있다.

  1. = 대입 연산자를 사용한다.

    • 먼저 타입을 맞추기 위해 8을 인수로 사용하여 임시 Point 객체를 만든다.
    • = 대입 연산자의 왼쪽에 존재하는 p5 변수는 디폴트 생성자를 사용하여 객체를 생성한다.
    • 임시 Point 객체를 p5 객체에 대입시킨다. 이 때 개별 멤버 변수의 복사가 이루어진다.
    • 임시 Point 객체를 삭제한다.
  2. 복사생성자를 사용한다.

    • 8을 인수로 사용하여 임시 Point 객체를 만든다.
    • 임시 Point 객체를 인수로 복사생성자를 사용하여 p5 객체를 생성한다.
    • 임시 Point 객체를 삭제한다.
  3. 일반 생성자(암시적 변환 생성자)를 사용한다.

    • 다음과 같이 8을 인수로 인시갛여 Point 생성자를 호출하여 p5 객체를 생성한다.

      Point p5(8);

1번, 2번 방법의 방법으로 생성할 경우 복사가 일어나게 된다. 일반적으로 복사는 비싼 연산이다. 따라서 ISO에서는 아래와 같이 Copy elision(복사 생략) 이라는 표준을 만들었다.

Copy elision은 불필요한 객체 복사를 제거하는 컴파일러 최적화 기법을 말한다.

무분별한 복사 생성자와 이동 생성자의 호출에 의해 성능 저하가 발생할 수 있으므로 특정 요건에 맞다면 컴파일러는 복사 생성자의 호출을 줄이는 방식으로 최적화를 수행한다. 따라서 대부분의 컴파일러는 3번의 암시적 변환 생성자를 사용하는 방법으로 객체를 생성할 것이다.

하지만 컴파일러의 자의적인 해석을 통해 객체를 생성할 경우 자칫 에러를 유발시킬 수 있따. 따라서 필요하다면 생성자 앞에 explicit 지정자를 사용하여 지정한 방식으로만 객체를 만들도록 할 수 있다. 이러한 생성자를 명시적 생성자라고 한다. explicit 지정자를 적용한 코드는 아래와 같다.

Point(int x, int y)Point(int x, int y)explicit 이 추가되었다. 이제 인스턴스 생성 코드를 살펴보자.

explicit을 추가했을 때 p4p5와 같은 방식으로는 더 이상 인스턴스를 생성할 수 없게된다.

 

반응형

'Language > C C++' 카테고리의 다른 글

[C++] 클래스 표준 입출력  (0) 2021.04.11
[C++] Reference(1/2)  (0) 2020.09.13
[C++]inline 함수  (0) 2019.01.23
[C/C++]std::mutex  (0) 2019.01.23
[C/C++] 소켓 프로그래밍  (0) 2019.01.04