class ABC

{

private:

int num1;


protected:

int num2;


public:

int num3;

};


int main(void)

{

ABC test;


test.num1 = 0;        ---> 접근 불가!!

test.num2 = 0;        ---> 접근 불가!!

test.num3 = 0;        ---> 접근 가능!!



return 0;

}


이런 경우 "ABC 객체를 생성했는데 왜 ABC 클래스의 멤버변수에 접근이 불가능 하지?" 라고 생각할 수 있다. 


private, protected, public 선언은 객체 기준이 아니라 클래스 기준이다!


test.num3가 접근이 가능한 이유는 ABC 객체를 생성했기 때문이 아니라 ABC 클래스의 public 키워드가 ABC 클래스를 벗어난 지역에서의 접근을 허용한다는 의미이기 때문이다.


즉 객체를 기준으로 접근 범위를 정하는게 아니라 클래스를 기준으로 접근 범위를 정한다고 이해하면 된다.


만약 ABC 클래스 외부에서 num1과 num2에 접근을 하고 싶다면 

ABC클래스의 public 선언에 num1과 num2에 접근하는 함수를 정의하면 된다.


ex)

class ABC

{

public:

int GetNum1(void)

{

return num1;

}

int GetNum2(void)

{

return num2;

}

};


그리고 상속관계의 경우


class DEF : public ABC

{

생략

}


int main(void)

{

DEF example;

example.num2;  --> 접근 불가!!

}


이렇게 접근 하는것 역시 불가능 하다.

역시 private, protected, public 선언은 객체 기준이 아니라 클래스 기준이다!

이 개념만 알고 있으면 이해가 가능하다.


C++에서 객체를 생성할때 malloc 함수를 이용하지 않고 new함수를 이용하는 이유는 아래와 같다.


C++에서는 객체가 되기 위해서 반드시 하나의 생성자가 호출되어야 한다.


malloc 함수는 클래스의 바이트 단위 크기만 전달되기 때문에 생성자가 호출 될리가 없다.


 



screenOut.h 


#ifndef __SCREENOUT_H__

#define __SCREENOUT_H__


#include "cusInfo.h"

#include "dvdInfo.h"


void ShowMenu(void);

void ShowCustomerInfo(cusInfo * pCus);

void ShowCustomerInfoContinue(cusInfo * pCus);

void ShowDVDInfo(dvdInfo * pDVD);

void ShowGenre(int gen);


#endif




dvdManager.h


#ifndef __DVDMGR_H__

#define __DVDMGR_H__


void RegistDVD(void);

void SearchDVDInfo(void);


void RentDVD(void);

void ReturnDVD(void);

void ShowDVDRentAllCusInfo(void);


#endif



dvdInfoAccess.h 


#ifndef __DVDACCESS_H__

#define __DVDACCESS_H__


#include "dvdInfo.h"


int AddDVDInfo(char * ISBN, char * title, int genre);

dvdInfo * GetDVDPtrByISBN(char * ISBN);

int IsRegistISBN(char * ISBN);


/* 추가된 함수들의 선언 */

int SetDVDRented(char * ISBN, char * cusID, int rentDay);

int SetDVDReturned(char * ISBN);

int GetDVDRentState(char * ISBN);


#endif



dvdInfo.h


#ifndef __DVDINFO_H__

#define __DVDINFO_H__


#include "cusInfo.h"


#define ISBN_LEN   30

#define TITLE_LEN  30

#define RENT_LEN  100


enum {ACTION=1, COMIC, SF, ROMANTIC};    // 장르 정보

enum {RENTED, RETURNED};    // 대여 상태를 나타내는 상수!


/* 반납일등 추가할 정보 많지만 간략히! */

typedef struct __dvdRentInfo 

{

    char cusID[ID_LEN];    // 대여 고객 ID

    unsigned int rentDay;    // 대여일

} dvdRentInfo;


typedef struct __dvdInfo 

{

    char ISBN[ISBN_LEN];

    char title[TITLE_LEN];

    int genre;


    int rentState;

    int numOfRentCus;

    dvdRentInfo rentList[RENT_LEN];

}dvdInfo;


#endif


cusManager.h

 


#ifndef __CUSMGR_H__

#define __CUSMGR_H__


void RegistCustomer(void);

void SearchCusInfo(void);


#endif


cusInfoAccess.h


#ifndef __CUSACCESS_H__

#define __CUSACCESS_H__


#include "cusInfo.h"


int AddCusInfo(char * ID, char * name, char * num);

cusInfo * GetCusPtrByID(char * ID);

int IsRegistID(char * ID);


#endif



