[디딤돌 C++] 13. OOP 개요

이제 C++언어가 갖는 주요 특징인 OOP(Object Oriented Programming, 개체(객체) 지향 프로그래밍)에 관한 사항을 다루기 시작할게요.

특히 OOP에 관한 특징들은 클래스 문법을 통해 다룰거예요.

OOP란 프로그램의 세계에 현실 세계를 반영하자는 것에서 출발했어요. 우리가 사는 현실 세계는 수 많은 생명체들이 메시지를 서로 주고 받으면 살아가고 있어요. 이처럼 프로그램도 개체들이 서로 메시지를 주고 받으며 동작하게 하자는 것이죠.

그런데 프로그램에서는 개체를 만들기 위해서는 먼저 형식 정의가 필요해요. 현실 세계에서는 사람이나 호랑이, 음악가, 학생처럼 추상적인 개념을 정의하고 있죠.

마찬가지로 프로그램에서도 형식을 정의할 수 있는데 C++언어와 Java, C# 등의 OOP 언어에서는 클래스를 이용하여 형식을 정의하는 것이 가장 일반적이예요.

C언어의 구조체에서는 멤버 데이터를 묶어서 하나의 형식으로 만들었죠. 그런데 C++언어에서는 구조체와 클래스를 정의할 때 개체의 속성 데이터 뿐만 아니라 개체가 수행할 수 있는 행위도 형식 내부에 정의할 수 있어요.

캡슐화

이처럼 여러 개의 멤버를 하나의 형식으로 묶는 것을 캡슐화하라고 불러요. C++언어에서 캡슐화 대상은 멤버 필드(데이터)와 멤버 메서드(기능)이 있어요. 그리고 다른 형식에서 접근할 수 있는 가시성을 지정할 수 있는 접근 지정자를 제공하여 신뢰성을 높이고 있어요.

다음은 학생 형식을 클래스로 캡슐화한 예제 코드예요. 자세한 사항은 캡슐화 파트에서 자세하게 다룰 거예요. 가볍게 한 번 보시고 따라 작성해 보세요.

#include <iostream>
#include <string>
using namespace std;

class Student
{
    //멤버 필드
    int num;
    string name;
    int iq;
public:
    //멤버 메서드
    Student(int num,string name) //생성자 메서드
    {
        this->num = num;
        this->name = name;
        this->iq = 100;
    }
    void Study()
    {
        cout<<name<<" 학생 공부하다."<<endl;
        iq++;
    }
    void View()
    {
        cout<<"번호:"<<num<<" 이름:"<<name<<" 아이큐:"<<iq<<endl;
    }
};

int main()
{
    Student *stu = new Student(3,"홍길동");
    stu->Study();
    stu->View();
    delete stu;
    return 0;
}

▷ 실행 결과

홍길동 학생 공부하다.
번호:3 이름:홍길동 아이큐:101

또한 대부분의 멤버가 비슷한 여러 형식의 공통점을 기반 형식으로 정의한 후에 이를 기반으로 차이가 있는 부분만 추가하여 파생 형식을 정의할 수 있는 상속에 관한 문법을 제공하고 있어요.

그리고 기반 형식 변수로 파생 형식 개체를 사용할 수 있게 다형성에 관한 문법도 제공하고 있죠. 특히 기반 형식에서 특정 기능에 동작을 정의하고 파생 형식에서 이를 새롭게 재정의하였을 때 개체를 사용하는 변수 형식이 아닌 실제 생성한 개체 형식에 정의한 기능을 수행할 수 있어 상속과 다형성은 프로그래밍 효율을 높여주고 있어요.

상속 일반화

다음은 기반 클래스 음악가와 이를 기반으로 파생 형식 Painist를 정의하고 사용하는 예제 코드예요. 이에 관한 사항은 상속과 다형성에서 자세히 다룰 거예요. 마찬가지로 가볍게 살펴보시고 따라서 작성해 보세요.

//상속과 다형성 예
#include <string>
#include <iostream>
using namespace std;
 
class Musician//기반 클래스
{
    string name;
public:
    Musician(string name)
    {
        this->name = name;
    }
    void Play()
    {
        cout<<name<<" 랄라라"<<endl;
    }
    void Greeting()
    {
        cout<<"안녕하세요. "<<name<<"입니다."<<endl;
    }
};
class Pianist:
    public Musician //기반 클래스 Musician에서 파생 클래스 Pianist 정의
{  
public:    
    Pianist(string name):Musician(name)
    {
    }
    void Tuning()
    {
        cout<<"도도 레레 미미 파파 솔솔"<<endl;
    }
};
 
void Test(Musician *musician);
int main(void)
{
    Pianist *pianist = new Pianist("JSJ");
    Test(pianist);
    pianist->Tuning();
    delete pianist;
    return 0;
}
void Test(Musician *musician)
{
    musician->Greeting();
    musician->Play();
}

▷ 실행 결과

안녕하세요. JSJ입니다.
JSJ 랄라라

앞으로 이 책에서는 대부분 OOP에 관한 문법과 설계에 관한 사항에 초점을 두어 설명할 거예요.