1. 접근지정자 (access specifiers)
struct Book {
int code;
int price;
};
int main() {
Book b;
b.price = -1000;
}
위와 같은 코드가 있다고 해보자.
Book이란 구조체는 책의 code번호와 가격 정보를 들고있다.
사용자는 main()함수에서 책을 만들고 책의 가격을 바꾸려고 하는데 사용자가 실수로 '-'를 넣었다고 해보자.
가격은 음수가 될 수 없는데 이러한 실수를 막으려면 어떻게 해야 할까?
- 멤버 데이터를 외부에서 직접 접근하면 객체가 잘못된 상태를 가지게 될 수 있다.
- 접근지정자를 통해 멤버 함수를 통해서만 멤버 데이터를 변경할 수 있게한다.
=> 멤버 함수는 인자의 유효성 여부를 조사 할 수 있다.
struct Book {
private:
int code;
int price;
public:
void changePrice(int n) {
if(n < 1) return;
price = n;
}
};
int main() {
Book b;
// b.price = -1000;
b.changePrice(-1000);
}
- 최소한 오동작할 환경은 막을 수 있다.
- 접근 지정자 (access specifiers)
- 멤버 데이터와 멤버 함수
=> 멤버 데이터는 private로 만드는 경우가 많다.
=> 멤버 함수는 public로 만드는 경우가 많다.
2. 정보은닉, 캡슐화, setter/getter
struct Book {
private:
int code;
int price;
public:
void changePrice(int n) {
if(n < 1) return;
price = n;
}
int getPrice() { return Price; } // getter
};
int main() {
Book b;
b.changePrice(-1000);
}
- 객체의 사용자는 객체의 내부 멤버 데이터의 구조에 대해서는 알 필요가 없다. 멤버 함수만 알면 된다.
=> 정보 은닉 (information hiding)
- 멤버 함수를 통해서만 객체의 상태를 변경할 수 있기 때문에 객체의 상태를 항상 안전하게 유지 할 수 있다.
=> 캡슐화 (encapsulation)
- setter / getter
=> 멤버 데이터의 값을 변경하거나 얻기 위해 사용하는 멤버 함수를 나타내는 용어
- Struct vs Class
=> Struct : 접근 지정자 생략 시 기본 설정 값은 public
=> Class : 접근 지정자 생략 시 기본 설정 값은 private
- 참고
=> java, C# 등의 대부분의 객체지향 언어 : 접근 지정자를 모든 멤버에 개별적으로 표기
=> C++ : 접근 지정자를 한번 표기하면 새로운 접근 지정자가 나올 때까지 계속 적용
3. friend 함수 개념
class Car {
int color;
int speed;
int engineTemp;
public:
int getSpeed() { return speed; }
friend void fixCar(Car& c);
};
void fixCar(Car& c) {
int n = a.engineTemp;
}
int main() {
Car c;
fixCar(c);
}
color, speed, engineTemp는 private으로 지정된 멤버 데이터이다.
한데 밖에 있는 fixCar() 함수에서 engineTemp 멤버 데이터에 접근하고 싶다면 어떻게 해야 할까?
friend void fixCar(Car& c);
위 내용을 클래스 내부에 넣으면 문제 없이 컴파일 된다.
- friend 함수
=> 멤버 함수는 아니지만 private멤버에 접근 할 수 있게 하고 싶을 때
- 왜 멤버 함수로 만들지 않는가?
=> 멤버 함수로 만들 수 없는 경우가 있다.
- 왜 getter/setter를 사용하지 않는가?
=> getter/setter를 제공하면 모든 함수에서 접근할 수 있다.
=> 모든 함수가 아닌 특정 함수에서만 접근할 수 있게 하고 싶을 때
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 소멸자 (destructor) (0) | 2019.11.04 |
---|---|
[C++] 생성자 (constructor) (0) | 2019.10.31 |
[C++] 객체지향 프로그래밍의 개념(2) (0) | 2019.10.29 |
[C++] 객체지향 프로그래밍의 개념(1) (0) | 2019.10.29 |
[C++] 동적 메모리 할당, nullptr (0) | 2019.10.27 |