fullstack

[C++] 생성자(Constructor)와 소멸자(Destructor)

Language/C++

- 생성자 (Constructor)


생성자는 객체를 생성과 동시에 초기화 할 수 있는 메커니즘이다.

모든 객체는 생성이 되면 메모리를 할당받고 생성자를 호출하게 된다.

생성자는 함수이고 ,클래스의 이름과 같은 이름을 지니며, 리턴이 없다.



1
2
3
4
5
6
class AAA
{
    int num;
public:
    AAA()    { num = 10; }
};



위와 같이 생성자를 이용하여 객체의 멤버변수를 초기화 할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
class AAA
{
    int num;
public:
    AAA(int n) { num = n; }
};
 
int main()
{
    AAA a(10);
 
    return 0;
}



또한 위와 같이 매개변수를 이용하여 초기화 할 수 있으며 오버로딩도 가능하다.




- 소멸자 (Destructor)


경우에 따라 객체가 소멸되기 전에 처리해야 할 작업이 있을 수 있다. (예를 들어 객체안에서 동적할당을 사용한 경우 메모리 해제)

소멸자는 그러한 일들을 처리하기 위한 메커니즘이다.

모든 객체는 소멸자를 호출하고 메모리 반환후 소멸하게 된다.

소멸자는 함수이고, 클래스의 이름 앞에 ~가 붙은 형태의 이름을 가지며, 리턴이 없다. 또한 생성자와 다르게 매개변수를 받을 수 없다.


1
2
3
4
5
6
7
class AAA
{
    int *arr;
public:
    AAA(int size) { arr = new int[size]; }
    ~AAA() { delete []arr; }
};



위와 같이 소멸자를 이용하여 동적할당받은 메모리를 해제해 줄 수 있다.




- 디폴트 생성자 , 디폴트 소멸자


생성자와 소멸자는 따로 정의하지 않으면 디폴트 생성자와 디폴트 소멸자가 자동으로 삽입되며, 둘은 아무런 일도 하지 않는다.

자동으로 삽입된 디폴트 생성자와 디폴트 소멸자는 아래와 같다.


1
2
3
4
5
6
7
class AAA
{
    int num;
public:
    AAA() {}
    ~AAA() {}
};



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

[C++] friend 선언  (0) 2015.12.02
[C++] this 포인터  (0) 2015.12.02
[C++] 캡슐화 (EnCapsulation)  (0) 2015.11.30
[C++] 정보은닉 (Information Hiding)  (0) 2015.11.30
[C++] 동적할당. new와 delete  (0) 2015.11.30

[C++] 캡슐화 (EnCapsulation)

Language/C++

C++ 객체지향에서 클래스는 캡슐화 하여야 한다.

캡슐화는 관련 있는 데이터와 함수를 하나의 단위로 묶는 것을 말한다.


다음은 캡슐화가 되어 있지 않은 경우이다.


1
2
3
4
5
6
7
8
9
10
11
12
class Point
{
public:
    int x;
    int y;
};
 
class DrawPoint
{
public:
    void draw(Point p) { cout << "draw " << p.x << ", " << p.y << endl; }
};



위 예제는 Point에 대한 데이터와 함수가 두 개의 클래스로 나뉘어져 있다. 

다음과 같이 관련있는 데이터와 함수를 묶어 캡슐화 해야 한다.


1
2
3
4
5
6
7
8
class Point
{
public:
    int x;
    int y;
 
    void draw() { cout << "draw " << x << ", " << y << endl; }
};



캡슐화에 대한 기본 개념은 어렵지 않다. 예제 또한 간단하여 쉽다고 생각할 수 있으나 실무에서는 어디까지를 관련있는 데이터나 함수로 볼 것인지에 대한 결정을 하기 매우 어렵기 때문에 많은 경험과 노하우를 필요로 한다.


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

[C++] this 포인터  (0) 2015.12.02
[C++] 생성자(Constructor)와 소멸자(Destructor)  (0) 2015.11.30
[C++] 정보은닉 (Information Hiding)  (0) 2015.11.30
[C++] 동적할당. new와 delete  (0) 2015.11.30
[C++] Reference  (0) 2015.11.29

[C++] 정보은닉 (Information Hiding)

Language/C++

C++ 객체지향에서 클래스는 정보은닉이라는 특성을 가져야 한다.

우선 정보은닉이 되지 않은 클래스를 보겠다.


1
2
3
4
5
class AAA
{
public:
    int num; // 0~100
};



위 클래스는 num 이라는 멤버변수를 가지고 있다. 하지만 외부에서 객체를 만들어 이 멤버변수에 값을 넣을 때 직접 접근 하므로 원치 않는 값이 들어올 수 있고 에러도 나지 않는다. 실제로 이런 경우가 발생하면 오류를 찾는데에 매우 많은 시간을 소요하게 된다.


다음은 정보은닉이 적용된 클래스이다.


1
2
3
4
5
6
7
class AAA
{
    int num; // 0~100
public:
    void setNum(int n) { num = n; }
    int getNum() { return num; }
};



멤버변수에 직접 접근하는 것을 막고 setNum과 getNum 함수를 통해서 멤버변수를 조작하도록 하였다.

여전히 원치않는 값이 들어갈 수 있고 별로 달라진게 없다고 생각할 수 있지만 다음과 같이 오류검출을 추가할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class AAA
{
    int num; // 0~100
public:
    void setNum(int n);
    int getNum() { return num; }
}
void AAA::setNum(int n)
{
    if(n<|| n>100)
    {
        cout << "error" << endl;
        return;
    }
    num = n;
};



위와같이 작성하면 멤버변수에 영향을 주지 않고 사전에 오류검출을 할 수 있는 것을 볼 수 있다.


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

[C++] 생성자(Constructor)와 소멸자(Destructor)  (0) 2015.11.30
[C++] 캡슐화 (EnCapsulation)  (0) 2015.11.30
[C++] 동적할당. new와 delete  (0) 2015.11.30
[C++] Reference  (0) 2015.11.29
[C++] namespace  (0) 2015.11.28