cusInfo.h



#ifndef __CUSINFO_H__

#define __CUSINFO_H__


#define ID_LEN     10

#define NAME_LEN   30

#define PHONE_LEN  30


typedef struct __cusInfo 

{    

    char ID[ID_LEN];

    char name[NAME_LEN];

    char phoneNum[PHONE_LEN];

} cusInfo;


#endif



common.h

 

#ifndef __COMMOM_H__

#define __COMMON_H__


#include <stdio.h>

#include <stdlib.h>

#include <string.h>


#endif



screenOut.c


#include "common.h"

#include "cusInfo.h"

#include "dvdInfo.h"

#include "screenOut.h"


/* 프로그램 사용을 위한 메뉴 */

void ShowMenu(void)

{

    system("cls");   //stdlib.h

    

    printf("━━━━━ 메  뉴 ━━━━━━━ \n");

    printf(" 1. 신규가입 \n");

    printf(" 2. 고객검색 \n");

    printf("──────────────── \n");

    printf(" 3. DVD 등록 \n");

    printf(" 4. DVD 검색 \n");

    printf("──────────────── \n");

    printf(" 5. DVD 대여 \n");

    printf(" 6. DVD 반납 \n");

    printf("──────────────── \n");

    printf(" 7. DVD 대여고객 전체 조회\n");

    printf(" 8. 종료 \n");

    printf("━━━━━━━━━━━━━━━━ \n");

    printf("선택》 ");

}



/* 고객 개인의 기본 정보 출력 */

void ShowCustomerInfo(cusInfo * pCus)

{

    printf("┏━━━━━━━━━━━━━━━━ \n");

    printf("┃ ▶ ID: %s \n", pCus->ID);

    printf("┃ ▶ 이름: %s \n", pCus->name);

    printf("┃ ▶ 전화번호: %s \n", pCus->phoneNum);

    printf("┗━━━━━━━━━━━━━━━━ \n\n");

    

    getchar();

}


/* 고객 개인의 기본 정보 출력(연속 출력용) */

void ShowCustomerInfoContinue(cusInfo * pCus)

{

    printf("┏━━━━━━━━━━━━━━━━ \n");

    printf("┃ ▶ ID: %s \n", pCus->ID);

    printf("┃ ▶ 이름: %s \n", pCus->name);

    printf("┃ ▶ 전화번호: %s \n", pCus->phoneNum);

    printf("┗━━━━━━━━━━━━━━━━ \n\n");

}


/* DVD 기본 정보 출력 */

void ShowDVDInfo(dvdInfo * pDVD)

{

    printf("┏━━━━━━━━━━━━━━━━ \n");

    printf("┃ ▶ ISBN: %s \n", pDVD->ISBN);

    printf("┃ ▶ 타이틀: %s \n", pDVD->title);

    printf("┃ ▶ 쟝르:  "), ShowGenre(pDVD->genre), puts("");

    printf("┗━━━━━━━━━━━━━━━━ \n\n");

    

    getchar();

}


/* DVD의 장르 정보 출력 */

void ShowGenre(int gen)

{

    switch(gen)

    {

    case ACTION:

        fputs("액션", stdout);

        break;

    case COMIC:

        fputs("코믹", stdout);

        break;

    case SF:

        fputs("SF", stdout);

        break;

    case ROMANTIC:

        fputs("로맨스", stdout);

        break;

    }

}



main.c


#include "common.h"

#include "cusManager.h"

#include "dvdManager.h"

#include "screenOut.h"


enum{

  CUS_REGIST=1, CUS_SEARCH, DVD_REGIST, DVD_SEARCH, 

  DVD_RENT, DVD_RETURN, DVD_RENT_ALLCUS, QUIT};


int main(void)

{

    int inputMenu = 0;

    

    while(1)

    {

        ShowMenu();

        scanf("%d", &inputMenu);

        fflush(stdin);

          

        switch(inputMenu)

        {

        case CUS_REGIST:

            RegistCustomer();

            break;

        

        case CUS_SEARCH:

            SearchCusInfo();

            break;


        case DVD_REGIST:

            RegistDVD();

            break;


        case DVD_SEARCH:

            SearchDVDInfo();

            break;


        case DVD_RENT:

            RentDVD();

            break;


        case DVD_RETURN:

            ReturnDVD();

            break;


case DVD_RENT_ALLCUS:

            ShowDVDRentAllCusInfo();

            break;

        }

        

        if(inputMenu==QUIT)

        {

            puts("이용해 주셔서 고마워요~");

            break;

        }

    }    


    return 0;

}



dvdManager.c 


#include "common.h"

