C++ 언어는 C언어와 달리 객체지향(obeject oriented) 언어이다.
C++ 언어에서 클래스(class) 라고 하는 것은 C 언어의 구조체(struct) 개념을 확장한 것이다.
C 언어의 구조체(struct)는 자료(데이터)만 가질 수 있지만, C++ 언어의 클래스(class)는 자료 뿐만이 아니라 자료를 핸들링하는 메소드도 가질 수 있다.
메소드란 클래스에 소속된다는 것이 C 언어의 함수와 구별된다.

클래스 변수를 선언험과 동시에 클래스에 속한 자료와 메소드는 동적으로 로딩되어 힙(heap)이라는 메모리에 탑재된다.

C 언어의 구조체 정의 구문 양식:
  struct 구조체명 {
      타입 변수명1;
      타입 변수명2;
          ...........
      타입 변수명n;
};

C++ 언어의 클래스 정의 구문 양식:
  class 클래스명 {
     접근유형1:    // 접근 유형은 public, protected, procate 등
        타입 변수명1;
             ...........
        타입 변수명n;
        타입 함수명1;
             ...........
        타입 함수명n;

     접근유형2:
        타입 변수명1;
             ...........
        타입 변수명n;
        타입 함수명1;
             ...........
        타입 함수명n;
};



소스 파일명: forTestObject.cpp
------------------------------[소스 시작]
#include <iostream.h>

class ForTestObject {
  public:
    ForTestObject();   // 생성자
    ~ForTestObject();   // 소멸자
    void printDan(int dan);
};      // 클래스 정의 구문은 반드시 세미콜론(;)으로 끝나야 한다.

// 생성자 정의
ForTestObject::ForTestObject() {
}

// 소멸자 정의
ForTestObject::~ForTestObject() {
}

// printDan() 함수 정의
void ForTestObject::printDan(int dan) {
  int i;
  for (i = 1; i < 10; i++) {
    cout << dan << " x " << i << " = " << (dan*i) << endl;
  }
}

// main 함수
void main() {
  ForTestObject test;
  test.printDan(2);
}
------------------------------[소스 끝]

위의 소스에서 endl 은 C 언어의 개행 문자 "\n"에 해당한다.
컴파일은 Visual C++ 6.0을 써서 한다.

컴파일> cl forTestObject.cpp

(참고: 에러 없이 컴파일이 순조롭게 끝나면 현재 디렉토리에 forTestObject.obj라는 목적 파일과 forTestObject.exe라는 살행 파일이 존재할 것이다.)

실행> forTestObject
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18


확장자명이 cpp인 소스도 (컴파일 과정 없이) Ch에 의하여 직접 실행된다.

Command> ch forTestObject.cpp
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18


위의 소스는 표준화되기 전의 C++ 소스이다. 1998년에 정해진 C++표준화에 따르면 헤더 파일 포함 구문이

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

으로 부터

        #include <iostream>
        #include <string>
        #include <cmath>
        등

으로 변경되었다. 이렇게 변경해야 표준 C++에서 printf 등을 쓸 수 잇다. 하지만 cout, cin 등은 std::cout, std::cin 등으로 써야 한다. 이것이 불편하다면 헤더 파일 포함(include) 구문이 끝난 후

        using namespace std;

라는 한 줄만 추가하면 된다.
(내부 참고:  C 유저를 위한 C++ 팁 모음)
(상세 외부 참고: 방법: 표준 C++ 프로그램 만들기)
    
다음 소스는 forTestObject.cpp 를 표준 C++에 따라 재작성한 소스이다.


소스 파일명: forTestObject2.cpp
------------------------------[소스 시작]
#include <iostream>

using namespace std;

class ForTestObject {
  public:
    ForTestObject();   // 생성자
    ~ForTestObject();  // 소멸자
    void printDan(int dan);
};      // 클래스 정의 구문은 반드시 세미콜론(;)으로 끝나야 한다.

// 생성자 정의
ForTestObject::ForTestObject() {
}

// 소멸자 정의
ForTestObject::~ForTestObject() {
}

// printDan() 함수 정의
void ForTestObject::printDan(int dan) {
  int i;
  for (i = 1; i < 10; i++) {
    cout << dan << " x " << i << " = " << (dan*i) << endl;
  }
}

// main 함수
void main() {
  ForTestObject test;
  test.printDan(2);
}
------------------------------[소스 끝]

컴파일은 Visual C++ 6.0을 써서 한다.

컴파일> cl /GX forTestObject2.cpp
   (또는) cl -GX forTestObject2.cpp
   (또는) cl /EHsc forTestObject2.cpp
   (또는) cl -EHsc forTestObject2.cpp

(실행 결과는 위와 같다.)

이 소스도 (컴파일 없이) 직접 Ch로  실행된다.

Command> ch forTestObject2.cpp
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18



Linux(또는 Unix) 플랫폼에서 gcc나 g++gh 컴파일 하는 경우라면 main 함수만 다음 처럼 수정하면 된다. Linux(또는 Unix) 플랫폼의 경우에는 C++ 소스의 확장명을 보통 cc로 한다. 따라서 소스 파일명을 forTestObject2.cc로 저장하여 컴파일한다.

// main 함수
int main() {
  ForTestObject test;
  test.printDan(2);
  return 0;
}

컴파일> gcc -o forTestObject2 forTestObject2.cc
   (또는) g++ -o forTestObject2 forTestObject2.cc

실행> ./forTestObject2
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18



다음 예제는 namespace std 를 사용하지 않은 C++ 소스이다.
이 경우에는 cout, cin, endl 대신에 정규화된 이름 std::cout, std::cin, std:endl을 써야 한다.
(참고: 정규화된 이름을 사용한 다음 소스는 Ch 5.5로는 실행되지 않는다.)

소스 파일명: forTestObject3.cpp
------------------------------[소스 시작]
#include <iostream>

class ForTestObject {
  public:
    ForTestObject();   // 생성자
    ~ForTestObject();  // 소멸자
    void printDan(int dan);
};      // 클래스 정의 구문은 반드시 세미콜론(;)으로 끝나야 한다.

// 생성자 정의
ForTestObject::ForTestObject() {
}

// 소멸자 정의
ForTestObject::~ForTestObject() {
}

// printDan() 함수 정의
void ForTestObject::printDan(int dan) {
  int i;
  for (i = 1; i < 10; i++) {
    std:cout << dan << " x " << i << " = " << (dan*i) << std::endl;
  }
}

// main 함수
void main() {
  ForTestObject test;
  test.printDan(2);
}
------------------------------[소스 끝]

컴파일> cl /GX forTestObject3.cpp
   (또는) cl -GX forTestObject3.cpp
   (또는) cl /EHsc forTestObject3.cpp
   (또는) cl -EHsc forTestObject3.cpp

(실행 결과는 위와 같다.)





Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,