본문 바로가기
  • 쓸쓸한 개발자의 공부방
C++

[C++] 객체지향 : 접근지정자 private, public, friend

by 심찬 2021. 8. 18.

 

 

접근지정자

 

private / public

 

 - 사용자는 내부 멤버 데이터 구조에 대해 굳이 알 필요가 없다.

 - 멤버 함수를 통해서만 객체 상태 변경이 가능하도록 해서 객체를 안전하게 유지한다. 이를 캡슐화라 말한다.

 - setter / getter  : 멤버 데이터 접근을 위해 함드는 함수를 나타내는 용어, private 멤버 데이타를 선언하고 setter/getter로 접근하는 것이 일반적

 

자전거의 기어는 현실 세계에서 항상 존재함. 프로그램에서 잘못된 기어 생성을 막아야 한다.

gear의 값이 마이너스 값이거나 0 인 경우는 값 셋팅이 되지 않도록 하는 조건을 만들어 넣을 수 있다.

#include <iostream>
class Bike
{
public:
    void changeGear(int n)
    {
        if ( n < 1 ) {
            std::cout << "invalid gear value" << std::endl;
            return;
        }
        gear = n;
    }
    int getGear() { return gear;}

private:
    int color;
    int gear;

};

int main()
{
    Bike b;
    //b.gear = -7; // error. private 멤버!
    
    b.changeGear( -7 );
    int n = b.getGear();
}

 

friend

 

원래 private에 정의된 engineTemp에 직접 접근이 불가하다.

class Airplane
{
    int color;
    int speed;    
    int engineTemp;
public:
    int getSpeed() { return speed;}
};

void fixAirplane(Airplane& a)
{
    int n = a.engineTemp;    // error : private 데이타에 직접 접근이 불가하다!
}

int main()
{
    Airplane a;
    fixAirplane(a);
}

 

friend 함수로 정의하면 fixAirplane에서만 private에 접근하도록 만들고 싶다.

class Airplane
{
    int color;
    int speed;    
    int engineTemp;
public:
    int getSpeed() { return speed;}
    
    friend void fixAirplane(Airplane& a);   // friend 이니까 private 영역에 접근해도 허락해줘!
};

void fixAirplane(Airplane& a)
{
    int n = a.engineTemp;    // 해당 함수에서 이제 private 접근이 가능해짐.
}

int main()
{
    Airplane a;
    fixAirplane(a);
}

문제없이 컴파일이 됨을 확인할 수 있다.

댓글