[C++] #2 getter setter 함수

    반응형

    ... 이전 포스팅  

    [C++] #1 클래스 (Class) 에서 은닉성(정보은닉)을 위해 접근 제어 지시자를 멤버변수는 private로 멤버함수는 public으로 설정한다고 공부했다. 

    이번 포스팅 에서는 getter setter 함수를 이용해 private로 설정한 멤버 변수에 접근하는 방법에 대해 정리 하고자 한다. 

     

    *개인적인 공부 내용을 기록하는 용도로 작성한 글 이기에 잘못된 내용을 포함하고 있을 수 있습니다.


    # getter setter 함수

    앞에서도 이야기 했듯이, 보통 클래스의 멤버변수는 private로 멤버함수는 public으로 설정한다.

    class Player {
    private:
    	string m_name;
    	int m_level;
    	int m_hp;
    	int m_mp;
    	int m_atk;
    public:
    	void attack()
    	{
    		cout << m_name << " attack!" << endl;
    	}
    };

     

    하지만 전과 같은 방법으로 Player 클래스의 멤버변수를 초기화 하고자 하면 에러가 발생한다.

    int main() {
    	// Player의 멤버변수를 private로 설정하였기에, 외부에서 접근 하고자 하면 에러가 발생한다.
      	Player warrior {"Warrior", 10, 100, 10, 20};
    	Player mage {"Mage", 8, 50, 100, 25};
    	return 0;
    }

     

    getter setter 함수를 이용하면 private 멤버에 접근할 수 있다.

    정말 getter setter 라는 이름을 가지고 있는 것은 아니고, 프로그래머가 함수의 이름 앞에 get set 을 붙여서 정의하기에 통상적으로 getter 함수 setter 함수 라고 부르는 것이다.

     

    해결 방안은 다음과 같다. setter 함수를 public 필드에 정의하여 private 멤버를 초기화하고 getter 함수를 public 필드에 정의해 private 멤버의 정보를 얻어온다.

     

    아래 코드는 public 필드에 setInfo 함수를 정의하여 private 멤버를 초기화하고 , getInfo 함수를 정의하여 private 멤버의 정보를 가져온 예시이다. 

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Player {
    private:
    	string m_name;
    	int m_level;
    	int m_hp;
    	int m_mp;
    	int m_atk;
    public:
    	void attack()
    	{
    		cout << m_name << " attack!" << endl;
    	}
    	void setInfo(string name, int level, int hp, int mp, int atk)
    	{
    		m_name = name;
    		m_level = level;
    		m_hp = hp;
    		m_mp = mp;
    		m_atk = atk;
    	}
    	void getInfo()
    	{
    		cout << "==== PRINT INFO ====" << endl;
    		cout << "name : " << m_name << endl;
    		cout << "level : " << m_level << endl;
    		cout << "hp : " << m_hp << endl;
    		cout << "mp : " << m_mp << endl;
    		cout << "atk : " << m_atk << endl;
    	}
    };
    
    int main() {
      	// Player warrior {"Warrior", 10, 100, 10, 20};
    	// Player mage {"Mage", 8, 50, 100, 25};
    	Player warrior;
    	warrior.setInfo("Warrior", 10, 100, 10, 20);
    	warrior.getInfo();
    	return 0;
    }
    ==== PRINT INFO ====
    name : Warrior
    level : 10
    hp : 100
    mp : 10
    atk : 20

     

    getter 함수를 통해 private 멤버를 초기화할 수 있다고는 하지만, 함수를 사용해 접근해야 하기에 멤버 변수를 public으로 설정해 바로 초기화 하는 이전 방식 보다는 여전히 불편하다.

    다음 포스팅에서는 이러한 불편함을 해소할 수 있는 생성자(Constructors)에 대해서 정리할 예정이다.

    반응형

    댓글

    Designed by JB FACTORY