#include "dvdInfo.h"

#include "dvdInfoAccess.h"

#include "screenOut.h"


/* 주목하고 생각해 봐야 할 #include 선언 */

#include "cusInfoAccess.h" 


/* 함    수: void RegistDVD(void)

 * 기    능: DVD 등록. 

 * 반    환: void

 *

 */

void RegistDVD(void)

{

    char ISBN[ISBN_LEN];

    char title[TITLE_LEN];

    int genre;

    

    /* ISBN 입력 과정 */

    fputs("ISBN 입력: ", stdout);

    gets(ISBN);

    

    if(IsRegistISBN(ISBN))

    {

        puts("해당 ISBN은 이미 등록되었습니다.");

        getchar();

        return;

    }


    /* 제목 입력 */

    fputs("제목 입력: ", stdout);

    gets(title);

    

    /* 장르 입력 */

    fputs("장르 입력 (액션 1, 코믹 2, SF 3, 로맨틱 4): ", stdout);

    scanf("%d", &genre);

    fflush(stdin);


    if(!AddDVDInfo(ISBN, title, genre))

    {

        puts("정상적인 데이터 저장에 실패하였습니다.");

        getchar();

        return;

    }

    

    puts("등록이 완료되었습니다.");

    getchar();

}


/* 함    수: void SearchDVDInfo(void)

 * 기    능: ISBN을 이용한 DVD 정보 검색

 * 반    환: void

 * 

 */

void SearchDVDInfo(void)

{

    char ISBN[ISBN_LEN];

    dvdInfo * dvdPtr;

    

    /* 찾을 대상의 ISBN 입력 */

    fputs("찾는 ISBN 입력: ", stdout);

    gets(ISBN);


    dvdPtr=GetDVDPtrByISBN(ISBN); 

    if(dvdPtr==0)

    {

        puts("등록되지 않은 ISBN입니다.");

        getchar();

        return;

    }


    ShowDVDInfo(dvdPtr);

}


/* 함    수: void RentDVD(void)

 * 기    능: 고객이 DVD를 대여하는 과정 처리

 * 반    환: void

 * 

 */

void RentDVD(void)

{

    char ISBN[ISBN_LEN];

    int registDVD;

    int registCus;

    int rentSte;


    char cusID[ID_LEN];      // 대여 고객 ID

    unsigned int rentDay;     // 대여일


    // 1. 대여할 DVD ISBN 입력 및 검증.

    fputs("대여 DVD ISBN 입력: ", stdout);

    gets(ISBN);

    

    registDVD=IsRegistISBN(ISBN);

    if(registDVD==0)

    {

        puts("등록되지 않은 ISBN 입니다.");

        getchar();

        return;

    }

    

    // 2. 대여 가능한 상태인지 확인.

    rentSte=GetDVDRentState(ISBN);

    if(rentSte==RENTED)  // 대여 중이라면..

    {

        puts("대여 중이라 대여가 불가능합니다.");

        getchar();

        return;

    }

    

    // 3. 대여 절차 진행.

    puts("대여가 가능합니다. 대여 과정을 진행합니다.");

    fputs("대여 고객 ID 입력: ", stdout);

    gets(cusID);

    

    registCus=IsRegistID(cusID);

    if(registCus==0)

    {

        puts("가입 고객이 아닙니다.");

        getchar();

        return;

    }

    

    fputs("대여 날짜 입력: ", stdout);

    scanf("%u", &rentDay);

    fflush(stdin);


    SetDVDRented(ISBN, cusID, rentDay);

    puts("대여가 완료되었습니다.");

    getchar();

}



/* 함    수: void ReturnDVD(void)

 * 기    능: 고객이 DVD를 반납하는 과정 처리

 * 반    환: void

 * 

 */

void ReturnDVD(void)

{

    char ISBN[ISBN_LEN];

    int registDVD;

    int rentSte;

    

    // 1. 반납할 DVD ISBN 입력 및 검증.

    fputs("반납 DVD ISBN 입력: ", stdout);

    gets(ISBN);

    

    registDVD=IsRegistISBN(ISBN);

    if(registDVD==0)

    {

        puts("등록되지 않은 ISBN 입니다.");

        getchar();

        return;

    }    

    

    // 2. 반납이 가능한 대상인지 확인.

    rentSte=GetDVDRentState(ISBN);

    if(rentSte==RETURNED)  // 대여 가능한 상태라면

    {

        puts("대여되지 않은 DVD 입니다.");

        getchar();

        return;

    }

    

    // 3. 반납 절차 진행.

    SetDVDReturned(ISBN);

    puts("반납이 완료되었습니다.");

    getchar();

}



