달력

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
  •  
  •  



디자인 패턴에 들어 가기에 앞서 UML을 알아둬야 할 필요성이 있습니다.


Unified Modeling Language의 약자로 설계문서를 시각화 한다고 정의 되어 있습니다.

지금 설명하는 것들은 모두 클래스 다이어그램입니다.


가장 기본적인 상속 구조를 알아 보도록 하겠습니다.



해당 그림은 다음과 같습니다.

- 부모 클래스가 가상 클래스(이탤릭)로써, 자식 클래스가 상속을 받은 형태

- 부모클래스에는 변수, 스태틱 변수( 밑줄 )가 존재

- 부모 클래스는 가상함수(이텔릭)와 함수가 존재

- 자식 클래스는 변수X, 부모로써 상속받은 가상함수와 스태틱함수(밑줄) 존재

- 각 변수나 함수 앞에 기호는 public은 +, protected는 #, private는 -로 표기



다음은 인터페이스 설명입니다.


- 가상 클래스와 비슷하지만 직선 대신 점선 사용.

- 변수, 함수 그대로 사용.

- << interface >> 와 같이 인터페이스 표기


집약(포함) 표기



- 인스턴스의 갯수와 상관없이 표기

- 0..*은 최소 0개부터 무제한

- 바구니에는 x개의 과일이 존재하고 과일은 모두 색상을 가지고 있다.

- 집약 관계에는 깊은, 얕은 관계가 존재 깊은 관계에는 마름모안에 공간을 채운다.

- 집약의 대상이 사라졌을( 삭제 되었을 때 ) 남아 있을 수 있다면, 얕은 집약관계, 함께 사라진다면( 삭제 된다면 ) 깊은 집약 관계라고 볼 수 있다.


클래스의 관계 표기



책에서 보는것과, StarUML을 사용해서 표기 하는것과는 조금 다른 부분이 존재 하는데 일단 중요한거 같지 않으니 무시하고 넘어 가겠습니다.


다음 장에서는, 시퀀스 다이어그램을 간단하게 살펴보도록 하겠습니다.

Posted by 안식의후크




제목이 뭐랄까 복잡하지만, 내용을 보니 그정도 까진 아닌거 같다.

다형성이라는 정의를 좀 쉽게 설명하면,

"AAA 클래스를 상속받은 BBB 클래스가 있다.
그리고 AAA 클래스의 객체가 BBB 클래스를 접근하는 것이 가능하다. "

라고 표현 할 수 있겠는데...

아.. 써놓고 보니 쉽지 않은거 같기도 하고--;;

자세한 내용은 다형성에 대해서 "객체 포인터"라는 부분에서 정리를 예전에 해 두었으니 해깔리면

그걸 먼저 보는것이 나을 것 같다.

예제는 2가지정도 존재 하지만,
첫번째 예제만 봐도.
"아!... 위험하네." 싶다.


이런 상황이라고 하였을 때,
쉽게 프로그래머의 의도는, AAA arr[10]; 를 만든 이후,
그 값을 출력하기 위해 printAAA 를 만들었다고 보면 되겠다.
하지만,

다음과 같은 상황이 생겼을 때 문제가 발생하는 것이다.
물론 운이 좋게 컴파일러에서 미리 캐치를 해서, 값이 잘 보일 수도 있겠지만.
(실제로 내 컴파일러에서 출력에는 이상이 없긴 했다.)
문제는 delete 라던가, 다른 os나 pc 상황에서 분명 의도하지 않은 결과가 나올 수 있다는 것이다.
AAA의 메모리 크기는 8byte(예상) 라고 했을 때,
BBB의 메모리 크기는 8byte(AAA 클래스의 크기) + 8byte(BBB 클래스의 크기) 라는 것이다.
배열을 +1씩 증가 한다고 했을 때,
8byte씩 삭제 하다 보면,, 나머지 8byte는.. 과연 어디로 증발할지 아무도 모르는 것이다.
물론 BBB라는 클래스가 AAA를 상속받지 않거나, 존재하지 않는다면,
큰 문제가 없을 지도 모른다. 이와 관련되서 추후 항목에 다룬다고 하니, 그 때 다시 한번 확인하여 보자.
Posted by 안식의후크





MFC에 대해서 뭐랄까 심도 있게 설명해 놓고 싶지만,

