-
[C++] 클래스를 살펴보기 전에C++/이것이 C++이다 2021. 2. 27. 01:36
C++이 C와 다른 것은 여러가지가 있지만
소소한 문법적인 요소를 제외하고 거시적으로 살펴본다면
'객체지향' 이라는 요소가 가장 두드러질 것 입니다.
본 글에서는 C++의 객체지향 구현 요소인 클래스를 살펴보기 전에
어떤 아이디어에서 객체지향이 등장했는지 단편적으로 살펴보도록 하겠습니다.
1. 구조체
더보기예제를 먼저 보도록 하겠습니다.
이하 예제는 이름과 나이를 유저 데이터로 묶기 위해 구조체를 사용 한 예제입니다.
Example (Struct)
#include <stdio.h> typedef struct User { int age; char name[24]; }User; int main() { User user = { 10, "Lee" }; printf("Age : %d\nName : %s\n", user.age, user.name); }
Age : 10 Name : Lee
소스코드에 별다른 설명이 필요하지 않을 정도로 간단한 예제입니다.
이 코드 자체에는 문제가 없지만, 이하를 가정해보도록 하겠습니다.
[구조체를 만든사람과 구조체를 사용할 사람이 서로 다르다]
이 경우, 위의 예제와 같이 간단한 구조체의 경우는 문제가 없지만, 사용자가 구조체에 대한 이해가 필요하고 차후 구조체가 수정될 경우, 사용자의 소스코드도 변경되어야 하는 문제점이 발생할 수 있습니다.
다음 문단으로 이어집니다.
2. 인터페이스
더보기위의 구조체에 대하여, 사용자의 편의를 위해 출력 함수를 새로 정의해보겠습니다.
구체적으로 이하의 예제와 같습니다.
Example (Struct with Print function)
#include <stdio.h> typedef struct User { int age; char name[24]; }User; void PrintUser(User *user){ printf("Age : %d\nName : %s\n", user->age, user->name); } int main() { User user = { 10, "Lee" }; //printf("Age : %d\nName : %s\n", user.age, user.name); PrintUser(&user); }
Age : 10 Name : Lee
구조체와 사용자 사이에 PrintUser()라는 출력을 담당하는 함수가 생겼습니다.
위와 같은 식으로 구조체(혹은 그에 준하는 어떤 것)과 사용자 사이의 연결창구 역할을 해 주는 것을 '인터페이스' 라고 합니다.
은행의 ATM에서 입, 출금을 할 때 은행의 재정 구조에 대해 알 필요가 없는 것과 비슷합니다.
이것으로 사용자는 구조체에 대해 알 필요가 없어졌습니다.
하지만, 이젠 아래와 같은 문제를 생각 해 볼 수 있습니다.
'PrintUser랑 User랑 어떤 연관성이 있는가?'
다음 문단으로 이어집니다.
3. 구조체에 함수를 넣으면
더보기위에서 우리는 구조체에 대한 인터페이스를 만들었습니다.
하지만, 새로이 구조체와 인터페이스에 대한 관계에 대한 문제를 생각해보아야 합니다.
이 문제를 해결하기 위해, 구조체에 함수를 넣어보도록 하겠습니다.
Example (Struct include Print function)
#include <stdio.h> typedef struct User { int age; char name[24]; void (*Print)(struct User *); }User; void PrintUser(User *user){ printf("Age : %d\nName : %s\n", user->age, user->name); } int main() { User user = { 10, "Lee", PrintUser }; //User user = { 10, "Lee" }; //printf("Age : %d\nName : %s\n", user.age, user.name); //PrintUser(&user); user.Print(&user); }
Age : 10 Name : Lee
구조체 내부에 Print 멤버 변수를 만들고, 거기에 PrintUser()함수를 넣어주었습니다.
이것으로, 유저 구조체에서 직접 Print를 하는 것이 가능합니다.
하지만, 이 방법 또한 새로운 문제점이 생겼습니다.
유저가 Print를 호출하는데, 매개변수로 자기 자신을 넘겨주어야 하는 것 입니다.
문법적으로 옳고, 기능적으로도 옳지만
User 변수가 자기 자신의 주소를 모른다는 점이 넌센스로 다가옵니다.
그래서, 우리는 아래와 같이 호출 방법을 바꾸어 보려고 합니다.
Example (Class)
#include <stdio.h> /* typedef struct User { int age; char name[24]; void (*Print)(struct User *); }User; void PrintUser(User *user){ printf("Age : %d\nName : %s\n", user->age, user->name); } */ int main() { //User user = { 10, "Lee", PrintUser }; User user = { 10, "Lee" }; //printf("Age : %d\nName : %s\n", user.age, user.name); //PrintUser(&user); //user.Print(&user); user.Print(); }
Age : 10 Name : Lee
물론, 위의 소스코드는 컴파일 에러가 발생합니다.
하지만 사용자의 관점에서 위와 같은 구조가 가장 이상적일 것이고
클래스를 이용한다면 이러한 구현이 가능하게 됩니다.
본 글은 이후 쓰여질 클래스의 기본 문법에 관한 글에 대한 서론의 역할을 하고 있으며
구조체의 존재의의에 의문을 가지는 글이 아님을 알아주시길 바랍니다.
C언어는 높은 퍼포먼스가 필요한 분야 (임베디드, 커널 등)에서 빠질 수 없는 언어임이 분명합니다.
부디 오해가 없으시길 바랍니다.
클래스에서 빠질 수 없는 객체지향의 패러다임에 대한 이야기는 차후 다른 글에서 다룰 예정이며
다음 글은 클래스 기본 문법에 대한 글이 될 것 같습니다.
짧지 않은 글 읽어주심에 감사드립니다.
'C++ > 이것이 C++이다' 카테고리의 다른 글
[C++] 클래스 기본 문법 2 (0) 2021.03.12 [C++] 클래스 기본 문법 1 (0) 2021.02.27 [C++] 네임스페이스 (0) 2021.02.12 [C++] 함수 기본 (0) 2021.02.12 [C++] C와 C++ (0) 2021.01.29