달력

05

« 2018/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
  •  
  •  

'상속'에 해당되는 글 4

  1. 2010.03.29 객체 포인터 (2)
  2. 2010.03.26 상속의 객체 생성, 소멸 과정
  3. 2010.03.24 상속의 개념
  4. 2010.03.24 public: private: 그리고 protected:
2010.03.29 16:53

객체 포인터 프로그래밍/C++2010.03.29 16:53







객체 포인터,

간단하게 보면 class를 가르키는 포인터로 볼 수 있겠지만,

이거, 생각보다 재밋으면서도 어렵다.

일단 따로 보자.

int n을 만들고, 포인터 pn이 가르킨다.
(n의 값이 쓰레기인건 신경쓰지 말자)
그렇다면 여기서, 의문을 가져 보자.

어떻게 될까?
컴파일에서 문제도 일어 나지 않고, 실행도 된다.
여기서 파악해야 할 것은, 메모리의 크기이다.
char* c 은 1바이트
int* n은 4바이트를 가르키게 되는데,
저런식으로 하게 되면 c는 new int의 1바이트 부분만 가르키게 되고,
n은 새로 생성된 1바이트를 넘쳐서 가르키게 된다.

어려운가, 어쩔 수 없다.
객체 포인트를 살펴 보자.



객체 포인트라고 해도 사실 우리가 알고 있던 포인터와 크게 다르지 않다.
오히려 그냥 단순히 AAA클래스를 가르키는 Cp_a 정도로 이해해도 상관없다.
그렇다면 여기서 생각해 봐야할 소스 코드가 있다.

뭔가 이상하다고 느낄지도 모르겠다.
분명 객체 포인트는 AAA* 인데 어째서 new BBB가 들어 가는가(아무리 형변환을 했다고 하더라도.)
의문점을 해결하기 전에 한가지더 알아 보자.

결과값이 어떻게 나올것 같은가????
결과는 다음과 같다.

어째서 저렇게 나오는 것인가.
변수의 크기에 대해서 자세히 파악을 하고 있다면,
int 4바이트
char 4바이트
double 8바이트
인 것이다.
4, 8, 16, 이제 좀 이해가 가는가?
(왜 char가 1바이트가 아니라 4바이트 인지는 메모리 구조를 조금 자세히 파악하면 알 수 있다. 나도 확실히는 잘 모른다.)
즉, CCC클래스는 AAA 클래스 + BBB 클래스인 것이다.
자 그렇다면 원래 처음문제 점 이였던,
AAA* = (AAA*) new CCC;
의 경우에 대해서 다시 한번 파악해 보자.
소스를 보자.

결과는 다음과 같다.

여기서 한번 의문을 가져 볼 수 있다.
AAA* 라고는 하지만 생성된 객체는 BBB, CCC 일텐데,
어째서 AAA의 Test함수만 호출 하는가.
이것은 좀전에 설명했던, char* c = (char*)new int;에서 했던 말과 동일하다.
AAA의 객체 포인터가 가질 수 있는 메모리의 크기는 딱 AAA 클래스의 크기 만큼이다.
비록 BBB,CCC가 생성되서 힙메모리 어딘가에서 생성이 되었다고 하더라도,
AAA 객체 포인터가 가르 킬수 있는 크기는 딱 AAA 클래스 크기 만큼인 것이다.
음, 이해가 가는가.
내가 설명했지만 도저희 이해가 아니될것 같다.
하지만 더이상의 설명을 뭐라고 해야 할지를 모르겠다.

여기서 가질 수 있는 의문이 바로 이것이다.
"그렇다면 왜 저렇게 해주어야 하는가."
"그냥 CCC* = new CCC; 로 하면 안되는 것인가.?"
실제로 그렇게 해도 되지만
그것에 대한 예제를 살펴 보자.

결과는 다음과 같다.
이제 감이 오는가.
비록 사용할 수 없을 지언정,
DDD라는 클래스에서 AAA, BBB, CCC(물론 다 상속 관계)
모두 다 받을 수 있다는 것이다.
즉 정리하면,
최상위 클래스의 객체 포인터는,
하위 클래스들의 포인터를 받을 수 있다는 것이다.

