C++ 스타일 C 코드
// C++ 스타일 C 코드 예
#include <stdio.h>
typedef struct USERDATA
{
int age;
char name[32];
void(*print)(struct USERDATA* pUser);
}
void printData(USERDATA* pUser)
{
printf("%d, %s\n", pUser->age, pUser->name);
}
int main()
{
USERDATA user = { 30, "2DC", printData };
user.print(&user);
return 0;
}
위의 코드는 C언어를 C++ 스타일로 짜본 것이다.
C언어는 클래스/객체 대신 구조체를 사용하고, 구조체는 기본적으로 메서드를 멤버로 둘 수 없다.
따라서 함수 포인터 멤버를 구조체에 둔 후 호출하는 방식을 통해 구조체를 객체처럼 활용할 수 있다.
그런데 여기에서 구조적인 문제가 발생한다.
typedef struct USERDATA
{
int age;
char name[32];
void(*print)(struct USERDATA* pUser);
}
// 구조체와 아래 함수는 거의 99% 의존한다고 볼 수 있다.
void printData(USERDATA* pUser)
{
printf("%d, %s\n", pUser->age, pUser->name);
}
이 코드에서 구조체 USERDATA와 printData 함수는 거의 99.9% 의존관계가 있다고 봐도 과언이 아니다.
USERDATA 구조체가 사라진다면 printData 함수도 필요가 없어질 것이기 때문이다.
구조적 문제 뿐만 아니라 호출에도 문제점이 생긴다.
int main()
{
USERDATA user = { 30, "2DC", printData };
user.print(&user);
// user의 멤버를 호출했는데 매개변수로 user을 전달해주는게 맞는가?
return 0;
}
일단 구조체 선언시에 함수 포인터를 같이 넣는 것은 그냥 그렇다고 치자.
그럼 user 구조체 내에 있는 print 함수를 호출하는데 매개변수로 자기 자신을 전달해주는게 과연 옳은 것일까?
생각해보아야 할 문제이다.
this 포인터의 정의
객체를 다루는 모든 언어에는 this 포인터가 있다. 그렇다면 왜 객체에는 this 포인터가 있을까??
개발 시점에서는 미래에 생성될 객체 주소를 전혀 알 수 없기 때문에 this가 필요하다고 정의할 수 있다.
즉, this 포인터는 개발 단계에서 미래에 생성될 객체의 포인터를 가리키는 것이다.
그래서 C++에서 OOP 개념이 등장하면서 객체의 this 포인터도 함께 생기게 되었다.
내부적으로는 C계열로 돌아가는 자바스크립트에서도 이는 크게 다르지 않다.
이벤트 객체의 this는 이벤트 객체를 가리키고, 글로벌 객체의 this는 글로벌 객체를 가리키고, 클래스의 this는 추후 그 클래스로 만들어낼 객체를 가리킨다.
'C, C++' 카테고리의 다른 글
C++) 디폴트 생성자(Constructor)와 소멸자 (0) | 2024.01.21 |
---|---|
C++) 클래스 기본 문법 (0) | 2024.01.21 |
C++) OOP에서 객체란 무엇인가 (0) | 2024.01.20 |
C++) Name Mangling (0) | 2024.01.20 |
C++) Namespace (0) | 2024.01.20 |