반응형
Today
Total
Recent Posts
Recent Comments
Archives
11-27 17:50
«   2024/11   »
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
관리 메뉴

UD_park's IT story

[C++] 생성자와 소멸자, 디폴트/변환 생성자 본문

IT - Language/C++

[C++] 생성자와 소멸자, 디폴트/변환 생성자

kingllzn 2018. 6. 16. 16:53
반응형
SMALL

이번에는 한꺼번에 많은

내용들을 간단하고 쉽게 설명하는

포스팅을 해보겠습니다

 

(학습 서적 이것이 C++이다에서

내용 발췌하였습니다)

 

[보기용 예제 소스 코드에서 오류 발생시에

댓글이나 방명록에 글을 남겨 주시면 수정/보완하겠습니다]

 

 

 

① 생성자와 소멸자

② 생성자의 다중정의

③ 명시적 디폴트 생성자

④ 변환 생성자

이번 포스팅에 다룰 내용이

많아서 좀 길어질 수도 있겠네요

 

 

일단 ① 생성자와 소멸자에

대해서 설명을 해보겠습니다

간단한 설명으로 시작해보겠습니다

 

생성자와 소멸자는

클래스 객체가 생성 및 소멸될 때

'자동'으로 호출되는 함수입니다

 

사용법은 다음과 같습니다

 

class 클래스이름

{

접근제어지시자:

클래스이름(); // 이게 생성자

{

}

~클래스이름(); // 이게 소멸자

{

}

}

그리고 매개 변수가 하나도 없는

생성자를 바로 디폴트 생성자(Default Construct)

라고 부릅니다 이 디폴트 생성자는

프로그램 작성자가 디폴트 생성자와 소멸자를

따로 쓰지 않아도 소스를 읽고 CMD로 실행시키는

컴파일러가 알아서 만들어 넣습니다

 

우리 눈에는 보이지 않지만

없으면 컴파일러가 혼자서 써넣고

CMD를 실행할 때 읽어들인다는 것이죠

(즉, 이 세상에 생성자와 소멸자가 없는

클래스는 존재하지 않는다

다만 눈에 보이지않게 컴파일러가

추가해 넣을 뿐)

 

아래의 간단한 보기로

설명을 계속 이어 가도록 하겠습니다

 

간단한 코딩으로 설명을

드리겠습니다

먼저 소스의 메인 함수를 보시면

23번 줄에 메인 함수의 시작을 출력했습니다

25번 줄에서는 Test라는 이름의 클래스의 인스턴스인

a를 선언했습니다

 

여기서 중요한 점 한 가지는

a는 바로 메인 함수안에 소속된

지역 변수입니다

즉, 메인 함수가 모두 동작이 끝나면

a라는 아이는 자동으로 사라져 없어집니다

 

앞의 설명을 다시 이어가자면

27번 줄에서 메인 함수의 종료를 나타내는

출력을 마지막으로 메인함수는 끝이납니다

하지만 CMD의 결과창을 보면

 

메인 함수가 끝났음에도 뭔가가 하나 더

동작을 하고 끝을 맺습니다

이것이 바로 소멸자 입니다

 

그럼 여기서 한 가지 문제를 내보겠습니다

Test a;라는 25번 줄의 코드를

20번 줄에다가 쓰면 어떻게 되겠습니까?

 

잘 생각하시고 답을 내시어

밑의 결과를 확인해 주시기 바랍니다

 

 

 

 

바로 답은 아래의 화면과 같습니다

이말인 즉 여태 알고있었던

 

작성된 프로그램에서 가장 먼저 호출되는 함수는 바로 Main 함수이다

라는 생각을 뒤집어 버립니다

한마디로 class의 전역 변수가

main 함수보다 먼저 호출된다는 것입니다

그리고 소멸자는 항상 함수의 모든 동작이

끝난 후에 호출된다는것

 

이 사실을 기억해 주시기 바랍니다

 

 

두 번째 바로 ② 생성자의 다중정의에

대해서 설명을 해보겠습니다

 

이전에 포스팅했었던

함수의 다정정의와 생성자의 다중정의는

조금 다른면이 존재합니다

 

일단 생성자의 다중정의는

다른 생성자를 추가로 부르는

생성자 초기화 함수입니다

 

생성자가 여러개 다중 정의 된다면

같은 코드가 계속해서 반복 될 수 있기 때문에

생성자는 초기화 목록에서

추가로 호출될 수 있도록 위임을 해줍니다

 

이렇게 되면 같은일을 하는 코드가

여러번 반복해서 나타날 필요가 사라집니다

 

위에서 보시는 바와 같이

같은 이름의 GetNumber를

A와 B에서는 변수의 개수에 따라 구분해

사용하게 됩니다

 

세 번째의 C는 자료형까지 다르지만

새로운 이름을 추가해서 사용해야 합니다

 

만약 함수의 다중정의에서 사용했던

매개 변수의 개수와 타입에 따라서

구분했었던 대로 사용한다면

아래와 같은 오류가 발생할 수 있습니다

 

 

 

 

세 번째

③ 명시적 디폴트 생성자입니다

이에 대한 정의는 다음과 같습니다

 

default 예약어를 사용하면 별도로

정의하지 않아도 선언과 정의를

한 번에 끝낼 수 있다

라고 정의하고 있습니다

 

말로는 이해가 어려우니

예제 소스 코드로서

설명을 덧붙이겠습니다

 

14번 줄에서의 코드가 바로

default 입니다

 

즉 주석으로 처리한 12번줄과 19번줄의

코드를 14번줄의 코드 한 줄로

깔끔하게 줄이며 제 기능 또한 수행합니다

 

Test라는 클래스에

Test를 default로 초기화시키고

그밑에 변수의 선언과 정의를했습니다

 

위의 정의처럼 별도의 코드없이

선언과 정의를 한 번에 끝내고

있는 모습입니다

 

 

그리고 마지막 네 번째

④ 변환 생성자 입니다

 

변환 생성자의 정의는

 

매개 변수가 한 개 뿐인 생성자를

'변환 생성자(Conversion Constructor)'

라고 부릅니다

 

변환 생성자에 대한 더 자세한 설명은

복사 생성자의 심화에 대한 설명과

사용법의 포스팅에서 다루도록 하겠습니다

 

혹시 다른것에 대해 궁금하신게

있으시다면

댓글에 달아주세요

 

아는것이면 친절하게 쉽게

모르는것이면 또 제가 알아내서

친절하게 쉽게 포스팅해서

설명해드리겠습니다

 

 

 

 

 

 

 

 

 

반응형
LIST
Comments