다른건 다 기억 하지 못하여도 좋다.
단지 AAA, BBB, CCC 클래스의 주소를,
모두 AAA의 객체 포인트에서 받을 수 있다는 것만 인식 하자.
여기서 주의할 점은,
그 반대는 절.대. 해서는 안된다는 것과.
(그 이유는 char, int를 생각해라 int*가 가르키는 4바이트 중 char의 1바이트를 빼면 과연 나머지 3바이트는 어디를 가르킬것인지는 아무도 모른다.)
그렇다면 AAA의 객체 포인터에 넣은 것은 좋은데, BBB, CCC의 Test() 함수를 실행 할려면 어떻게 해야 하겠는가에 대해서는.
추후에 다시 포스팅을 하도록 하겠다.

ps : 세상에 쉬운건 하나도 없구나 -_ -;

'프로그래밍 > C++' 카테고리의 다른 글

함수 오버라이딩(overriding)  (0) 2010.04.03
객체 레퍼런스  (0) 2010.04.03
객체 포인터  (2) 2010.03.29
IS-A, HAS-A 관계  (1) 2010.03.27
상속의 형태  (0) 2010.03.26
상속의 객체 생성, 소멸 과정  (0) 2010.03.26
Posted by 안식의후크






상속의 객체 생성과 소멸 과정에 대해서 알아보자.

가장 중요한 것은
Inher_A 클래스를 상속 받은,
Inher_B 클래스를 생성할때,
A클래스의 생성자를 먼저 들린 후,
B클래스의 생성자를 수행한다는 것이다.
일단 소스를 보자.


소스에서도 알 수 있듯이 가장 중요한 것은
생성 순서는 최상위 클래스에서 단계별 하위 클래스로 이루어 지고.
소멸 순서는 취하위 클래스에서 단계별 상위 클래스로 이루어 진다는 것을 알 수 있다.
또한 기본적으로 상위 클래스의 생성자 선택은 멤버 이니셜라이저를 사용,
원하는 생성자로 이동이 가능하다.(아무것도 존재 하지 않는다면, 인자를 받지 않는 생성자를 수행.

'프로그래밍 > C++' 카테고리의 다른 글

IS-A, HAS-A 관계  (1) 2010.03.27
상속의 형태  (0) 2010.03.26
상속의 객체 생성, 소멸 과정  (0) 2010.03.26
상속의 개념  (0) 2010.03.24
public: private: 그리고 protected:  (0) 2010.03.24
explicit, mutable  (0) 2010.03.24
Posted by 안식의후크
2010.03.24 17:19

상속의 개념 프로그래밍/C++2010.03.24 17:19






앞에서 protected설명을 하면서 상속을 다루었기 때문에

순서가 바뀐거 같긴 하지만,

상속에 대해서 살펴 보자.

상속은 이전 클래스가 가지고 있던, 멤버 변수, 멤버 함수를

다른 클래스에서 그대로 쓰거나, 수정, 추가 하기 위해서 사용한다.

일단 상속의 깊은 개념은 천천히 살펴 보고,

어떤 식으로 선언하고 사용하는지만 확인.

'프로그래밍 > C++' 카테고리의 다른 글

상속의 형태  (0) 2010.03.26
상속의 객체 생성, 소멸 과정  (0) 2010.03.26
상속의 개념  (0) 2010.03.24
public: private: 그리고 protected:  (0) 2010.03.24
explicit, mutable  (0) 2010.03.24
static  (0) 2010.03.24
TAG C, C++, C언어, 상속
Posted by 안식의후크





public: 클래스 내부, 외부에서 모두 사용가능.(다른 클래스가 접근 가능)
private: 클래스 내부 에서만 사용가능, 외부에서는 불가능.(다른 클래스가 접근 불가능)
protected: 클래스 내부에서 사용가능, 외부에서 사용 불가능.(상속을 받은 다른 클래스가 접근 가능)

쉽게 표현하면 이와 같고.

public:
private:에 대해서는 이미 앞에서도 많이 다루었으니

protected:에 대해서만 한번 훑어 보자.



'프로그래밍 > C++' 카테고리의 다른 글

상속의 객체 생성, 소멸 과정  (0) 2010.03.26
상속의 개념  (0) 2010.03.24
public: private: 그리고 protected:  (0) 2010.03.24
explicit, mutable  (0) 2010.03.24
static  (0) 2010.03.24
멤버 이니셜 라이저(member initializer)  (0) 2010.03.23
Posted by 안식의후크