C언어(태초)
#include <iostream>

typedef struct USERDATA
{
	int nAge;
	char szName[32];
} USERDATA;

int main(void)
{
	USERDATA user = { 28, "승우" };
	printf("%d, %s\n", user.nAge, user.szName);
	return 0;
}

간단한 C언어이다. 이 USERDATA라는 놈을 출력 하려면 사용자가 USERDATA 구조체의 구성을 다 알아야 한다. (nAge의 타입은 int니깐 %d로 찍고 등등)

 

만약 USERDATA 구조체를 만든 제작자가 출력해주는 코드를 같이 짜준다면??

#include <iostream>

typedef struct USERDATA
{
	int nAge;
	char szName[32];
} USERDATA;

void PrintData(USERDATA* pUser)
{
	printf("%d, %s\n", pUser->nAge, pUser->szName);
}

int main(void)
{
	USERDATA user = { 28, "승우" };
	PrintData(&user);
	return 0;
}

사용자는 그저 PrintData를 호출하기만 하면 된다. USERDATA의 멤버의 구성을 일일히 다 알 필요가 없다는 뜻!

이런 PrintData를 인터페이스 함수라고 부른다.(내부는 모르겠고 인터페이스를 통해서 알아서 좀 해줘~!)

 

근데 좀 허전하다 USERDATA 구조체와 PrintData가 무슨 관계가 있는지 어떻게 아냐? 좀 묶을 필요가 있다. 사용자가 헷갈리지 않도록.

 

구조체안에 함수도 한번 넣어봐라.

#include <iostream>

typedef struct USERDATA
{
	int nAge;
	char szName[32];
	void(*MyPrint)(struct USERDATA*);
} USERDATA;

void PrintData(USERDATA* pUser)
{
	printf("%d, %s\n", pUser->nAge, pUser->szName);
}

int main(void)
{
	USERDATA user = { 28, "seungwoo", PrintData};
	user.MyPrint(&user);
	return 0;
}

구조체 USERDATA의 주소값을 파라미터로 가지는 MyPrint 함수를 구조체 안에 넣었다. 그리고 PrintData로 초기화했다.

진짜 구조체안에 함수를 넣으려고 애썼다. 근데 한가지 아쉬운점은 자기자신의 주소를 한번 더 파라미터로 넘긴다는점.

야 니꺼 니가 접근하는데 도대체 니 주소를 왜...?? 안되겠다 Class 만들자.

 

C++ Class  탄생
class USERDATA
{
public:
	int nAge;
	char szName[32];

	void MyPrint(void)
	{
		std::cout << this->nAge << " " << this->szName << std::endl;
	}
};


int main(void)
{
	USERDATA user = { 28, "seungwoo"};
	user.MyPrint();
	return 0;
}

이런식으로 만들면 정말 이쁘다 이뻐.. c++에서 MyPrint 메소드를 호출할 때 사실은 &user가 파라미터로 넘어간다. 이것을 히든 파라미터라고 부른다.

'C++' 카테고리의 다른 글

C++ 깊은복사 얕은복사  (0) 2020.02.02
C++ 복사 생성자(참조형 파라미터)  (0) 2020.02.01
C++ this 포인터  (0) 2020.02.01
C++ 참조자 형식(reference)  (0) 2020.01.27
C++ new 메모리 동적할당  (0) 2020.01.27

+ Recent posts