/* 함    수: void ShowDVDRentAllCusInfo(void)

 * 기    능: 특정 DVD 대여자 전체정보 출력.

 * 반    환: void

 * 

 */

void ShowDVDRentAllCusInfo(void)

{

    int i;

    char ISBN[ISBN_LEN];


    dvdInfo * ptrDVDInfo;

    int rentCusNum;


    dvdRentInfo * ptrDVDRentInfo;

    cusInfo * ptrCusInfo;

    

    /* 찾을 대상의 ISBN 입력 */

    fputs("찾는 ISBN 입력: ", stdout);

    gets(ISBN);

    

    ptrDVDInfo = GetDVDPtrByISBN(ISBN);

    if(ptrDVDInfo==0)

    {

        puts("존재하지 않는 ISBN 입니다.");

        getchar();

    }

    

    rentCusNum=ptrDVDInfo->numOfRentCus;

    ptrDVDRentInfo=ptrDVDInfo->rentList;

            

    for(i=0; i<rentCusNum; i++)

    {

        printf("대여일: %d \n", ptrDVDRentInfo[i].rentDay);

        ptrCusInfo=GetCusPtrByID(ptrDVDRentInfo[i].cusID);

        ShowCustomerInfoContinue(ptrCusInfo);

    }


    puts("조회를 완료하였습니다.");

    getchar();         

}


dvdInfoAccess.c


#include "common.h"

#include "screenOut.h"

#include "dvdInfo.h"

#include "dvdInfoAccess.h"


#define MAX_DVD  100


static dvdInfo * dvdList[MAX_DVD];

static int numOfDVD=0;


/* 함    수: int AddDVDInfo(char * ISBN, char * title, int genre)

 * 기    능: dvdInfo 할당 및 저장. 

 * 반    환: 성공 시 '등록된 정보의 수', 실패 시 0을 반환.

 *

 */

int AddDVDInfo(char * ISBN, char * title, int genre)

{

    dvdInfo * pDVD;

    

    if(numOfDVD>=MAX_DVD)

        return 0;  // 입력 실패


    pDVD=(dvdInfo *)malloc(sizeof(dvdInfo));

    strcpy(pDVD->ISBN, ISBN);

    strcpy(pDVD->title, title);

    pDVD->genre=genre;


    /* 추가된 기본 초기화 */

    pDVD->rentState=RETURNED;

    pDVD->numOfRentCus=0;

    

    dvdList[numOfDVD++]=pDVD;

    return numOfDVD;   // 입력 성공

}


/* 함    수: dvdInfo * GetDVDPtrByISBN(char * ISBN)

 * 기    능: 해당 ISBN의 정보를 담고 있는 변수의 포인터 반환 

 * 반    환: 등록 안된 ISBN의 경우 NULL 포인터 반환.

 *

 */

dvdInfo * GetDVDPtrByISBN(char * ISBN)

{

    int i;


    for(i=0; i<numOfDVD; i++)

    {

        if(!strcmp(dvdList[i]->ISBN, ISBN))

            return dvdList[i];

    }

    

    return (dvdInfo *)0;

}


/* 함    수: int IsRegistISBN(char * ISBN)

 * 기    능: 등록 된 ISBN인지 확인. 

 * 반    환: 등록 되었으면 1, 아니면 0 반환.

 *

 */

int IsRegistISBN(char * ISBN)

{

    dvdInfo * pDVD = GetDVDPtrByISBN(ISBN);

    

    if(pDVD==0)

        return 0;  // 가입 안된 경우.

    else

        return 1;  // 가입 된 경우.

}


/* 함    수: int SetDVDRented(char * ISBN, char * cusID, int rentDay)

 * 기    능: 대여 상태로 변경. 

 * 반    환: 성공 1, 실패 0.

 *

 */

int SetDVDRented(char * ISBN, char * cusID, int rentDay)

{

    int rentCusNum;

dvdInfo * pDVD = GetDVDPtrByISBN(ISBN);

    if(pDVD==0)

        return 0;  // 등록 안된 경우.

    

    rentCusNum=pDVD->numOfRentCus;

            

    pDVD->rentState=RENTED;

    strcpy(pDVD->rentList[rentCusNum].cusID, cusID);

    pDVD->rentList[rentCusNum].rentDay = rentDay;


    pDVD->numOfRentCus++;

    return 1;

}


/* 함    수: int SetDVDReturned(char * ISBN)

 * 기    능: 대여 가능 상태로 변경. 

 * 반    환: 성공 1, 실패 0.

 * 특이사항: 필자가 제공한 함수.

 *

 */

