본문 바로가기

Programming Languages/C++

클래스

C언어의 구조체(struct)는 프로그램으로 표현하고자 하는 대상에 대한 데이터의 구조만을 정의하고 있다. 그런데 이러한 대상은 데이터만으로 존재하는 것이 아니라 그 대상에 대해 행할 수 있는 여러 가지 동작이 함께 존재한다. C++ 언어의 클래스(class)는 표현하고자 하는 대상의 데이터와 함께 이에 대해 필요한 여러 가지 동작을 나타내는 함수들을 묶어 놓은 것이다. 클래스에서는 외부에 공개할 필요가 없는 것과 공개할 것을 구분한다. 보통 구현을 위한 세부 사항에 대한 것은 공개할 필요가 없으며, 클래스의 객체를 사용하는 데 필요한 함수들을 공개하여 그 함수를 통해서만 객체를 사용할 수 있도록 하는 것이 일반적이다.

앞서 작성한 구조체를 사용하여 원을 구하는 코드를 클래스를 이용하여 다시 작성해 보기로 하자.

#include <iostream>
#include <cmath> // sqrt함수 사용(제곱근의 함수)
using namespace std;

const double PI = 3.141593;

struct C2dType { // 2차원 좌표 구조체
    double x, y;
};

class CircleClass { // 원 클래스
    C2dType center;   // 중심좌표
    double radius;    // 반경

public:
    // 중심 (cx,cy), 반경 r로 원을 초기화
    void init(double cx, double cy, double r) {
        center.x = cx;
        center.y = cy;
        radius = r;
    }
    // 원 면적 계산
    double area() const {
        return radius * radius * PI;
    }
    bool chkOverlap(const CircleClass& c) const {
        double dx = center.x - c.center.x;
        double dy = center.y - c.center.y;
        double dCntr = sqrt(dx * dx + dy * dy);
        return dCntr < radius + c.radius;
    }
    // 원 객체의 정보 디스플레이 
    void display() const {
        cout << "중심 : (" << center.x << ", " << center.y << ")";
        cout << "반경 : " << radius << endl;
    }
};

int main() {
    CircleClass c1, c2;
    c1.init(0, 0, 10); // 중심(0,0), 반경10으로 초기화
    c2.init(30, 10, 5); // 중심(30,10), 반경5로 초기화

    cout << "원1" << endl;
    c1.display();
    cout << "원1의 면적 : " << c1.area() << endl;
    cout << "원2" << endl;
    c2.display();
    cout << "원2의 면적 : " << c2.area() << endl;

    // 두원의 중첩 여부 출력
    if (c1.chkOverlap(c2))
        cout << "두 원은 중첩됩니다" << endl;
    else
        cout << "두 원은 중첩되지 않습니다" << endl;
    return 0;
}

 

public: 이라는 표현은 이 이후에 나열된 함수들을 클래스의 외부 루틴에서 사용할 수 있다는 의미이다. 이 클래스의 객체를 사용하는 외부 루틴들은 이 함수들을 통해서만 해당 객체 내의 데이터를 활용할 수 있다. 즉 CirclClass의 객체는 데이터가 객체 내에 가려 있어 외부에 공개된 인터페이스인 initarea, chkOverlap, display라는 함수들을 통해서만 액세스할 수 있다. 이와 같이 클래스의 데이터를 캡슐화함으로써 외부에서 임의로 수정하는 것을 방지할 수 있다.

CircleClass의 객체 c1과 c2를 선언하고 있다. 기본 자료형이나 구조체에 해당되는 값을 저장하는 공간은 변수라고 부르나 클래스에 해당되는 공간에 대해서는 객체(object)라고 부른다. 객체에 대해서도 구조체 변수와 같이 점 표기법을 이용하여 구성요소들을 액세스한다. 

구조체와 클래스의 문법적 차이 

사실 C 언어에서와는 달리 C++ 언어에서는 구조체에 대해서도 클래스처럼 함수를 함께 정의할 수 있다. 문법적으로 약간의 차이는 있다. 예를 들어 특별히 지정하지 않은 경우 구조체에서는 모든 데이터나 함수가 공개되나, 클래스에서는 공개되지 않는다. 이러한 차이점에도 불구하고 문법적으로는 구조체나 클래스를 같은 용도로 쓸 수 있다. 그러나 대상물의 데이터만을 표현하고자 할 때에는 구조체를, 데이터와 함수를 함께 묶어 정의하고자 할 때에는 클래스를 사용하는 것이 일반적이다.

'Programming Languages > C++' 카테고리의 다른 글

포인터  (0) 2020.05.06
배열  (0) 2020.04.30
구조체  (0) 2020.04.23
흐름제어 구문  (0) 2020.04.20
자료형의 변환  (0) 2020.04.17