티스토리 뷰

C++ << C & Java

C++ 클래스 맛보기

plas 2019. 3. 28. 15:35

 C++ 프로그램은 사실 C 프로그램과 다를 바 없다. 그냥 확장자를 cpp로 바꾸어 C 프로그램 그대로 C++ 프로그램이라고 해도 컴파일이 잘 된다. 그러나 C++ 프로그램다우려면  클래스가 필요하다. 여기서는 간단한 클래스 프로그램을 한번 만들어보겠다. C++ 프로그램은 C처럼 파일 안에 전역변수와 함수가 나올 수 있고 반드시 main() 함수를 가져야 한다. 또한 클래스 선언부가 나올 수 있다. 다음과 같이 하나의 파일에 모두 모여있다면 자바와 비슷하게 생긴 클래스가 나오고 그것을 사용하는 main 함수가 나오게 된다.

여기서 주의할 점은 class 선언부 뒤에 ;(세미콜론)이 있어야 한다는 점이다. 그런데 좀 이상한 일이지만 void read() { ... } 다음에는 세미콜론이 필요하지 않다. 이것을 인터넷에서는 class 선언은 문장이고 함수 정의부는 문장이 아니다 라고 설명하고 있다. 좀 이상하지만 어쨌거나 우리가 C 함수 뒤에 세미콜론을 붙이지 않듯이 여기서도 안 붙이는 것이라고 볼 수 있겠다. 세미콜론을 붙여도 컴파일러가 뭐라 하진 않는다.

#include <iostream>
using namespace std;
class Student {
    char name[20];
    int year;
    int score[3];
public:
    void read() {
    	cin >> name >> year;
        for (int i = 0; i < 3; i++)
        	cin >> score[i];
    }
    void print() {
    	cout << name << " " << year << "학년 ";
        for (int i = 0; i < 3; i++)
        	cout << score[i] << " ";
        cout << endl;
    }
};
int main() {
    Student list[10];
    int n;
    cout << "학생 수: ";
    cin >> n;
    for (int i = 0; i < n; i++)
    	list[i].read();
        list[i].print();
    }
    system("PAUSE");
    return 0;
}

클래스 부분에서 자바와 다른 점은 public: 이라는 키워드의 사용이다. C++에서는 멤버변수(자바의 필드)와 멤버함수(자바의 메소드)에 대해 디폴트로 private을 가정한다. public: 이라는 표시 뒤에 나오는 것은 모두 public이다. 또한 그 뒤에 private:이라는 표시가 나오면 그 다음에 나오는 선언은 모두 private이 된다.

또하나 자바와 C++의 큰 차이가 Student list[10]이라는 배열에서 나타난다. 자바에서는 배열을 new해야 할 뿐아니라 각 배열 요소를 따로 전부 new해야 한다. 배열 자체도 참조고 배열 요소도 참조다. 그것은 코딩도 불편할 뿐더러 주소 참조에 의한 접근에서 두 번의 load를 필요로 해서 성능상으로도 손해가 크다. C++에서 이 한 문장은 Student 객체 10개를 그 자리에 바로 생성하는 효과를 낸다. 그것은 스택 영역에 잡힐 것이고 list[i] 자체로 객체를 나타낸다. 이것은 객체 배열을 클래스에 대한 포인터 배열과 비교하여 보아야 하는데 나중에 다시 살펴보겠다. C++은 클래스 변수의 선언이 곧 객체의 생성이라는 점이 자바와 아주 큰 차이다.

위의 C++ 파일 구조가 이해가 되었다면 이번에는 좀더 C++ 다운 구조로 바꿔보자. C++은 클래스 헤더라는 것을 따로 둔다. 함수의 코드를 갖지 않고 멤버 변수와 멤버 함수의 선언부만 가진 것을 헤더라고 한다.

#include <iostream>
using namespace std;
class Student {
    char name[20];
    int year;
    int score[3];
public:
    void read();
    void print();
};
void Student::read() {
 	cin >> name >> year;
    for (int i = 0; i < 3; i++)
      	cin >> score[i];
}
void Student::print() {
  	cout << name << " " << year << "학년 ";
    for (int i = 0; i < 3; i++)
       	cout << score[i] << " ";
    cout << endl;
}
int main() {
    Student list[10];
    int n;
    cout << "학생 수: ";
    cin >> n;
    for (int i = 0; i < n; i++)
    	list[i].read();
        list[i].print();
    }
    system("PAUSE");
    return 0;
}

이것은 class Student의 선언부와 멤버 함수의 구현부를 분리한 것이다. 그럼 멤버 함수 부분은 main() 함수와 같은 형태로 그냥 일반 함수의 자리에 나오게 된다. 그래서 그것이 Student 클래스의 멤버임을 나타내기 위해 Student:: 이라는 한정자를 붙였다. Student::이 붙은 함수는 이 클래스의 멤버 함수로 그 안에서는 this가 자신을 나타내는 객체의 포인터가 된다.

이번에는 파일을 분리해 보자. C++ 프로그램은 여러 개의 헤더(.h)와 여러 개의 소스 파일(.cpp)로 이루어질 수 있다. 클래스의 선언부를 가진 것을 클래스 헤더라고 하고 student.h라는 이름을 붙일 수 있다. 한편 멤버함수 구현부만 모인 파일을 student.cpp라고 이름 붙일 수 있다. 이것들을 이용하는 함수들의 모임을 main.cpp라고 할 수 있을 것이다.

========== student.h ============
class Student {
    char name[20];
    int year;
    int score[3];
public:
    void read();
    void print();
};
========== student.cpp ============
#include <iostream>
#include "student.h"
using namespace std;
void Student::read() {
 	cin >> name >> year;
    for (int i = 0; i < 3; i++)
      	cin >> score[i];
}
void Student::print() {
  	cout << name << " " << year << "학년 ";
    for (int i = 0; i < 3; i++)
       	cout << score[i] << " ";
    cout << endl;
}

========== main.cpp =============
#include <iostream>
#include "student.h"
using namespace std;
int main() {
    Student list[10];
    int n;
    cout << "학생 수: ";
    cin >> n;
    for (int i = 0; i < n; i++)
    	list[i].read();
        list[i].print();
    }
    system("PAUSE");
    return 0;
}

위와 같이 세 개의 파일로 나누면 좀더 그럴듯한 C++ 프로그램이 된다. student.h는 클래스 헤더파일이고 이 클래스의 구현 파일이나 이 클래스를 사용하는 곳에서는 모두 인클루드되어야 한다. #include "student.h"와 같이 쌍따옴표로 표시한 것을 볼 수 있다. 일반적으로 라이브러리 헤더는 꺽쇠(<>)를 쓰고 프로그램 안에서 만든 헤더는 쌍따옴표를 쓴다.

비쥬얼스튜디오에서 한개의 헤더와 두 개의 cpp 파일을 가진 프로젝트를 만든 상태는 아래 그림과 같다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함