일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 하이퍼바이저
- 파이썬
- 나르왈프레오
- NarwalFreo
- 패턴 인식
- 구글 앱 엔진
- 물걸레로봇청소기추천
- 갤럭시탭S8울트라
- 삼성전자 소프트웨어멤버십 SSM
- 신경망
- 신경회로망
- 동아리
- 삼성
- 고려대학교
- BAM
- 삼성소프트웨어멤버십
- 빅데이터
- 인공지능
- Friendship
- Neural Network
- 멤버십
- Python
- 가상화
- SSM
- hopfield network
- Google App Engine
- 증강현실
- 물걸레자동세척로봇청소기
- 패턴인식
- Bidirectional Associative Memory
- Today
- Total
정보공간_1
[2기 대구 최진원] Constructor & Destructor 본문
안녕하세요. 대구 멤버십 21-1기 최진원입니다.
이번 포스팅에서도 마찬가지로 아주 기본적이지만 중요한 생성자, 소멸자에 대해서 알아보겠습니다. 이전 포스팅에서 Classes와 Encapsulation에 대해 배웠었는데, 이것 또한 아주 중요한 내용이니 차근차근 따라와 보시길 바랍니다. :D 그럼 먼저 생성자에 대해서 말씀 드리겠습니다.
1) Constructor
Constructor(생성자)란.. ? 간단한 특징으로 살펴보죠.
1) 객체를 생성과 동시에 초기화 하기 위해서 사용
2) 객체 생성 시 반드시 한번 호출되는 함수
3) 클래스와 같은 이름의 함수 (컴파일러에 의해 호출되므로 이름이 고정적)
4) 리턴형이 없다
어떻게 보면 위의 네가지만 알아도 생성자에 대해 많이 안다고 할 수 있겠죠. 그럼 하나씩 살펴보도록 할게요.
객체를 생성과 동시에 초기화 하기 위해서 사용
객체 초기화가 Constuctor의 목적 중에 하나죠. 초기화가 필요한 이유는 이렇습니다. 클래스의 객체를 선언하면 메모리에 객체가 생성되지만 초기화는 되지 않으므로 객체 내의 멤버 변수들은 모두 쓰레기 값을 가지고 있게 됩니다. 그래서 다음과 같이 직접 대입하는 것이 원론적인 방법이지만 아주 비효율 적입니다.
원하는 방법은 값을 한번에 초기화 하고 싶은데 Position here = 30, 10, 'A'; 와 같은 문법은 제공하지 않습니다. 그래서 초기화를 전담하는 별도의 함수가 필요하게 되고, 그러한 기능을 하는 것이 Constructor입니다.
위의 Position(int _x, int _y, int _ch); 함수가 바로 생성자입니다. main 부분에 Here이라는 객체를 생성할 때 객체를 위한 메모리를 할당하고 호출하여 할당된 메모리를 초기화 하게 됩니다. 이와 같은 방법을 암시적인 방법이라고 하죠. 아시는 분은 아시겠지만, 많이들 알고 계신 암시적 방법 이외에 명시적인 방법도 있습니다.
Position Here = Position(30, 10, 'A');
보통 암시적 방법과 같은 식으로 초기화하는 컴파일러가 있고, 이름 없는 임시 객체를 먼저 생성한 후 대입하는 컴파일러도 있습니다. 보통은 암시적인 방법을 더 많이 사용하지만 이곳에 오신 분들은 한번 쯤 봐놓는 것도 좋겠죠?!
생성자에서 객체의 값을 초기화 하기 위해서는 초기값을 인수로 받아야만 합니다. 하지만 대입하는 값을 지역 변수만을 참조해버리면 의미 없는 코드가 되어버리기 때문에 이 점을 주의해야 합니다. 실제로 코드를 작성하다 보면 변수 이름을 비슷하게 하다가 지역 변수를 그대로 사용하는 경우가 종종 발생하기 때문이죠. 이와 같은 오류를 범하지 않기 위해서 몇가지 방법이 있는 데, 첫 번째 보통 일정한 접두를 붙여 멤버 이름과 구분 되도록 하면 좀더 쉽게 구분이 가능 합니다. 위의 경우에는 '_' 가 되겠죠. 두 번째로는 반대로 멤버의 이름을 작성할 때 특정한 규칙을 정하는 것입니다. 이 또한 많이들 사용하기 때문에 알아두면 좋겠죠. 그리고 마지막으로 멤버 변수 참조 시 범위 연산자를 사용할 수 있습니다.
표현한다면 위와 같이 나타낼 수 있겠죠.
생성자 오버로딩
생성자도 따지고 보면 함수의 일종이므로 오버로딩이 가능합니다. (디폴트 인수, 인라인 선언도 가능) 그리하여 객체를 선언할 때 초기화 방법을 선택할 수가 있게 됩니다. 당연히 오버로딩의 규칙에 따라 인수의 개수나 타입이 달라야 하겠죠?!
위의 예제가 생성자 오버로딩의 예입니다. 컴파일러는 객체 선언문의 인수 목록을 보고 호출할 생성자를 결정하기 때문에 위와 같은 문법이 성립하게 되는 것이죠. 만약 해당되는 생성자가 없을 경우는 에러가 발생하게 되고, 만약 Position A; 로 선언할 경우 인수를 취하지 않는 Position()을 호출 하는데 해당 생성자가 정의 되어 있지 않으므로 마찬가지로 에러 처리를 하게 됩니다. 함수 오버로딩의 성질을 생각해보면 이해하는데 어렵지 않을 것 같습니다.
2) Destructor
Destructor(파괴자) 입니다. 생성자가 있으면 당연히 파괴자, 소멸자도 있기 마련이겠죠. 객체가 사라질 때 생성자와 반대의 역할을 하는 멤버 함수를 Destructor이라고 합니다. 객체가 생성될 때 자동으로 호출되기 때문에 종료될때 할당한 메모리를 해제할때 많이 사용이 됩니다. 특징으로는 클래스 이름 앞에 ~(tilde)를 붙이면서 인수와 리턴 값은 가지지 않습니다.
위의 예제는 앞에서 말씀 드린 것과 같이 메모리를 해제할 때 사용을 한 예입니다.
생성자와 파괴자의 특징을 살펴보면 다음과 같습니다.
- 이름이 정해져 있음 (객체가 생성, 파괴될 떄 컴파일러가 호출)
- 리턴 값이 없음 (초기화와 정리만 수행)
- 반드시 public 액세스 속성을 가져야 함 (생성자, 파괴자가 숨겨져 있는 클래스는 특수한 목적에만 사용)
- friend나 static이 될 수 없음
- 파괴자는 가상 함수로 지정될 수 있지만 생성자는 그럴 수 없음
- 둘 다 디폴트가 있음 (아무런 동작도 하지 않음)
3) Default Constructor
Default Constructor는 클래스 내에 생성자가 없을 때 컴파일러가 기본적으로 정의하는 생성자이다. 즉 아무것도 하지 않는 빈 함수입니다. 그리고 Dafault Constructor를 사용한 객체의 초기화 방식은 일반 변수와 같은 규칙을 적용하고 전역이나 정적 객체라면 모든 멤버가 0으로 초기화, 지역 객체라면 초기화되지 않는 다는 것을 알아두면 좋겠습니다.
4) Copy Constructor
클래스가 int 등과 동일한 자격을 가지는 타입이 되기 위해서는 이미 생성된 같은 타입의 객체로부터 초기화가 가능해야 한합니다. 예를 들어 ( int a = 3 ; int b = a ) 이와 같이 값이 복사가 되게 되는데, 개발자가 생성한 class를 자유롭게 copy하기 위한 것이 Copy Constructor 이다.
위의 예제와 같이 Copy Constructor를 정의하고, 객체를 다음과 같이 Copy할 수 있습니다.
Person Young = Boy; 와 같이 표현하고 싶을 때 Copy Constructor를 이용하여
Person Young = Person(Boy); 로 구현할 수 있습니다.
만약 객체가 인수로 전달 될 경우에 몇가지 특징이 있는데, 함수의 인수로 객체로 넘기는 경우에도 Copy Constructor이 호출되고, 호출과정에서 대입을 받게 됩니다. 또한 객체가 리턴값으로 돌려질 떄도 Copy Constructor가 호출 되며, 인수로 사용되거나 리턴값으로 사용되는 객체는 반드시 Copy Construcor 정의를 해야 합니다.
5) Reference
- Kang, Byung-Wook, Introduction to C++, YeungNam Univ. SE Lab, 2005
저는 항상 기본이 중요하다고 생각을 합니다. 항상 쉽게 생각을 하지만 다시 보면 어려운 것들, 가볍게 보고 다시 한번 깊게 생각해볼 수 있었으면 합니다.
'IT 놀이터 > Elite Member Tech & Talk' 카테고리의 다른 글
[2기 전주 심경원] Cortex - M3 동작 원리 및 개발 TIP (0) | 2012.10.18 |
---|---|
[2기 부산 노형식] DB설치 없이 Web 상에서 Web SQL 사용하기 (0) | 2012.10.17 |
[2기 부산 이환승]Django를 이용한 Google App Engine 개발. -2- (0) | 2012.10.16 |
[2기 대전 김호원] Concerto MCU 3.클럭 설정과 GPIO (1) | 2012.10.16 |
[2기 광주 박정태]Arduino 의 모든것#2 (0) | 2012.10.15 |