ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

    댓글

Designed by Tistory.