검색결과 리스트
정리에 해당되는 글 3건
- 2011.10.12 MFC 5장 키보드 입력
- 2011.10.12 MFC1장
- 2011.09.17 I.객체지향 방법론
글
키보드 관련 대표적인 메세지는 WM_KEYDOWN과 WM_KEYUP
특정키를 계속 누르고 있으면 WM_KEYDOWN 메세지가 계속 발생함.
메세지를 전달할떄는 어떤키를 눌렀는지에 대한 파라미터가 담겨있음.
키보드 메세지는 모든키에 발생하지만 예외가 있음.
예외) Alt 키 와 F10키
두키를 누르면 WM_KEYDOWN 메세지가 발생하지 않고 WM_SYSKEYDOWN 메세지가 발생함, 그리고 이메세지와 WM_SYSKEYUP 메세지가 짝을이룸.
WM_KEYDOWN 메시지의 파라미터에 ASCII코드의 문자에 해당하는 키가 입력될경우,
메세지 루프의 TranslateMessage()함수가 WM_KEYDOWN 메시지를 다시 WM_CHAR 메시지로 전환하여 전송함.
<소스 코드 5-03>==================================
void CKeyMoveView::OnKeyDown(UNIT nChar, UINT nRepCnt, UINT nFlags)
{
CPoint ptChild; //차일드 윈도우의 좌표.
CPoint Rect; //차일드 윈도우의 좌표및 크기.
m_wndChild.GetWindowRect(&Rect);//차일드 윈도우의 두 좌표 정보(스크린 기준)를 가져온다.
ptChild.x = Rect.left;
ptChild.y = Rect.top
ScreenToClient(&ptChild); // 스크린 기준 좌표를 클라이언트 뷰 기준의 좌표로 변환.
switch(nChar)
{
case VK_LEFT: //방향키 왼쪽이 눌러지면..
ptChild.x -=10;// 10픽셀만큼 x좌표 값 에서 감소.
break;
case VK_RIGHT: // 방향키 오른쪽이 눌러지면
ptChild.x +=10;// 10픽셀만큼 x좌표 값 에서 증가.
break;
}
m_wndChild.SetWindowPos(&CWnd::wndTop,ptChild.x,ptChild.y,0,0,
SWP_SHOWWINDOW | SWP_NOZORDER | SWP_NOSIZE);
CView::OnKeyDown(nChar,nRepCnt,nFlags);
}
======================================================
윈도우 좌표계와 활용함수(GetWindowRect(),SetWindowsPos())를 이해하고,
CPoint나 CRect 같은 데이터 클래스에 대해서도 알아야한다.
<소스코드 5-04>======================================
/*
* Virtual Keys, Standard Set
*/
#define VK_LBUTTON 0X01
#define VK_RBUTTON 0X02
#define VK_CANCLE 0X03
#define VK_MBUTTON 0X04
#if(_WIN32_WINNT >= 0X0500)
#define VK_XBUTTON1 0X05
#define VK_XBUTTON2 0X06
#endif /* _WIN32_WINNT >= 0X0500 */
=====================================================
OnKeyDown() 메시지 핸들러 함수의 첫번째 인자인
nChar에는 어떤키를 눌렀는지에 대한 정보가 들어있다.
이런값을 가상 키값(Virtual Key Code)이라 하며, WinUser.h파일에 정의되어있다.
ESC 키의 경우 VK_ESCAPE이며, ENTER 경우 VK_RETURN.
윈도우에서는 알파벳이나 숫자처럼 사람이 인식하는 문자열과 관련된 키에 의한 발생한 WM_KEYDOWN메시지는 WM_CHAR 메시지로 전환하여 재전송하게됨.
이런 작업은 메시지 루프에서 TranslateMessage() 함수가 처리.
그러므로 문자열 입력을 처리하고 싶다면 WM_CHAR메시지 핸들러를 등록하는 것이 바람직함.
nRepCnt인자는 반복횟수를 의미.(대부분의 횟수는 1)// 키를 계속누르고 있으면, 2나 3이 될수도있고 그이상이 될수도음.
nFlags 인자는 키보드에 대한 상세한 상태 정보를 담고있음.(비트 단위로 잘라서 특정 범위값을 살펴 봐야함.)
VK_RIGHT 는 오른쪽 화살표를 눌렀을때도 해당하지만 키패드에서 Number Lock 을 끈상태에서는 숫자 6을 눌렀을때에도해당함. 만일 둘을 구별해야한다면 nFlags에서 특정 비트의 값을 확인하여 판별가능.
스캔코드의 값은 모두 같아 보이지만 확장키의 비트값이 차이가있음. 그리고 방향키를 누르더라도 여러키(Ctrl + Alt)를 조합하면 차이가 생김.
<그림 5-1>참조 !!!!!.
0~7 : 스캔코드(키보드의 특정키를 식별하는 값.)
8 : 확장키(1이면 확장키)
9~10 : 사용하지않음.
11~12: 윈도우 OS에서 사용
13 : 비트컨텍스트(1이면 Alt키가 눌러진상태)
14 : nChar값에해당키 (0이면 키가 눌린상태) ▶WM_KEYDOWN 메시지는 키를 눌렀을때 발생하기 때문에.
15 : 비트 전송 코드 (0이면 키를 누른상태 WM_KEYDOWN 메시지의 특성상 이값이 0임)
nFlag 값의 변화를 확인하고 싶다면 OnKeyDonw() 메시지 핸들러 함수에 중단점을 설정(F9) 디버그 모드로 실행(F5)
CPoint와 CRect 같은 클래스들은 각각 POINT 와 RECT 구조체를 클래스화 하고 연산자를 정의한것.
CPoint 클래스의 가장중요한 맴버함수는 x,y
CRect 클래스의 중요맴버함수는 left, right, top, bottom
그리고 가장 많이 사용하는 메소드로는 Width() 와 Height() 등이있음.
GetWindowRect() 함수는 CWnd클래스의 맴버이며, 모니터기준 왼쪽 위와 오른쪽아래의 좌표를 알아내는 함수.
Rect구조체에 m_wndChild 윈도우를 모니터 기준 좌표로 반환.
왼쪽위좌표를 CPoint 클래스에 저장. 이좌표를 변환하여 현재위치를 파악하고 눌러진 키보드가 무엇인지 확인하여 새로운 위치로 윈도우를 이동시킴.
ScreenToClient() 함수는 CWnd 클래스의 맴버함수이며, POINT 구조체로 전달받은 좌표를 특정윈도우 기준 좌표로 변환.
<그림 5-3> 기준으로 GetWindowRect() 함수로 얻은 왼쪽위의 좌표(C)는 (300,250)이 되고, ScreenToClient()함수를 호출
하여 클라이언트 뷰 기준으로 변환 하면 (100,100) 이됨.
SetWindowPos()함수는 윈도우의 위치, 크기,Z-order를 변경하는 함수. 원형은
===========<SetWindowPos()>================
BOOL SetWindowsPos(
const CWnd *pWndInsertAfter,
int x, int y,
int cx, int cy,
UINT nFlags
);
=======================================
pWndInsertAfter 인자는 함수를 호출한후 윈도우의 Z-order 를 어떻게 할것인지 명시.
※Z-order란 두윈도우가 겹쳤을때 어떤것이 아래이고 어떤것이 위인지 결정하는값.
SWP_NOZORDER로 주면 NULL값, 앞과같이 이런 플래그를 설정하지 않았다면 값은 NULL이 될수 없으며 CWnd 클래스의 스태틱 맴버중에 하나의 값으로 설정되어야한다,]
=========== CWnd클래스 스태틱 맴버 ===========
static AFX_DATA const CWnd wndTop;
static AFX_DATA const CWnd wndBottoml;
static AFX_DATA const CWnd wndTopMost;
static AFX_DATA const CWnd wndNoTopMost;
BOOL SetWindowPos(const CWnd * pWndInsertAfter, int x, int y,
int cx, int cy, UINT nFlags);
(SetWindowPos() ▶ Z-order)
=================================================
Z-order | 의 미
-----------------------------------------------------------------------------------------
WndBottom | Z-order를 최하위로 합니다.
------------------------------------------------------------------------------------------
WndTop |Z-order를 최상위로 합니다.
-------------------------------------------------------------------------------------------
WndTopMost |Z-order를 최상위로 하고 시스템 윈도우 속성을 갖습니다.
--------------------------------------------------------------------------------------------
WndNoTopMost | 일반윈도우 중 최상위 윈도우가 되도록합니다.
====================================================
=========================================================
x,y 인자는 새로 설정할 윈도우의 왼쪽 위 좌표.
예제에서는 이값을 변경하여 윈도우의 위치를 변경. 만일 SWP_NOMOVE 플래그로 설정하면 두인자는 무시.
cx, cy인자는 새로설정할 윈도우의 폭과 높이. 예제에서는 SWP_NOSIZE로 설정되어있어 값은 0(윈도우크기변경X)
======================nFlags===============
SWP_HIDEWINDOW | 윈도우가 화면에서 사라지도록 함.
-------------------------------------------------------------------------
SWP_SHOWWINDOW | 윈도우가 화면에 보이도록 함.
------------------------------------------------------------------------
SWP_NOACTIVATE | 윈도우를 활성하지 않음.
-----------------------------------------------------------
SWP_NOMOVE | 윈도우의 위치를 변경하지않음(x,y값무시)
----------------------------------------------------------
SWP_NOREDRAW | 윈도우를 다시그리지 않음.
-----------------------------------------------------------
SWP_NOSIZE | 윈도우의 크기를 변경하지않음.(cx, cy값 무시)
-----------------------------------------------------------
SWP_NOZORDER | 윈도우의 Z-order 를 변경하지 않습니다 (pWndInsertAfter 무시)
==============================================
-WM_KEYDOWN 메세지에서 모든것을 처리한다면 OnKeyDown()함수가 길이가 너무 커질수 있으므로, WM_CHAR메세지 핸들러를 추가 하여 특수키입력과 문자키 입력을 구분하여 처리할것!
=========<소스코드 5-08>====================================
void CKeyMoveView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CString strText = TEXT(" "); // 문자열을 선언하고 빈문자열로 초기화
strText.Format(TEXT("%c"),nChar);
//입력한 키가 Enter, Back, ESC키가 아니면
//해당 ASCII문자로 차일드 윈도우 텍스트를 변경한다.
if(nChar != VK_RETURN && nChar != VK_BACK && nChar !=VK_ESCAPE)
{
m_wndChild.SetWindowText(strText);
}
CView::onChar(nChar, nRepCnt,nFlags);
}
===============================================================
nChar인자값이 Enter,BackSpace,ESC 키인지 검사를 하면 WM_CHAR메세지가 발생.
예제에서는 문자를 출력하려고 시도하지만, 당연히 제대로 된 ASCII코드가될수없음.
그래서 세가지 키입력에 대해서는 예외처리.
OnChar() 함수의 nChar(어떤키가 눌렀는지) 와 nRepCnt(몇회눌러졌는지) 인자는 OnKeyDown()함수와 같지만
nFlags인자는 다름 32bit를 사용하고 있으며, 의미가 있는 비트의 위치가 다름.
CString코드의 장점
ⓐ유니코드 문자열을 처리하고 일반 멀티 바이트 문자열을 처리하는 코드나 함수를 따로 분리하지 않아 처리가 훨씬
간단함.
ⓑ더하기 연산자나 할당연산자가 정의 되어있음.
ⓒ문자열 처리에 필요한 메모리를 알아서 관리 하기떄문에 메모리를 할당/해제 하는 코드를 작성할 필요가 없음.
SetWindowText() 함수는 CWnd 클래스의 맴버함수.
인자로 전달받은 문자열로 윈도우의 텍스트를 변경. 이와 쌍을 이루는 함수로 GetWindowText()함수도 있음.
윈도우 운영체제에서는 Alt 키나 F10 키를 누르면 메인 메뉴포커스로 이동.
이 두키에 대한 입력이 발생하면 WM_KEYDOWN과 WM_KEYUP 메시지가 아니라 WM_SYSTEMDOWN과 WM_SYSKEYUP
메시지가 발생함.
============<소스코드 5-09>=============================
void CKeyMoveView::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CString strMessage =TEXT("");//메시지를 저장할 문자열 객체.
//Space 키에 대한 상태 정보를 수집
WORD wResult = ::GetKeyState(VK_SPACE);
BYTE byHigh = HIBYTE(wResult);
//상위 바이트 의 1번 비트가 1이면 키가 눌러진 상태
if(byHigh & 0x01)
{
strMessage += TEXT("Alt+Space,");
//같은 방법으로 Caps Locks 키 상태를 검사
wResult = ::GetKeyState(VK_CAPITAL); // :: API에서 함수를 찾음.
//하위 바이트의 1번 비트가 1이면 토글 키가 켜진상태
BYTE byLow =LOBYTE(wResult);
if(byLow & 0x01)strMessage += TEXT("CAPS LOCK ON");
else strMessage += TEXT("CAPS LOCK OFF");
AfxMessageBox(strMessage);
}
CView ::OnSysKeyDown(nChar, nRepCnt, nFlags);
}
=========================================================
OnSysKeyDown() 함수의 인자는 OnKeyDown() 함수와 같습니다.
OnSysKeyDown()함수는 Alt키와 조합된 키입력에 대한 호출. 지금의 코드에서는 ::GetKeyState() API 함수를 이용하여
특정키의 상태를 검사하고 Alt키와 조합됬는지 확인.
==========================GetKeyState()함수의원형==============
SHORT GetKeyState(
int nVirtKey // vitual -key code
);
=========================================================
인자로는 상태를 검사할 키의 가상키값을 받습니다.
WORD wResult = ::GetKeyState(VK_SPACE); 은 VK_SPACE의 상태를 확인하여 wResult라는 16비트 맴버변수에 결과를 저장하고 있음.
SHORT형이나 WORD형이나 모두 16비트의 크기를 갖음. 그리고 저장된 값이 얼마인지 단순히 확인하는것이아니라,
다시 상위바이트(8비트)와 하위 바이트로쪼개서 키의 상태를 확인함.
HIBYTE()와LOBYTE() 매크로는 인자로 주어진 16비트 값에서 각각 상위, 하위 바이트로 잘라내는 매크로.
GetKeyState()함수가 반환하는 값의 상위 바이트는 키를 누른상태인지에 대한 정보가 들어있고,
하위 바이트에는 토글에 대한 정보가 들어있음.
VK_SPACE는 토글키가 아니므로 굳이 하위정보를 확인할필요없음.
키를 눌렀는지 검사하려고 값을 비교하는 것이 아니라 1번 비트가 1인지 비트 연산(&)하여 확인 합니다.
CapsLocks, NumberLock, ScrollLock 키는 대표적인 토글키.
한번씩 누를때마다 상태가 On/Off되는 특성이있음. 이런정보는 GetKeyState()함수가 반환한 결과의 하위바이트에 들어있습니다.
On/Off상태는 앞서와같이 1번비트를 확인 하면됨.
CString 클래스의 '+='연산자를 이용하여 문자열을 합침.(C언어에서의 strcat()함수와 동일결과)
WM_SYSCHAR메시지는 TranslateMessage()함수가 생성. WM_CHAR 메시지는 문자키 입력일떄 발생하지만 WM_SYSCHAR메시지는 Alt키와 문자키 입력이 조합된경우에만 발생(ex. Alt+S)
'WindowPrograms > MFC' 카테고리의 다른 글
8. 비트맵과 이미지처리 (0) | 2011.10.24 |
---|---|
MFC1장 (0) | 2011.10.12 |
MFC3장 -MFC코드의 기본구조 (0) | 2011.10.12 |
글
* WinMain 함수
- C언어의 메인과 마찬가지임..
시작되는 함수는 여기에서 처리함
핵심함수: _tWinMain
MyRegister(hInstance);
InitInstance
★main message loop(가장중요)//메시지 루프
while(GetMessage(&msg,NULL,0,0))
{
if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Get Message <- Msg Queue 에서 가지고옴
메시지를 가져오면 루프를 돌고 메시지를 가지고 오지못하면(quit) 종료되는구조.
윈도우에서 Message란?
-모든것이 다 Message다.(보여지는것,생성되는것,이동되는것,입력 등등...)
-Message Driven 방식
H.I.D(Human Input Device)- Keyboard, Mouse등(H/W Event 발생)▶OS에서 감지
-키보드에서 키가 눌리면 하드웨어 이벤트가 발생하고, 이이벤트는 OS에서 감지하며 모니터(출력)에 Message로 보내줌.
-DispatchMessage 함수가 호출이 된다면 윈도우 프로시저 함수를 호출(Window Proc)<_Winproc->윈도우창의 인풋에 대해 메시지를 처리함.
메시지 내용은 (HWND hWnd,UNIT message, WPARAM wParam, LPARAM lParam)에 메시지정보를 담고있음.
작업관리자에서 "응답없음"이뜨는것은 메인메시지 에서 루프가 멈추면 "응답없음"발생
Handle 이란 -어떤 포인터에 관한 값.
-------------------------------tWinMain--------------------------
_tWinMain(HINSTANCE hInstance,) ▶응용프로그램 자체를 식별하는 값(실행파일의 메모리상의 위치)
lpCmdLine ▶ 프로그램시작할때 ~~~.exe /?라던지 실행할때쓰는것
nCmdShow ▶ 윈도우를 화면에 보여줄것인지 말것인지를 지정하는 값.
MSG msg ▶메시지 구조체.
====================================
typedef struct tagMSG{
HWND hwnd; //윈도우핸들.(특정윈도우를 식별할때 핸들로 식별함)▶값
UINT message;//핸들의 UINT형의 message로 전달됨
WPARAM wParam;- 메시지 파라미터(매개변수,인수,인자)
LPARAM lParam;- 메시지 파라미터(매개변수,인수,인자)
DWORD time;- 메시지가 전달된 시간(시스템시간)
POINT pt;-포인터 구조체 (x,y) 모니터상의 표시좌표 ↓y →x
#ifdef _MAC
DWORD lPrivate;
#endif
}MSG, *PMSG,NEAR *NPMSG,FAR *LPMSG;
===================================
HACCEL hAccelTable ▶단축키 테이블
<리소스뷰 ▶ HellowWorld▶HelloWorld.rc▶Acceletator▶IDC_HELLOWORLD(단축키테이블)
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING)
▶IDS_APP_TITLE - 선언부에 가면 그냥 값이들어가있고, 이값을 로딩을해서 전역변수로 선언되어있는 szTitle(TCHAR타입 MAX_LOADSTRING(100개-define) 선언)
▶ 리소스 뷰에서 String Table 안에 보면 IDS_APP_TITLE를 값으로 따지면 103번 그것을 로딩하면 HelloWorld값이 버퍼에저장
:다국어 지원때문에 리소스이름으로 넣어둠.
MyRegisterClass(hInstance)▶윈도우의 RegisterClassEx를 호출하는것이 목적.Class▶등급 c++의 클래스 뜻이아님.
윈도우 스탈일, 레지스터, 아이콘,마우스포인터,배경색,메뉴,윈도우이름-리소스뷰(IDC_HELLOWORLD(icon/Menu)
wcex.lpfnWndProcWinProc등록되었다는것은▶ Msg-OS-메세지큐-처리(WinProc)<호출하지는않음>-수동적으로 OS에의해 호출되어짐
UINT▶unsigned int
CALLBACK▶Call Convention(함수호출 시 스텍에 저장할때 어떻게 넣을꺼냐는것)<_stdcall>
WM_COMMAND: ▶ 어떤키를 눌렀을때 발생한 메세지를 처리
InitInstance(hInstance, nCmdShow)▶ CreateWindow함수를 직접 호출
===========================================================
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL,NULL, hInstance,NULL)
===========================================================
CreateWindow▶윈도우 핸들을 리턴
WS_OVERLAPPEDWINDOW▶ WS: 윈도우 스타일 OVERLAPPEDWINDOW:중첩해서 쓰는 윈도우(가장기본적인윈도우)
WM_PAINT▶윈도우를 다시 그릴때 사용
WM_DESTORY▶ 종료를 눌렀을때 불림.
'WindowPrograms > MFC' 카테고리의 다른 글
8. 비트맵과 이미지처리 (0) | 2011.10.24 |
---|---|
MFC 5장 키보드 입력 (0) | 2011.10.12 |
MFC3장 -MFC코드의 기본구조 (0) | 2011.10.12 |
설정
트랙백
댓글
글
1. 객체지향의 개념
- 어떤문제를 해결하기 위한 과정을 순차적으로 설계하는것 ▶절차적 방법론
절차적언어: Pascal , Fortran, C, C++등..
2. 객체 클래스와 상속
- 유사한 특징을 지닌 객체를 묶어서 그룹지은것이 객체클래스(Object Class)
- 인스턴시에이션(Instantiation): 추상적 개념으로 부터 구체적 실례 하나를 만드는것.
- 같은 클래스에 속한 모든 객체는 동일한 메세지에 대하여 동일하게 반응함. 즉,동일한 메소드를 사용.
- 클래스를 바라보면 클래스간의 계층구조가 존재하는것을 알수 있음. 즉,어떤 클레스(Child Class,
sub Class, Derived Class)는 더높은 일반적인클래스(Parent Class, Super Class, Base Class)에
속하고, 그 클래스는 다시 더높고 포괄적인 클래스에 속한다.
- 객체지향 언어에서 클래스간 계층구조를 선언하는것은 상위클래스의 속성(Attribute)을
상속(Inheritance) 받기위함.
객체지향 설계과정 | |
1단계 | 문제를 풀기위해 필요한 객체설정 |
2단계 | 객체간의 유사한 속성파악 |
3단계 | 유사한 속성을 지닌객체를 모아 기본클래스 선언 |
4단계 | 기본 클래스로부터 특수한 속성을 지닌 하위 클래스 정의 |
- 상위 클래스에서 메소드를 선언하였을때, 어떤 클래스가 그하위 클래스라고 선언하기만 하면 자동으로
상위메소드를 상속받게된다. 자신의 소속을 밝힘으로써, 자신이 속한 단체의 재산 을 가져오는 행위.
3. C++객체지향
-프로그램의 단위성(Modularity)이 높음.
-큰문제 전체를 하나로 놓고 한꺼번에 모든 세부사항을 처리하는것보다 그문제를 잘라서
작은단위(Module)로 분할한 다음 이들을 개별, 단위별로 구현하는것이 훨씬 수훨한방법이다.
-객체단위로 잘라놓으면 나중에 다른문제를 해결할때에도 필요한 객체만 가져다가 조합함으로써
재사용성(Reusablity)을 높일수 있다.
①인터페이스 파일
-클래스의 선언은 Public 섹션과 Private색션 두부분으로 구성.
Public은 '공유'라는뜻으로, 내부에서 선언된 메세지를 외부사용자가 공유할수 있다는 의미이다.
따라서, 외부사용자는 여기에서 선언된 메세지를 사용하여, 이클래스의 객체에게 일을 시킬수 있다.
-객체지향 개념에서의 메세지를 C++에서는 맴버함수라고 부른다.
클래스 선언은 인터페이스의 역활만 하면 충분함으로 맴버함수의 구체적인 구현 내용은 나타나지않고
함수명(Function Prototype)만표시한다. 객체를 불러서 사용하는 외부에서는 구체적인 외부내용은 볼
필요가 없기때문이다. 외부에서 이파일만 보고 메세지를 던져야 하는사람을 위해서 메세지가
구체적으로 무엇을 해주는 것인지 쉬벡 알아볼수 있도록하여야함(주석처리)
-맴버함수중 클래스명과 동일한 함수명을 사용하되 리턴타입을 선언하지않는 함수가
"생성자(Constructor)"함수이다.
이함수는 문자 그대로 새로운 객체를 만드는 함수로써, 객체의 선언시 자동으로 불려져온다.
반면,객체를 없애고 그객체가 사용하던 메모리 공간을 운영체제에게 반납하기 위한 함수가
"소멸자(Destruct)"함수이다.
소멸자 함수는 클래스명앞에 물결(Tilde,~)표시로 구분하며, 생성자 함수와 마찬가지로 리턴타입을
선언하지 않음.
-C++클래스 선언의 두번째 섹션은 Private 라는 키워드로 시작, 이부분은 사적인것으로 외부사용자와
공유하는 부분은 아니다.
즉,이섹션에 선언된 변수나 함수를 읽고 쓰려고 외부에서 직접접근을 할수없다.
이부분을 접근할수 있는 자격을 가진것은 자체클래스 맴버함수 뿐이다.
일반적으로 Private섹션에 나타내는것은 맴버함수를 수행하는데 필요한 객체의 내부 저장공간.
즉, 변수들로써 이를 C++에서는 맴버데이터라고 부른다. 객체자신의 변화상태를 나타내는 변수라는
의미에서 객체지향에서는 이를 "상태변수:라고도한다.
②구현파일
-구현함수에서는 클래스명을 먼저쓰고, 콜론(:) 두개를 붙인다음. 이어서 메세지명을 써야한다
ex) Card::card()
이렇게 함으로써, 어느클래스에 속한 함수인지 나타낼수 있다.
같은 이름의 메세지라 할지라도, 클래스에따라서 처리방식이 달라질수있기 때문이다.
③메세지전달요령
-어떤클래스에 속한 객체를 선언하려면 클래스명다음에 객체를 선언.
ex)Card MyCard;
Card는 클래스 MyCard는 해당클래스에 속한 객체명.
-C++에서 메세지전달은 메세지를 받을 객체 다음에 점을 찍고 메세지명을대면된다.
ex) MyCard.Flip();
필요하다면 괄호안의 파라미터를 같이넣어 전달하면됨. 객체의 맴버데이터를 지정할때에도 객체명
다음에 점을찍고 변수명을 지정한다.
맴버함수 다음에는 파라미터가 없어도 빈괄호를 넣는것이 상례.
※ 괄호가 없을시 그것이 맴버함수인지,맴버데이터인지 헷갈릴수가있다.
④상속과 다형성
Public:
Triangle();
~Triangle();
void Draw();
float Area();
float GetBase();
Private:
float Base();
float Height();
};
이어받는것은 맴버함수와 맴버데이터 모두를 이어받는것.
-EX)1-1의 경우 triangle.T;라고 선언하고 T.Rotate(); 명령을 내릴수도있다. 맴버함수가 없음에도 이러한
명령을 내릴수있는것은 상위클래스인 Class Shape에 Rotate라는 맴버함수가 정의되고 구현되어있기
때문. 즉, 상속에 의한것임.
-T.Rotate();라고한다면 T클래스인 triangle 클래스에 해당함수가 있는지 먼저 검색함. 만약 해당함수가
있다면, triangle클래스에 선언된 함수가 직접실행. 그곳에 없을때에 한해서만 그 상위 클래인 Shape
클래스로 올라가서 , 가장먼저선언된것이 사용된다. 실행시 일어난다는 의미에서 "동적연결"이라함.
-연산자 오버로딩 ▶ 동일연산자에 두개이상의 의미를 부여하는것.
4.절차적설계와비교
-절차적 설계에는 어떤작업을 함수로 정의하고 이를 반복해서, 호출함으로써 재사용성을 높임.
반면 객체 지향설계는 모든 함수를 수행할수 있는 객체를 우선시한다. 어떤객체를 설정하여 그객체가
할수있는 모든 기능을 한군대 모아놓는 접근방법이 재사용 면에서는 더욱유리하다.
객체지향에서 무엇보다 중요한것은 인터페이스와 구현의분리이다.
외부에서 객체를 사용하는 사람의 입장엣서는 인터페이스만 알면된다. 객체 내부가 구체적으로 어떻게
구현되는지 몰라도된다. 이처럼 내부가 외부에 공개되지않도록 "외부와 벽을 쌓고있다"라는 의미에서
이를 "인캡슐레이션"이라고한다.
RECENT COMMENT