훈, IT 공부/C,C++,MFC

[C/C++] C++에서의 클래스와(Class) C언어 에서의 구조체 비교해보자

IT훈이 2018. 1. 31.
반응형

C++ Class vs C Struct + Function()

C언어를 배우셨다는 전제하에 설명을 드리는점 양해부탁드립니다.

# C++ 에서의 클래스에 대한 간단한 이론

C++은 객체지향언어 입니다. 
말그대로 객체를 지향하는 언어라는 말이죠. 
객체로 코드를 작성 하지않고 절차로 해도 되지만, 우리는 객체를 지향한다... 머 요딴 말인거같습니다.
 
C++에서는 "클래스(Class)" 라는 것이 있는데, 매우 중요히 다루어 질것입니다. 
"클래스(Class)" 를 알기전에 객체(Object)란 무엇인지 부터 간단한 개념만 이해하고 넘어가겠습니다.


객체란(Object)
객체란 : 우리가 계속해서 배웠던 "변수" 들과 앞에서 배울 "메소드(Method)" 라는 것이 모여서 
"어떤한 동작을 하거나 기능" 을 하는 것을 말합니다.

여기서 "메소드" 라는 것은 .. C언어에서 사용하는 "함수" 와 흡사한 느낌이라 생각을 해보셨으면 좋겠습니다.
그냥 그렇게 일단은 생각을 하면 됩니다.

그렇다면 

클래스란(Class) 
 클래스는 앞서 설명했던 "객체"라는 것이 모여서 클래스가 됩니다. 
즉, 클래스는 객체들을 모아서 사용을하는 형태가 되겠습니다.

C언어를 빗대어 표현을 하자면 "구조체 + 함수" 라고 생각을 해주시면 됩니다. 
매우 흡사합니다.

객체지향 프로그래머가 되는 우리는 굉장히 클래스를 잘 작성해야합니다. 
사용자가 클래스를 잘 활용하려면 프로그래머의 역량이 굉장히 중요합니다.


▲ 머 이런느낌?



## C++ Class 와 vs C언어의 Struct +Function 관계

앞에서 "클래스 == 구조체+함수" 이렇게 말씀 드렸습니다.
클래스를 알기전에 C언어에서의 "구조체와 함수"가 어떻게 클래스와 비슷한지 보여드리겠습니다.

4단계를 거쳐서 진행되므로 천천히 변화과정을 살펴봐주세요 

이것만 하나 알고가시죠
C++ 에서는 C와 다르게 구조체가 조금 변하였다는 것을요.

# C에서의 구조체 C++에서의 구조체

나이:25
이름:코리훈
계속하려면 아무 키나 누르십시오 . . .


▲C언어에서는 구조체를 선언할때 앞에 항상 struct를 붙였었죠....

붙이지 않았을때는 컴파일 오류가 발생했었습니다.


그러나 C++에서는 구조체를 선언할 때 

struct를 생략하여도 된다는점.. 좋죠!!!!



+이외에 별다른 구조체에 관한 설명은 생략합니다.


1.[C++]구조체 활용

▲ 1번째 방법

기본적으로 구조체를 활용하여 출력하는 방법입니다. 


설명없이 넘어가겠습니다.


2. [C++} 피호출자 함수에게 구조체 전달 

▲2번째 방법

함수를 만들어서 구조체 포인터를 받도록 매개변수를 선언하였습니다.


UserDataPrint() 함수를 호출하기 위해서 사용자는 단지 구조체의 주소만 넘겨주면 됩니다.


나이 : 25 // 이름 코리훈
계속하려면 아무 키나 누르십시오 . . .


3. [C++] 구조체 안에서 함수 포인터

▲3번째 방법

7번행을 보시면 구조체 안에서 함수포인터 형태를 취하고 있습니다.

 7번행 void(*Print)(struct USERDATA *);   함수의 형태를 그대로 받아왔습니다.


 15번행_tmain()함수에서는 

