Nagie's DevStory

[CPP] 19. 클래스(Class) 본문

Programming/C++

[CPP] 19. 클래스(Class)

Nagie 2023. 10. 21. 20:48
728x90
//클래스의 예시
class Circle {
private:

    double radius;
    
public:

    Circle(double r) : radius(r) {}
    
    double getArea() {
    
        return 3.14 * radius * radius;
    }
    
};

int main() {

    Circle myCircle(5.0);
    double area = myCircle.getArea();
}

 

클래스(Class)란 객체 지향 프로그래밍(OOP)의 핵심 개념이다.

즉 C++만 가지고 있는 개념이 아니란 이야기며

이는 데이터와 데이터를 조작하는 함수를 함께 묶어둔 템플릿 또는 설계도로 생각하면 되겠다.

또한 클래스는 C의 구조체(struct)처럼 사용자 정의 데이터 유형을 만드는 방법중 하나이며

클래스 안에서 선언된 함수나 변수들을 멤버라고 부른다.

그럼, 클래스가 가지고 있는 주요 특징을 설명하겠다.

 

1. 객체 (Object)

 

객체는 클래스의 인스턴스다.

클래스로부터 생성되어 클래스에서 정의된 데이터와 함수를 가지고 있으며

이를 통해 객체가 특정 데이터를 나타내고 조작할 수 있다.

그러므로 객체는 곧 클래스의 실체를 나타내며, 프로그램에서 객체를 생성하고 사용하여 작업을 수행한다.

아래는 설명을 위해 'Circle' 클래스의 객체를 나타낸 소스 코드이다.

 'Circle' 클래스의 객체는 원의 반지름과 관련 함수를 포함하고 있으며, 원의 특성을 표현하고 조작할 수 있다.

 

class Circle {
private:

    double radius; // 멤버 변수
    
public:

    Circle(double r) : radius(r) {} // 생성자
    
    double getArea() { // 멤버 함수
    
        return 3.14159 * radius * radius;
    }
};

int main() {

    Circle myCircle(5.0); // 객체 생성
    double area = myCircle.getArea(); // 객체의 멤버 함수 호출
    // "myCircle"는 "Circle" 클래스의 객체이며, 원의 반지름과 면적을 나타내는 기능을 수행합니다.
}

 

 

2. 데이터 멤버 (Data Members)

 

클래스 내에서 데이터를 저장하는 데 사용되는 변수를 말한다.

 

 

3. 멤버 함수 (Member Functions)

 

클래스 내에서 데이터를 조작하고 상호 작용하기 위해 사용되는 함수를 말한다.

 

 

4. 캡슐화 (Encapsulation)

 

클래스의 데이터 멤버와 멤버 함수를 아무나 접근하지 못하게 제한해 데이터를 보호하는 걸 캡슐화라고 한다.

주로 getter / setter로 접근하는 객체를 보고 캡슐화가 됐다고 볼 수 있겠다.

 

 

5. 상속 (Inheritance)

 

클래스는 다른 클래스로부터 속성을 상속받거나 상속할 수 있으며

이는 코드 재사용성과 계층적 구조를 구현하기 위함이다.

 

 

6. 다형성 (Polymorphism)

 

다형성은 클래스가 다른 클래스와 상호 작용할 수 있는 기능을 말한다.

C++에서 함수 오버 로딩, 템플릿, 가상 함수 등등을 통해 구현되며

이는 일상생활에서도 간단하게 예를 들어 설명이 가능하다.

강아지와 고양이에게 울어보라고 명령하면 

강아지는 '멍멍' 고양이는 '야옹'이라고 울게 되는데

동일한 명령이라도 다른 결과를 내는 게 다형성이라고 생각하면 이해가 좀 더 편할듯하다.

 

 

7. 생성자와 소멸자 (Constructor and Destructor)

 

생성자와 소멸자는 일단 멤버 함수긴 하나 좀 특별한 멤버 함수다.

반환 값도 없고 클래스의 이름과 동일한 이름을 가지기 때문이다.

거기다 클래스를 생성할 때 사용자가 정의를 하지 않더라도 컴파일러가 묵시적으로

'디폴트 생성자'와 '디폴트 소멸자'를 생성한다. 거기다 일반 멤버 함수처럼 따로 호출해서 사용할 수도 없다.

그러면 이 둘의 역할이 궁금할 텐데 우선 생성자는 객체가 생성되는 시점에 명령을 처리하는 역할을 하며

대체로 데이터 멤버의 초기화를 수행한다. 그러므로 가급적 생성자에는 무거운 작업을 시키지 않는 게 좋으며

입력받는 파라미터가 달라질 걸 염두해서 그런지 생성자 역시 오버 로딩이 가능하다.

딱히 정해진 오버 로딩 횟수는 없지만 되도록 기본값을 지정해 오버 로딩을 많이 하지는 말자.

소멸자는 객체가 소멸하는 시점에 명령을 처리하는 역할을 하며 생성자와는 다르게 오버 로딩이 되지않는다.

소멸자 역시 무거운 작업을 시키지 않는 게 좋으며 대체로 메모리 해제 같은 명령을 수행한다.

 

//생성자
MyClass(){}
MyClass(int a){}
MyClass(int a, double b){}


//소멸자
~MyClass(){}

 

 

8. 접근 지정자 (Access Specifiers)

 

클래스 멤버에 대한 접근을 제어하는 데 사용된다.

타 언어는 모르겠지만 C++에선 public, protected, private 세 가지의 접근 지정자가 있다.

public은 외부에서 접근할 수 있으며 private은(는) 클래스 내부에서만 접근할 수 있게 제한하고

protected는 파생 클래스에서만 접근할 수 있게 허용한다.

 

한 포스트에서 텍스트를 이렇게 길게 작성하는 걸 좋아하지는 않는데

여기 언급된 8개의 주요 특징은 C++에서 중요한 내용이므로 어쩔 수 없이 길게 작성했다.

나머지 부족한 설명은 앞으로 포스팅하면서 보충할 예정이다.

728x90
Comments