int SetDVDReturned(char * ISBN)

{

    dvdInfo * pDVD = GetDVDPtrByISBN(ISBN);

    

    if(pDVD==0)

        return 0;  // 등록 안된 경우.


    pDVD->rentState=RETURNED;

    return 1;

}



/* 함    수: int GetDVDRentState(char * ISBN)

 * 기    능: 현재 대여 상태 반환 

 * 반    환: 반납상태 RETURNED, 대여중 RENTED.

 *           존재하지 않는 ISBN의 경우 -1 반환.

 */


int GetDVDRentState(char * ISBN)

{

    dvdInfo * pDVD = GetDVDPtrByISBN(ISBN);


    if(pDVD==0)

        return -1;  // 등록 안된 경우.


    return pDVD->rentState;

}



cusManager.c



#include "common.h"

#include "cusInfo.h"

#include "cusInfoAccess.h"

#include "screenOut.h"


/* 함    수: void RegistCustomer(void)

 * 기    능: 신규 회원 가입. 

 * 반    환: void

 *

 */

void RegistCustomer(void)

{

    char ID[ID_LEN];

    char name[NAME_LEN];

    char phoneNum[PHONE_LEN];

    

    /* ID 입력 과정 */

    fputs("ID 입력: ", stdout);

    gets(ID);

    

    if(IsRegistID(ID))

    {

        puts("해당 ID는 사용 중에 있습니다. 다른 ID를 선택해 주세요");

        getchar();

        return;

    }


    /* 이름 입력 */

    fputs("이름 입력: ", stdout);

    gets(name);

    

    /* 전화번호 입력 */

    fputs("전화번호 입력: ", stdout);

    gets(phoneNum);

    

    if(!AddCusInfo(ID, name, phoneNum))

    {

        puts("정상적인 데이터 저장에 실패하였습니다.");

        getchar();

        return;

    }

    

    puts("가입이 완료되었습니다.");

    getchar();

}


/* 함    수: void SearchCusInfo(void)

 * 기    능: ID를 통한 회원 정보 검색

 * 반    환: void

 * 

 */

void SearchCusInfo(void)

{

    char ID[ID_LEN];

    cusInfo * cusPtr;

    

    /* 찾을 대상의 ID 입력 */

    fputs("찾는 ID 입력: ", stdout);

    gets(ID);


    cusPtr=GetCusPtrByID(ID); 

    if(cusPtr==0)

    {

        puts("존재하지 않는 ID입니다.");

        getchar();

        return;

    }


    ShowCustomerInfo(cusPtr);

}


cusInfoAccess.c


#include "common.h"

#include "cusInfo.h"


#define MAX_CUSTOMER  100


static cusInfo * cusList[MAX_CUSTOMER];

static int numOfCustomer=0;


/* 함    수: int AddCusInfo (char * ID, char * name, char * num)

 * 기    능: cusInfo 할당 및 저장. 

 * 반    환: 성공 시 '등록된 정보의 개수', 실패 시 0을 반환.

 *

 */

int AddCusInfo(char * ID, char * name, char * num)

{

    cusInfo * pCus;

    

    if(numOfCustomer>=MAX_CUSTOMER)

        return 0;  // 입력 실패


    pCus=(cusInfo*)malloc(sizeof(cusInfo));

    strcpy(pCus->ID, ID);

    strcpy(pCus->name, name);

    strcpy(pCus->phoneNum, num);


    cusList[numOfCustomer++]=pCus;

    return numOfCustomer;   // 입력 성공

}



/* 함    수: cusInfo * GetCusPtrByID(char * ID)

 * 기    능: 해당 ID의 정보를 담고 있는 변수의 포인터 반환 

 * 반    환: 등록 안된 ID의 경우 NULL 포인터 반환.

 *

 */

cusInfo * GetCusPtrByID(char * ID)

{

    int i;


    for(i=0; i<numOfCustomer; i++)

    {

        if(!strcmp(cusList[i]->ID, ID))

            return cusList[i];

    }

    

    return (cusInfo *)0;

}



/* 함    수: int IsRegistID(char * ID)

 * 기    능: 가입 된 ID인지 확인. 

 * 반    환: 가입 되었으면 1, 아니면 0 반환.

 *

 */

int IsRegistID(char * ID)

{

    cusInfo * pCus = GetCusPtrByID(ID);


    if(pCus==0)

        return 0;  // 가입 안된 경우.

    else

        return 1;  // 가입 된 경우.

}





함수마다 주석으로 기능과 반환값이 의미하는 바를 작성하는것은 좋은것 같다.






+ Recent posts