클래스를 바라보는 관점

  1. 프로그램은, Data 와 Logic 으로 이루어진다.
  2. 프로그래밍에서 Data 는 기본 자료형, 복합 자료형, 구조체(사용자 정의 자료형), 클래스(구조체+함수) 로 사용한다. 
  3. 프로그래밍에서 Data 는 자료형과 초기화 그리고 변수명으로 사용이 모두 동일하다.
  4. 클래스도 마찬가지다.
    클래스라는 자료형을 선언하고,
    변수명으로 사용하고,
    초기화하는 관점으로 접근해야 한다.
  5. C++ OOP의 목적은, class 를 int, char 처럼 사용하게 만드는 것이다. 

 

(참고) 편의상, 구조체에 함수를 포함하면 클래스라고 단순히 설명한다.
하지만, C언어의 구조체와 C++의 구조체는 다르다.
그리고 C++의 구조체와 C++의 클래스는 한가지 차이점이 있다.


기본 자료형과 살펴보자.

int a; 선언과, a = 1; 초기화(값 할당)가 있다. 그리고 변수명으로 사용한다.

 

클래스도 선언과, 초기화, 변수명 사용 관점에서 접근해야 한다.

클래스도 Data를 저장하고, Data를 처리하는 기능이 모두 포함된 "사용자 정의 자료형"이다.

 

선언의 관점에서, 클래스라는 자료형은 사용자가 조합하여 정의한다.

초기화의 관점에서, 클래스의 맴버 변수에 값을 할당하는 초기화는, 클래스의 맴버 함수로 한다.

변수명의 사용 관점에서, 클래스의 맴버 변수와 초기화 기능을 하는 맴버 함수 외에, 여러 기능 함수를 추가할 수 있다.

 

클래스란, 특정 기능을 수행하기 위해, 변수와 함수를 모아 둔 자료형이다.

 

 

 

 

1. 구조체 사용과 문제점

#include <iostream>

using namespace std;

struct Tv{
    bool OnOff;
    int channel;
    int volume;
};

int main()
{
    Tv lg;
    lg.OnOff = true;
    lg.channel = 10;
    lg.volume = 50;
}

 

만약, 개발자가 볼륨에 해당하는 0~100 사이의 값을 입력받도록 의도하여 volume 이라는 변수로 추상화 합니다.

이때, 150, 300, 9999 라는 수치가 입력된다면, 프로그램은 어떻게 될까요?

만약, 채널 1000개를 식별하도록 만들어진 Tv 프로그램에 채널이 99,999 채널이 입력된다면, 프로그램은 어떻게 될까요?

 

 

 

 

2. 구조체 사용과 문제점 개선 (1) - 함수 사용

#include <iostream>

using namespace std;

struct Tv{
    bool OnOff;
    int channel;
    int volume;

    void setVolume(int vol)
    {
        if(vol >= 0 && vol <= 100 )
        {
            volume = vol;
        }
    }

};

int main()
{
    Tv lg;
    lg.OnOff = true;
    lg.channel = 10;
    // lg.volume = 50;
    lg.setVolume(88);
    // lg.volume = 9999;
}

 

setVolume() 이라는 setter 함수를 사용해서, 개발자가 의도한 값 이외에 할당되지 않도록 "제한" 했습니다.

하지만 여전히 문제가 남아 있습니다. 

volume = 9999; 와 같이 할당연산자를 사용한 값 할당이 여전히 가능합니다.

 

 

 

 

3. 구조체 사용과 문제점 개선 (2) - 접근 제어자 사용 

#include <iostream>

using namespace std;

struct Tv{
private:
    bool OnOff;
    int channel;
    int volume;
public:
    void on()
    {
        OnOff = true;
        std::cout << "Tv power On" << endl;
    }
    void off()
    {
        OnOff = false;
        std::cout << "Tv power Off" << endl;
    }

    void setChl(int chl)
    {
        if(chl >= 0 && chl <= 10 )
        {
            channel = chl;
            std::cout << "채널을" << chl << "로 변경했습니다." << endl;
        }
    }

    void setVolume(int vol)
    {
        if(vol >= 0 && vol <= 100 )
        {
            volume = vol;
            std::cout << "볼륨을" << vol << "로 변경했습니다." << endl;
        }
    }
};

int main()
{
    Tv lg;
    //lg.OnOff = true;
    lg.on();
    //lg.channel = 10;
    lg.setChl(10);
    //lg.volume = 50;
    lg.setVolume(88);
}

접근 제어자와, 함수로 맴버 변수의 값을 사용자 의도처럼 "제한"할 수 있게 만드는 개념을

데이터 은닉화, 캡슐화 라고 합니다.

 


4. C++ 구조체와 C++ 클래스 차이

 

구조체 선언 내부에 public 접근 제어자가 생략되면, 맴버는 public

클래스 선언 내부에 public 접근 제어자가 생략되면, 맴버는 private