c++
+생성자와 소멸자
생성자(Constructor)
- 클래스가 메모리에 할당 될 때(객체가 생성될 때) 자동으로 호출된다.
- 사용자가 정의하지 않으면, 컴파일 시 자동으로 내용 없는 빈 생성자를 제공하는데, 이것을 디폴트 생성자라 한다.
- 클래스의 이름과 함수의 이름이 동일하다.
- 반환형이 선언되어 있지 않으며, 실제로 반환하지 않는다.
- 객체 생성시 딱 한번 호출된다.
- 외부에서 참조해야 하기 때문에 접근 제어 지정자를 public에 두어야 한다.(예외적으로 내부에서 생성되고 소멸되는 경우에는 protected, private에 두어도 상관 없다.)
└private 생성자 : 클래스 내부에서 객체를 생성한다면 생성자가 private로 선언되어야 한다. 객체의 생성방법을 제한하고자 하는 경우에 유용하게 사용된다.
- 생성자도 함수의 일종이니 오버로딩이 가능하다. 또한 매개변수에 '디폴드 값'을 설정할 수 있다.
ex)
ㄱ. 매개변수로 int형 인자를 하나 받을때
sample sp(100); // 전역 및 지역변수의 형태
sample * ptrSp = new sample(100); // 동적 할당의 형태
ㄴ. 매개변수가 없는 생성자를 호출할 때
sample sp;
sample * ptrSp = new sample;
sample * ptrSp = new sample(); // 옳은 표현
sample sp(); // error!
└why? 보통 함수의 원형은 전역적으로(함수 밖에) 선언하지만 함수내에 지역적으로도 선언 가능하다.
소멸자
ex) ~클래스명() { //... }
- 생성자와 객체가 소멸될 때 자동적으로 호출된다.
- 클래스와 같은 이름을 가지지만 이름 앞에 '~'를 붙인다.
- 소멸 시에 실행되기 때문에 반환값이 없고, 소멸시에 인자를 전달할 수 없기 때문에 매개변수를 사용할 수 없고, 오버로딩 또한 하지 못한다.
- 사용자가 정의하지 않으면 컴파일 시 자동으로 내용 없는 빈 소멸자를 제공하는데, 이것을 디폴트 소멸자라 한다.
- 보통 클래스 내에서 사용한 동적 할당 해제 등, 소멸 시 필요한 행동을 한다.
+멤버 이니셜라이저(Member Initializer)
- 멤버변수로 선언된 객체의 생성자 호출에 활용된다.
- 생성자와 { 사이에서 사용한다
ex) public:
test()
:멤버변수이름(값)
{
//
}
};
- 멤버변수도 이니셜라이저를 통해서 초기화가 가능하다.
ex) class test{
private:
int num1, num2;
public:
test(int n1, int n2) : num(n1){
num2 = n2;
}
};
- 생성자의 몸체에서 초기화하는 방법과 이니셜라이져를 이용하는 초기화 방법 중에서 선택이 가능하다. 일반적으로는 멤버변수의 초기화에 있어서는 이니셜라이저를 선호하는 편이다.
└why? 초기화의 대상을 명확히 인식할 있고, 성능에 약간의 이점이 있다.(이니셜라이저를 이용하면 선언과 동시에 초기화가 이뤄지는 형태로 바이너리 코드가 생성된다. 반면, 생성자의 몸체부분에서 대입연산을 통한 초기화를 진행하면, 선언과 초기화가 각각 별도의 문장에서 진행하는 형태로 바이너리 코드가 생성된다.)
ex)위에 예제 참고
num(n); == int num = n;
num2 = n2; == int num2; num2 = n2;
- const 멤버변수도 이니셜라이저를 이용하면 초기화가 가능하다.
- '참조자'도 선언과 동시에 초기화가 이뤄져야 한다. 따라서 이니셜라이저를 이용해 참조자도 멤버변수로 선언될 수 있다.
*디폴트 생성자(Default Constructor)
- 객체가 되기 위해서는 반드시 하나의 생성자가 호출되어야 한다. 생성자를 정의하지 않는 클래스에는 C++ 컴파일러에 의해서 디폴트 생성자를 자동으로 삽입한다.
- 디폴트 생성자는 인자를 받지 않으며, 내부적으로 아무런 일도 하지 않는 생성자이다.
- new 연산자를 이용한 객체의 생성에도 해당한다. ex) test * t = new test;
└단, new연산자가 아닌, C언어의 malloc함수를 대신 이용하면 생성자는 호출되지 않는다. malloc 함수호출 시, 실제로는 test 클래스의 크기정보만 바이트 단위로 전달되기 때문에 생성자가 호출될 리 없다.
*객체의 생성과정 정리
1. 메모리 공간의 할당
2. 이니셜라이저를 이용한 멤버변수(객체)의 초기화
3. 생성자의 몸체부분 실행
- 이니셜 라이저가 선언되지 않았다면, 메모리 공간의 할당과 생성자의 몸체 부분의 실행으로 객체생성은 완성된다.
'예전 포스팅 모음' 카테고리의 다른 글
[java] 상속 & 오버라이딩 (0) | 2014.08.11 |
---|---|
[java] 자바의 정석 연습문제 ch06 (0) | 2014.08.08 |
[java] 객체지향 프로그래밍I 정리(클래스~초기화) (0) | 2014.08.01 |
[java] 단순 계산식 계산하기(Scanner, nextInt(), next().charAt()) (0) | 2014.08.01 |
[C++] 클래스 (0) | 2014.07.31 |