아무래도 그 내용이 방대하고, API에 대한 윈도우 구조를 다 파악 했다면 구지 다시 그 부분을 집고 넘어갈 필요는 없을것 같다. MFC에 대한 내용은, 가능한 나 스스로가 복습하면서 다시 한번 되돌아 본다는 식으로 포스팅을 하기로 하겠다.

프로젝트 생성은 살펴 보았고,

이제 기본적인 창에 무언가를 추가해 보자.

View.cpp 부분에 존재하는 CView를 상속받은 클래스가 존재할 것이다.


다음 처럼 멤버 변수를 CWnd로 추가하고,

[클래스뷰]-[속성]-[메시지탭]-[WM_CREATE]-[OnCreate 생성]



아마 다음과 같은 소스가 "자동"으로 만들어 졌을 것이다. 그 안에
조금전에 만들었던 멤버변수 m_wndChild 를 사용해 새로 자식 윈도우를 생성하자.


코드를 실행해 보면,
하나의 STATIC이 생성된 것을 알 수 있다.
참 쉽다... 고작 한줄 추가 했을 뿐인데, 이미 하나의 응용프로그램처럼 보이기 시작한다.
이것이 MFC의 장점인건가.
Create 메소드의 매개변수는 각각 인자, 내용, 스타일(속성), 크기(좌표), 부모 클래스의 주소, 자신의 ID 순으로 매개변수를 입력해 주면 된다.
예제는 STATIC 이지만, EDIT나, BUTTON등으로 설정하여도 우리가 원하는 대로 나오게 된다.

마찬 가지로 2개의 자식 윈도우를 생성한다고 하였을 때, 이전처럼 View에 새로운 CWnd 클래스 추가,
OnCreate 함수에 그 멤버 변수를 가지고 생성. 만 하면 된다.

API에서 WM_CREATE에서 해주었던 일들을, MFC로 넘어 오면서 OnCreate라는 함수가 대신 해준다고 보면된다.

// 실행 화면

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

MFC-마우스 입력  (0) 2010.05.16
MFC-GetKeyState()  (0) 2010.05.12
MFC-GetWindowRect(), ScreenToClient(), SetWindowPos()  (0) 2010.05.12
MFC-키보드 입력  (0) 2010.05.12
MFC-새로운 자식 클래스 생성하기  (0) 2010.05.12
MFC-기본적인 생성 방법  (0) 2010.05.12
Posted by 안식의후크
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 안식의후크
2010.03.21 19:18

friend 프로그래밍/C++2010.03.21 19:18







private로 선언된 class 변수를 외부에서 조작 하기 위해 사용.






friend 선언에 대해선 몇가지 더 존재 한다.
전역 함수에 대해 선언도 가능하지
만 클래스 or 클래스 안에 특정 맴버 함수에 대해서도 허용이 가능하다.



클래스에 friend 선언하기




그리고 마지막으로 friend선언을 맴버 함수만 해주는 것이 존재 하는데
이게 참 까다롭다.
전방 참조도 해줘야 하고,
일단 예제를 보자.
난 솔직히 잘 모르겠다.
friend 선언을 잘 안해서 그런것 일 수도 있지만
알것 같으면서도 애매하다



좀더 많이 배우고 느껴야 겠지만
friend라는건 참 모호하다
뭐든 잘쓰면 좋고 못쓰면 독이지만
이녀석은 그 영향을 더 잘 타는 것 같다.

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

멤버 이니셜 라이저(member initializer)  (0) 2010.03.23
복사 생성자, 디폴트 생성자 그리고 디폴트 복사 생성자.  (0) 2010.03.21
friend  (0) 2010.03.21
this 포인터  (0) 2010.03.21
객체 포인터 배열  (0) 2010.03.21
클래스의 활용  (0) 2010.03.20
Posted by 안식의후크
2010.03.20 16:59

클래스의 활용 프로그래밍/C++2010.03.20 16:59







누가 그랬던가, C++로 제작이 가능한 모든것은 C로도 제작이 가능하다고,

물론 맞는 말이지만,

추후 그 프로그램을 수정할때의 시간은 확실히 차이가 난다고 생각한다.

클래스의 활용법에 대해서 알아보자.

클래스를 선언할 때에

public:
private:
protected: 가 존재 하지만

일반 적으로 public:에는 함수 선언을 많이 하고
private:에는 변수 선언을 많이 하게 된다.

왜 그럴까?

소스 코드를 보자.



자 그럼 단순히 원치 않은 값의 예방을 위해서만 클래스를 쓰는가?

그건 아니다.




