본문 바로가기
Software/C++&MFC 핵심노트

[C++/MFC 핵심노트] Class (클래스) 정의,선언 - PART 1

by lovey25 2018. 11. 19.
반응형

2018-12-12 update log: 더미프로젝트 변경으로 인한 실습코드 수정


클래스는 C++을 객체 지향 언어라고 부르게하는 가장 중요한 부분이라고 합니다. 클래스는 사용자가 내부의 데이터 멤버와 함수를 정의해서 만드는 데이터 타입입니다. 그리고 이렇게 만들어진 클래스는 인스턴스를 생성해서 사용하게 된다고 합니다. 

클래스의 개념만으로는 저도 뭔소린가 싶은데, 예제를 보면서 차근차근 이해해 보도록 하겠습니다.

Class 정의

클래스 사용에 앞서 정의가 필요합니다. 클래스가 어떤 구조를 가지고 있으며 어떤 타입의 객체를 가지고 어떤 동작을 할 것인지 개략적인 컨셉을 설명해주는 과정입니다. 

정의를 하는 방법은 "class" 라는 키워드와 함께 사용할 이름과 중괄호로 둘러싼 본문을 차례대로 써주면 됩니다. 그리고 마지막은 세미콜론으로 끝을 표시해 주어야 합니다. 아래 "Student"라는 클래스의 예제를 보죠. 예제는 이전 포스팅에서 만들었던 더미프로젝트를 사용했습니다.

[실습코드#1 (MyFirstProgramDlg.h)]

class Student
{
   public:
   int m_number;     // 멤버변수
   CString m_name;   // 멤버변수
   void PrintOut();  // 멤버함수
};

"Student"라는 클래스는, "public:" 이라는 접근 속성을 가지도록한 정수형 변수 "m_number"와 문자열 변수 "m_name" 그리고 void형의 함수 "PrintOut()"이라는 3개를 맴버로 정의되었습니다. 
(3행의 "public"이라는 키워드는 별도로 정리하도록 하겠습니다.)

Class 선언

클래스를 정의 했으면 사용하기 전에 선언이라는 과정이 필요합니다. 선언은 변수의 선언과 유사한 방법을 취하고 있습니다. 변수 선언시 선언할 변수의 타입을 먼저 쓰고 뒤에 사용할 변수의 이름을 써주듯, 클래스 선언도 정의되어 있는 클래스 중 어떤 클래스를 사용할지 클래스 이름을 먼저 써주고 뒤에 그 객체가 어떤 이름을 가질지를 써주게 됩니다.

위의 "Class 정의"에서 정의한 "Student"클래스를 사용해서 객체를 선언해 보겠습니다.

[실습코드#2 (MyFirstProgramDlg.cpp)]

void CMyFirstProgramDlg::OnBnClickedButton1()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	
	// ↓↓↓ << 실습용 코드가 시작되는 위치 입니다. >> ↓↓↓
	// ------------------------------------------------------
	
	Student A;                    // 객체 A 생성
	A.m_number = 1;               // 멤버변수에 값 대입
	A.m_name = _T("Jone");        // 멤버변수에 값 대입

	A.PrintOut();                 // 멤버함수 호출

	// ------------------------------------------------------
	// ↑↑↑ << 실습용 코드가 끝나는 위치 입니다. >> ↑↑↑	
	UpdateData(FALSE);
}

void Student::PrintOut()              // 멤버함수 정의
{
	myprint(m_name);        // 출력
}

8행에서 "A"라는 객체를 생성해서 "Student" 클래스가 가지고 있는 멤버변수 및 멤버함수를 "A"도 가지게 되었습니다. 18행 부터는 "PrintOut()"이라는 멤버함수의 정의가 따라나오고 있는데 "MyFirstProgramDlg.cpp" 파일의 멘 마지막에 추가 되었습니다. 

이렇게 수정된 더미프로젝트를 실행해서 "Button1"을 눌러보면, 10행에서 멤버변수에 대입한 학생이름("Jone")이 12행에서 멤버함수를 호출하는 코드에 의해서 19~22행의 코드가 실행되어 화면에 출력이 됩니다. 

이 과정에서 "A.m_name"이나 "A.PrintOut"처럼 점(.) 연산자가 클래스 내부의 함수와 변수를 지정하는데 사용되었는데요. 이제 이런 선택 연산자에 대해서 정리해 보겠습니다.

선택 연산자

앞의 실습코드에서 생성한 객체 A는 멤버로 변수와 함수를 포함하고 있습니다. 이렇게 클래스 내부에 있는 멤버에 접근할 때 사용하는 것이 선택 연산자입니다.

선택연산자로써 점(.) 연산자와 화살표(->) 연산자를 사용할 수 있는데요. 아래 두가지 사용방법과 용도를 알아보겠습니다.

점(.) 선택 연산자

점 선택 연산자는 객체의 멤버에 접근할 때 사용하게 되는데 사용법은 객체이름뒤에 점(.)을 찍고 접근하고자 하는 멤버의 이름을 써주면 됩니다.

따라서 실습코드#2의 9행은 "A"라는 객체안에 있는 "m_name" 변수를 선택하여 해당 변수를 "Jone"으로 대입하는 모습입니다.

화살표(->) 선택 연산자

다음으로 화살표(->) 연산자입니다. Arrow selection operator라고 하던데 그냥 편하게 화살표 연산자라고 부르겠습니다.

화살표 연산자는 점 연산자 처럼 클래스 내부의 멤버에 접글할 때 사용하는 연산자인데 기준이 되는 클래스가 객체가 아니라 포인터일때 화살표 연산자를 사용합니다.

아래 예제를 보겠습니다. 

실습코드 #1에서 선언한 클래스는 그대로 사용을 하고 실습코드 #2만 아래 #3로 변경하겠습니다.

[실습코드 #3]

void CMyFirstProgramDlg::OnBnClickedButton1()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	
	// ↓↓↓ << 실습용 코드가 시작되는 위치 입니다. >> ↓↓↓
	// ------------------------------------------------------
	Student A;                  // 객체 A 생성
	Student* pA = &A;           // 객체 A 생성
	pA->m_number = 1;           // 멤버변수에 값 대입
	pA->m_name = _T("Jone");    // 멤버변수에 값 대입

	pA->PrintOut();             // 멤버함수 호출

	// ------------------------------------------------------
	// ↑↑↑ << 실습용 코드가 끝나는 위치 입니다. >> ↑↑↑	
	UpdateData(FALSE);
}

void Student::PrintOut()            // 멤버함수 정의
{
	myprint(m_name);      // 출력
}

7~12행까지만 변경이 되었는데요. 

먼저 7행에서 객체 "A"를 생성하였습니다. 그리고 8행에서는 객체 "A"의 주소를 담을 수 있는 포인터"pA"를 선언하고 "A"객체의 주소를 대입했습니다. 

9, 10, 12행은 실습코드#2와 동일한 기능을 하는 내부 변수와 함수에 접근하는 코드인데 앞에서와는 달리 "pA"라는 포인터를 기준으로 했습니다. 바로 이렇게 객체 자체가 아니라 포인터를 통해서 내부의 멤버에 접근할 경우 화살표 연산자를 사용하게 되겠습니다.

코드를 실행해 보시면 결과는 당연히 동일하게 나오겠죠.

 

PART1 끝!

반응형

댓글