티스토리 뷰

본 자료는 숭실대학교 정보통신전자공학부 소속 소모임 BlindC에서 2학년을 대상으로 하는 C++ 스터디 진행을 위하여 작성합니다.

개인의 소중한 창작물이기 때문에 자료의 열람은 자유이고, 소스코드를 긁어갈 수 있도록 우클릭제한이나 기타 제한은 걸어놓지 않았으나, 외부 공개나, 2차 수정등은 자제해주시길 부탁드립니다.


C++ 클래스 : 생성자와 소멸자(Constructor & Destructor)


지난 포스팅에서 클래스에 대해서 아주 간략하게 배워봤습니다. 별도의 포스팅으로 다루겠다고 넘어간 생성자와 소멸자를 오늘 다루어 보도록 하겠습니다.

C++ 클래스의 개념 : http://andrew0409.tistory.com/151


모든 클래스는 생성자와 소멸자를 가지고 있습니다. 구조체와는 차별화 되는 점이죠. 물론 구조체도 생성,소멸자를 만들 수 있기는 하나, 구조체에 만들바에 클래스를 만드는게 훨씬 편합니다. 이러한 생성자와 소멸자는 무엇이며 어떻게 쓰이는지 이론과 코드리딩을 통하여 살펴보도록 하겠습니다.


생성자(Constructor)

생성자는 객체(클래스)를 생성할때 자동으로 호출되는 함수로, 클래스와 같은 이름을 사용하며 리턴타입이 없으며 따라서 제어만 넘어갈뿐 값을 리턴하지 않습니다. 보통은 생성자 내부에서 객체의 초기화가 이루어 집니다.


1. 디폴트 생성자


1
2
3
4
List::List()
{
    this->m_head = 0;
}
cs


링크드리스트라는 자료구조 클래스의 생성자 부분입니다. 첫번째 라인과 같이 리턴타입을 표기하지 않으며 중괄호 안에서는 변수에 대한 초기화를 진행합니다. 콜론 초기화를 사용하여도 되나, 콜론초기화로 배열은 초기화 할 수 없음을 상기해야 합니다.


방금 보신 코드는 생성자 중에서도 가장 기본이 되는 디폴트 생성자 입니다. 생성자 내부에서 아무것도 하지 않더라도 디폴트 생성자가 없는 클래스는 없습니다. 실례로 비쥬얼 스튜디오에서 클래스를 추가하면 디폴트 생성자와 소멸자는 자동으로 헤더파일에 양식이 주어집니다.


2. 인자가 있는 생성자


1
2
3
4
5
6
Person::Person(char* name, int age, bool gender)
{
    this->m_name = name;
    this->age = age;
    this->gender = gender;
}
cs

지난 포스팅에서 배웠던 Person 클래스를 조금 응용했습니다. 전달인자를 받고, 이를 활용하여 초기화를 하는 생성자 코드입니다.

1
2
3
4
5
6
7
int main()
{
    Person p("홍길동"20true);
    p.showPerson();
 
    return 0;
}
cs


사용법은 위와 같습니다. p를 생성함과 동시에 괄호에 인자를 전달해서 해당 값으로 초기화를 할 수 있는 모습입니다.


3. 복사 생성자

복사 생성자는 다른 객체로부터 값을 복사해서 초기화를 하는데 이용하며, 자신과 동일한 타입의 객체를 레퍼런스로 전달받습니다.


1
2
3
4
5
6
Person::Person(const Person& p)
{
    this->m_name = p.name;
    this->m_age = p.age;
    this->m_gender = p.gender;
}
cs


복사생성자는 따로 선언, 정의해주지 않더라도 위와 같은 알고리즘으로 수행됩니다. 이렇게 대입연산자를 통해서 값을 복사하는 방식을 얕은방식이라고 하는데, 예를들어 배열을 복사하거나 조금더 복잡한 연산을 하려면 따로 정의를 해주는 것이 좋습니다. 얕은복사와 깊은복사에 대해서는 다음에 다시 다루도록 하겠습니다.


4. 소멸자

소멸자는 생성자에 객체명에 ~가 붙은 이름으로 선언, 정의된다 ~Person() 과 같은 식이다.

소멸자는 함수가 끝나거나, 프로그램이 종료되면서 자동으로 호출되는 함수이다. 생성자는 객체가 생성되는 시첨에서 호출되기 때문에 초기화 작업을 하지만 소멸자는 반대로 객체가 소멸하는 시점에 호출되기 때문에 메모리를 반환하는 역할을 많이 한다.


1
2
3
4
DynamicArray:~DynamicArray()
{
    delete[] m_array;
}
cs


이전에 포스팅했던 가변배열의 소멸자 입니다. 생성자에서 m_array에 메모리를 동적할당 했기 때문에, 메모리를 반환하는 코드를 볼 수 있습니다.


이상으로 생성자와 소멸자에 대해서 간략하게 알아봤습니다. 이해가 안되는 부분이나 질문이 있으면 남겨주세요.

더불어 도움이 되었다면 위, 아래에 붙어있는 광고를 눌러주시면 작성자에게 큰 도움이 됩니다!!

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/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
글 보관함