처음 말 했듯이 C로써 제작이 불가능 하기 때문에 C++로 제작 하는건 절대 아니라고 본다.
단지 프로그래머라면(특히 게임프로그래머, 거기다 온라인)이라면 제작 보다 중요한건 유지 보수 라고 본다.
개인적으로 필자는 오래 사는 게임이 성공한 게임이라고 말 하고 싶은데,
사소한 밸런스 조정때에도 야근을 할 것인가.
클래스만 변경해 주고 조기 퇴근을 할지는 뭐,
본인 마음이겠지만
아직 나도 부족한게 많고 알아야 할것 투성이지만
C++이라는 언어는
오래 씹을 수록 더 깊은 맛이 나는 그런 느낌이랄까 ㅋ?

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

this 포인터  (0) 2010.03.21
객체 포인터 배열  (0) 2010.03.21
클래스의 활용  (0) 2010.03.20
class(클래스) ~ C++의 꽃 ~  (0) 2010.03.19
레퍼런스(Reference)  (0) 2010.03.18
new & delete  (0) 2010.03.17
Posted by 안식의후크
2010.03.19 00:42

class(클래스) ~ C++의 꽃 ~ 프로그래밍/C++2010.03.19 00:42







간단하게 보면 구조체 + 함수
라고 볼 수 있지만,

알면 알수록 정신세계를 안드로매다로 보내버리는 "아~ 그대의 이름은 클래스".

뭐 특징으로는

데이터 추상화네
캡슐화네
정보은닉, 다형성, 상속, 높은 재활용 등..

참 많지만 저런 이야기는 좀더 완벽하게 구사 할 수 있을때나 가능한거 같고,

바로 실전 코드로 알아 보자.



딱 봐도 구조체와 비슷,

시작은 미비하나 그 끝은 위대할 터이니,

클래스 내부에 무언가 선언(정의)할 떄에는 public과 protected, private 타입이 존재한다.

public은 공개
private는 자신만 공개
protacted는 특정한 상대에게만 공개

어떻게 설명해야 쉽게 설명할 수 있는가에 대한 답은 없는거 같고,

각각 특징과 어떻게 사용해야 하는지에 대해선 빠른 시일내에 다시 자세히 포스팅 하겠음. 일단 오늘은 사용법에 대해서만 알아 보도록 하자.

클래스 외부의 함수도 정의와 선언을 따로 할 수 있는데

외부 정의는 이 처럼 하면된다.


그리고 클래스는 생성자와 소멸자가 존재 하는데, 간략하게 한번 살펴 보자.


생성자의 가장 큰 능력은 클래스를 main에서 객체화 함과 동시에 초기화가 된다는 것이 가장 큰 능력이라고 볼 수 있다.
물론 여기엔 디폴트 매개변수도 가능! 좀더 다향한 재미를 맛볼 수 있는데, 직접 보면 이렇다.


당연한 이야기겠지만

이처럼 해주면 aaa::a 의 값은 10이 들어 갈 것이다.
사실 아직 public과 private, protacted에 대해서 설명하기전에 생성자를 말해놔서 당장은 왜 저렇게 하나...
싶기도 하겠지만 그것은 곧 알게 될테고(아마 뼈저리게...)

시작할 때 생성자가 있다면

끝날 때에는 소멸자가 존재한다.



결과 값은
100
0
이 나오게 된다.(main부분은 위 main 코드와 동일)



어찌 보면 당장은 생성자 보단 소멸자에 더 끌릴지도 모르겠다 메모리 삭제나 그외 종료하면서 해줘야 하는 일들을 소멸자에 넣으면 잊어 버리더라도 객채가 사라질때 소멸자에서 일을 해주기 때문이다.
시간이 늦어서(아 졸려) 뭔가 발로 쓴 느낌이 들지만. 큰 맥락은 다 잡은것 같다. 좀더 상세하고 재미잇고 세부적이고 짜증나고 분노가 치밀어 오르고 답답하고 열받는 이야기는 빠른 시일 내에 맑은 정신으로 다시 포스팅할 계획!(public과 그 친구들에 대해서도)

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

객체 포인터 배열  (0) 2010.03.21
클래스의 활용  (0) 2010.03.20
class(클래스) ~ C++의 꽃 ~  (0) 2010.03.19
레퍼런스(Reference)  (0) 2010.03.18
new & delete  (0) 2010.03.17
const 상수화  (0) 2010.03.17
Posted by 안식의후크