u 함수포인터 맴버Print() 에 u구조체의 주소를 넘겨줍니다.


그런데 여기서 조금 웃긴 부분이 있습니다.


  u.Print(&u);  

자신의 맴버를 사용하는데, 자신의 주소를 몰라 주소를 물어본다는 것이 이상하지 않습니까?

이 말은 내 집을 가는데 네비게이션을 켜고 가는 것과 다름없다는 것이죠.

혹은 

누군가의 자식이라고 하는데, 부모의 이름을 모르는 격이죠.


4번째 방법에서 이를 해결하는 광경을 보실수 있을 것입니다.



이제는 조금 Class에 다가가고 있어 보입니다.

나이 : 25 // 이름 코리훈

계속하려면 아무 키나 누르십시오 . . .

4. [C++] C++ 스타일로 구조체 안의 함수포인터 사용


▲4번째 방법

함수호출만 본다면 


21번행의 방법이 

딱 C++ 스러운 문법입니다.  

그렇다면 C++ 스러운 방법을 한 번 연출 해볼까요?


C++에서는 구조체에 함수를 넣어도 작동이 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include <iostream>
struct USERDATA{
    int nAge;
    char szName[32];
    
    void UserDataPrint(USERDATA *pu){
        printf("나이: %d // 이름: %s\n", pu->nAge, pu->szName);
    }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    USERDATA u = { 25"코리훈"};
    u.UserDataPrint(&u);
    return 0;
}
 
cs
▲ 이게 실행이 된다고?? 
정답은 예스입니다. 
그렇다면 15번 행을 C++ 스럽게 작성해볼까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include <iostream>
struct USERDATA{
    int nAge;
    char szName[32];
    
    void UserDataPrint(USERDATA *pu){
        printf("나이: %d // 이름: %s\n", pu->nAge, pu->szName);
    }
 
    void UserNewDataPrint(){
        printf("나이: %d // 이름: %s\n", nAge,szName);
    }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    USERDATA u = { 25"코리훈"};
    u.UserDataPrint(&u);
    u.UserNewDataPrint();
    return 0;
}
cs
▲ 그렇다면 이렇게!!
잘 작동 합니다.

11번 행과 20번 행처럼 진행하는 것이 C++스럽다고 표현 할 수 있습니다.

Class는 이와 정말 유사하다고 보시면 됩니다.


C++에서는 20번행 처럼 매개변수가 생략되어있는 것 같지만 메모리를 뜯어보면 주소를 전달합니다.


디버거 모드로 살펴보면 7번행과 11번행에서 같은 주소를 호출한다는 점을 포착 할 수 있을 것입니다.


### Class의 기본 문법 (쉬워용)

앞의 내용들을 이해하셨다면 클래스도 쉽게 이해하실 수 있으실 것입니다.

클래스형태

class 클래스명

{

 접근제어지시자:

맴버변수선언;

맨버함수선언 및 정의;

};


클래스 기본문법 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include <iostream>
class USERDATA{
public:
    int nAge;
    char szName[32];
    
    void UserDataPrint(){
        printf("나이: %d // 이름: %s\n", nAge, szName);
    }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    USERDATA u = { 24"코리훈" };
    u.UserDataPrint();
 
    return 0;
}
cs
▲앞전의 구조체와 크게 다른점이 없죠??

4번 행은 접근제어지시자 라 하여, 프로그래머가 사용자의 접근을 어느정도 제한하기위하여 사용되는 문법입니다.
8번 행에서는 함수가 있는데 C/C++에서는 이를 Method(메서드) 라 부릅니다.
9번 행에서 보면 nAgeszName은 함수내부의 지역변수가 아니라 5번행과 6번행을 가리키고 있습니다. 
메모리를 보시면 내부적으로 USERDATA 를 가르키고 있다는 것을 알 수 있습니다.



결론적으로 C/C++ 에서의 Class는 C언어 에서의 "구조체+함수+ ∂(상속,접근제어지시자)" 라고 할 수 있겠습니다.


반응형

댓글