Programming/C C++
Class를 구현하고 사용할때는 원한다면 하나의 .cpp Source File에 모두 담아두고 사용할 수 있습니다.

그러나 Class는 OOP(Object Oriented Programming)의 기본 개념중의 하나인 "재사용"을 위해 개별적으로 Class를 분리한 후 Compile하는 경우가 많습니다.

C++에서는 이와같은 구현을 위해 Class의 선언부분을 별도의 Header File에 두고 Class의 함수구현 부분을 .cpp Source File에 저장합니다. 그리고 나중에 이들을 결합하여 Compile하게 되는 것입니다.

#ifndef _EXAM
#define _EXAM

class exam{
  private:
    char name[15];
    int kuk;
    int mat;
    int eng;
 
  public:
    void name_input(char *nm);
    void memberprint();
   
    int kuk_input(int pt);
    int mat_input(int pt);
    int eng_input(int pt);
};
#endif


Class의 선언부분을 .h로 저장합니다.(예제에서는 위 Class를 exam.h로 저장하였습니다.)

위 Code에서 #ifndef전처리기는 조건부 Compile을 위해 추가된 내용입니다. 이 전처리기가 필요한 이유는 위 exam.h Header File선언이 아래 exam.cpp와 test.cpp에 동시에 이루어 지는데 이렇게 되면 결국 exam.cpp에서도 test.cpp에서도 같은 Header File의 내용을 추가시키게 됩니다. 따라서 이런 낭비적인 일을 막기위해 위 구문이 필요한 것입니다.

여기에서 #ifndef _EXAM 구문은 Program에서 _EXAM이 정의되어 있지 않으면 #ifndef부터 #endif부분까지 모든 내용을 처리하라는 뜻입니다.

결국 최초로 exam.h File을 불러올때는 _EXAM이 정의되어 있지 않으므로 위 Header File을 실행하게 되고 이때 #define _EXAM도 같이 처리하게 됩니다.(즉, _EXAM을 정의하게 됩니다.)

이 후 두번째로 exam.h을 불러들이면 첫번째 실행때에 이미 #define _EXAM을 통해 _EXAM을 정의하였으므로 또 다시 #ifndef부터 #endif까지(exam.h에서 실제 Class정의부분)는 실행되지 않게 되는 것입니다.

#include "exam.h"
#include <iostream.h>
#include <string.h>

void exam::name_input(char *nm)
{
  strcpy(name, nm);
}

int exam::kuk_input(int pt)
{
  int ptp = pt;
 
  if (pt >= 90)
    ptp = pt + 3;
 
  kuk = pt;
 
  return ptp;
}

int exam::mat_input(int pt)
{
  int ptp = pt;
 
  if (pt >= 90)
    ptp = pt + 3;
 
  mat = pt;
 
  return ptp;
}

int exam::eng_input(int pt)
{
  int ptp = pt;
 
  if (pt >= 90)
    ptp = pt + 3;
 
  eng = pt;
 
  return ptp;
}

void exam::memberprint()
{
  cout << "학생이름 : " << name << endl << endl;
  cout << "국어점수 : " << kuk << endl;
  cout << "수학점수 : " << mat << endl;
  cout << "영어점수 : " << eng << endl;
}


Class의 실제 정의부분을 .cpp로 저장합니다.(여기서는 위 내용을 exam.cpp로 저장하였습니다.)

exam.cpp에서는 exam.h에서 정의된 Class의 실제 구현부분이므로 #include "exam.h"을 통해 해당 Class가 있는 Hader File을 추가시켜야 합니다.(이때 exam.h File은 같은 경로(Directory 또는 Folder)에 위치해 있어야 하며 다른 경로에 존재한다면 해당 경로까지 포함시켜서 작성해야 합니다.)

#include "exam.h"
#include <iostream.h>

main()
{
  exam student;
 
  int kukp;
  int matp;
  int engp;
 
  student.name_input("youngsoo");
 
  kukp = student.kuk_input(80);
  matp = student.mat_input(91);
  engp = student.eng_input(94);
 
  student.memberprint();

  cout << "국어점수(가산) : " << kukp << endl;
  cout << "수학점수(가산) : " << matp << endl;
  cout << "영어점수(가산) : " << engp << endl;
 
  return 0;
}


여기서도 마찬가지로 Class가 정의된 Header File의 선언이 필요합니다.

이렇게 Program을 작성하면 Class가 실제 구현된 cpp File을 Compile하여 후 obj로 만들어야 합니다. 그런다음 생성된 Obj와 실제 Program부분을 결합하여 하나의 exe를 생성하면 됩니다.

물론 Source끼리 한번에 Compile해도 obj를 생성하는것은 마찬가지 입니다.

이 경우 Class의 선언부분(exam.h)과 Class의 정의부분(exam.cpp)을 분리하지만 이는 관리의 용이성을 위한 것일뿐 exam.h에 모두 담아 처리하여도 큰 문제는 발생하지 않는 것입니다.

#include <iostream.h>
#include <string.h>

#ifndef _EXAM
#define _EXAM
class exam{
  private:
    char name[15];
    int kuk;
    int mat;
    int eng;
 
  public:
    void name_input(char *nm);
    void memberprint();
   
    int kuk_input(int pt);
    int mat_input(int pt);
    int eng_input(int pt);
};

void exam::name_input(char *nm)
{
  strcpy(name, nm);
}

int exam::kuk_input(int pt)
{
  int ptp = pt;
 
  if (pt >= 90)
    ptp = pt + 3;
 
  kuk = pt;
 
  return ptp;
}

int exam::mat_input(int pt)
{
  int ptp = pt;
 
  if (pt >= 90)
    ptp = pt + 3;
 
  mat = pt;
 
  return ptp;
}

int exam::eng_input(int pt)
{
  int ptp = pt;
 
  if (pt >= 90)
    ptp = pt + 3;
 
  eng = pt;
 
  return ptp;
}

void exam::memberprint()
{
  cout << "학생이름 : " << name << endl << endl;
  cout << "국어점수 : " << kuk << endl;
  cout << "수학점수 : " << mat << endl;
  cout << "영어점수 : " << eng << endl;
}
#endif

0 0