본문 바로가기

교육 노트/C++ 심화강의

[C++ 때려잡기] C++ 심화강의 2 접근 한정자

2018/08/27 - [교육 노트/C++ 심화강의] - [C++ 때려잡기] C++ 심화강의 1 객체 지향 프로그래밍과 클래스



추후에 설명한다고 접근한정자를 설명하겠다.


1 접근 한정자

클래스내의 변수나 함수에 대한 접근 범위를 설정한다.
(접근 제한자, 접근 지정자 라고도 한다)


요것이 무슨의미나 하믄


이전에 만든 캐릭터 클래스를 살펴보자


class Character
{
public:
    int hp;
    int speed;
    string name;
    void move(int dir);
    void jump();
    void hit();
};



이렇게 되어있고


main에서

mario.name,

mario.jump(); 등으로 사용하였다.


기능을 추가하여 아이템을 먹으면 speed를 빨라지게 해보자



class Character
{
public:
    int hp;
    int speed;
    string name;
    void move(int dir);
    void jump();
    void hit();

    void speedUp();
    void obtainItem();
};

void Character::speedUp()
{
    speed++;
}

void Character::obtainItem()
{
    speedUp();
}


아이템을 얻었을때 말고 다른상황에서도 쓸수 있을꺼 같아 speedUp함수를 따로 만들었고

아이템을 획득했을때 obtainItem에서 speedUp 함수를 호출하는 방식으로 구성하였다.


이제 아이템을 먹으면 속도를 빨라지게 할수있다!



그런데 이 코드를 만들고 같이 프로그래밍 하는 친구에게 쓰라고 건내주었다.


그런데 친구가 졸면서 코딩하는 바람에 speedUP함수를 보지못하고 실수 해버렸다.



int main()
{
    Character mario;
    mario.name = "슈퍼마리오";
    

    mario.obtainItem();
    mario.speed += 10000;

    return 0;
}


앗 졸면서 코딩하느라 스피드가 10001이나 증가해버렸다.



프로그램 상에서는 오류가 하나도 없으므로

아무도 해당 상황을 눈치채지 못하였다!


그래서 이상태로 게임을 개발하고 출시해서 게임은 망했다고 한다....





이런 상황을 미연에 방지하기위해

c++은 접근 지정자를 제공한다.





다음과 같이 내가 클래스를 만들어 놓으면


obtainItem이라는 함수 내에서 나는 자유룝게 hp, speed, speedup()등을 사용할수있으나


친구는 main함수에서 speed라는 변수나 speedUp이라는 함수를 사용할수가 없다!



다음과 같이 같은 class의 바깥에서는 엑세스 할수 없게 된다.


그러나 같은 클래스내에서는 사용이 가능하다



에러한줄 없이 깔끔하다~



다음과 필요에 따라 같이 밖에서 함부로 변조불가능하게 데이터와 함수를 제한 할 수가 있어진다.






데이터를 제한하여 밖에서 못쓰게 하는거까지는 좋았다.

hp도 함부로 다루지 못하게 private에 집어넣었는데

생각해보니까 hp는 화면에 출력해서 생명력이 얼마나 남았는지 보여주어야한다.


그러면 다시 hp를 public을로 바꾸어야 할까?


그래서 나온것이 getter setter이다.



#include <iostream>
using namespace std;

class Character
{
private:
    int hp;

public:
    void setHp(int _hp);
    int getHp();
};

void Character::setHp(int _hp)
{
    hp = _hp;
}

int Character::getHp()
{
    return hp;
}


int main()
{
    Character mario;
    mario.setHp(100);
    cout << mario.getHp() << endl;

    return 0;
}


이런식으로 hp에 대한 getter 와 setter을 만드는 것이다.



아니 이렇게 private에 있는 변수에 setter getter을 다 만들꺼면

뭐하러 힘들게 hp를 private에 넣은걸까?

어차피 수정 가능하고 가져올수있으면 걍 public에 넣으면 되는거 아닌가?


 굳이 밖에서 변경이 필요없는 경우는 setter를 그냥 빼버리면 된다. getter야 뭐 확인하는 용도인데 크게 문제될것도 없다.


그렇다고 모든 변수를 다 setter, getter을 만들라는것은 아니고 적재 적소에 잘 사용하면된다. 어찌됬든 무분별한 public 사용보다 나으니까.



이렇게 데이터를 숨기는것을 정보은닉이라고하고


한 클래스에 연관된 데이터를 묶고 정보은닉을 하여 클래스 자체를 캡슐처럼? 만드는것을 캡슐화 라고 한다.




728x90