본문 바로가기
프로그래밍 언어/C++

C++ 3단원 복습! (1편)

by 조엘 2020. 3. 12.

안녕하세요. 파피몬입니다.

 

이 복습 내용은 최호성 선생님의 "이것이 C++이다"를 공부하고 작성하였습니다. 

아직 모르는 게 많은 학생이라 오개념이 있을 수 있습니다. 친절하게 댓글로 알려주시면 좋은 공부 될 것 같습니다!!

3단원에서는 클래스에 대해서 배워봅니다. 1편, 2편으로 나누어져 있습니다.

 

Chapter 3. 클래스

 

1. 절차지향의 C언어에서의 자료구조와 그 자료구조를 사용하는 코드(함수)는 서로 의존성이 있습니다. 자료구조가 바뀐다면 함수도 바뀌어야 하죠. 여기서 문제는 자료구조의 사용자가 자료구조를 만든 제작자만큼의 지식을 필요로 한다는 것입니다. 이를 탈피하고자 제작자에게 더 큰 임무를 줍니다. 사용자 친화적으로 자료구조를 구현하는 것이지요. 단계별 예시를 통해 점점 사용자 친화적인 코드를 작성해 봅시다. 

//1단계
#include<stdio.h>

//제작자
typedef struct USERDATA{
    int nAge;
    char szName[32];
} USERDATA;

//사용자
int main()
{
    USERDATA user = {20, "파피몬"};
    //user에 어떤 형식으로, 어떤 변수가 저장되어 있는지 사용자가 다 알아야함!
    printf("%d, %s\n", user.nAge, user.szName);

	return 0;
};

 

//2단계
#include<stdio.h>

//제작자
typedef struct USERDATA{
    int nAge;
    char szName[32];
} USERDATA;

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

//사용자
int main()
{
    USERDATA user = {20, "파피몬"};
    //이제 내가 user에 해당하는 변수와 자료형까진 몰라도 되겠군!
    //근데 USERDATA 구조체랑 PrintData 함수는 뭔상관이여?
    PrintData(&user);
    
    return 0;
};

 

//3단계
#include<stdio.h>

//제작자
typedef struct USERDATA{
    int nAge;
    char szName[32];
    //구조체와 함수의 연결관계!
    void(*Print)(struct USERDATA *);
} USERDATA;

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

//사용자
int main()
{
    USERDATA user = {20, "파피몬", PrintData};
    //오! 좀 직관적이네! 구조체에 선언된 Print함수 통해 선언!
    //근데 내가 스스로 내 주소를 parameter로 넘겨줘야해?
    user.Print(&user);
    
    return 0;
};

3단계 이후의 레벨은 C++의 영역입니다! 3단계에서의 함수 호출을 user.Print( )로 쓸 수 있어요. 하지만 매개변수를 작성해주지 않는다고 없는것은 아닙니다. 3단계에서 처럼 &user를 넘겨주는데 C++에서는 이를 감추어 hidden parameter라고 합니다. 이는 this 포인터와도 연관이 깊습니다. 

 

 

2. 이제 클래스를 도입합니다. 클래스를 C언어스럽게(?) 표현한다면 구조체+함수+접근제어+상속 정도로 표현할 수 있습니다. 

//CLASS 문법
class 클래스 이름
{
접근제어지시자:
    멤버변수 선언:
    멤버함수 선언 및 정의:
};

 

//4단계 클래스
#include<cstdio>

//제작자
class USERDATA
{
public:
    int nAge;
    char szName[32];

    void Print()
    {
        //nAge와 szName은 멤버변수에 접근하는 것을 볼 수 있다
        printf("%d, %s\n", nAge, szName);
    }    
} 


//사용자
int main()
{
    USERDATA user = {20, "파피몬"};
    user.Print();
    
    return 0;
};

 

 

3. 구조체는 통제 기능이 없습니다. 자유도가 높지요. '멤버 변수 초기화' 같은 중요한 일을 온전히 사용자에게 맡겼습니다. 이 위험을 해결하기 위해 클래스는 생성자를 만들었습니다. 클래스의 인스턴스를 만들면 자동 호출되는 함수이며,  코드관리에 유리함을 줍니다. 또한 소멸자도 있습니다. 이 함수는 클래스의 인스턴스가 소멸될 떄 자동으로 호출되는 함수입니다. 이 둘은 사용자가 만들지 않아도 컴파일러가 알아서 만들어 줍니다. 

#include<iostream>
using namespace std;

class CTest
{
public:
    CTest()
    {
        cout<<"CTest::CTest()"<<endl;
    }
    
    ~CTest()
    {
        cout<<"CTest::~CTest()"<<endl;
    }
};

int main()
{
    cout<<"Begin"<<endl;
    CTest a;
    cout<<"End"<<endl;
    
    return 0;
}

--------------------
Begin
CTest::CTest()
End
CTest::~CTest()

 

 

4. C언어에서는 main( )함수가 무조건 시작점이지만, C++에서는 main( )함수 보타 특정 클래스의 생성자가 먼저 호출될 수도 있습니다. 

반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ 4단원 복습! (2편)  (0) 2020.03.15
C++ 4단원 복습! (1편)  (0) 2020.03.14
C++ 3단원 복습! (2편)  (0) 2020.03.12
C++ 2단원 복습!  (0) 2020.03.11
C++ 1단원 복습!  (0) 2020.03.10

댓글