접근 지정자 | 해당 클래스에서의 접근 | 파생클래스에서의 접근 | 클래스 밖에서의 접근 |
---|---|---|---|
private | O | X | X |
protected | O | O | X |
ppublic | O | O | O |
클래스 정의 안에서 접근 지정자를 지정하면, 새로운 접근 지정자가 나타날 때까지 모든 멤버가 해당 접근 권한을 가진다.
class test {
int testInt; //private로 선언됨 -> 디폴트 접근 지정 = private이기 때문
public:
float testFloat;
double testFunction();
}
private
나 protected
로 설정한다.
이는 잘못된 변경으로부터 멤버 변수를 보호하기 위함으로,
=> 멤버 함수를 통해서 멤버 변수를 수정할 수 있는 방법으로 많이 사용한다. (접근자함수 내용 참고)
public
으로 설정한다.
왜냐면, 멤버 함수는 객체가 사용할 수 있어야 하므로, 클래스 밖에서 접근할 수 있어야 하기 때문이다.
접근자 함수 : public
를 갖는 멤버 함수로, 클래스의 멤버 변수에 접근을 도와주는 기능 제공한다.
->보통은, Get 함수와 Set 함수로 구현된다.
// 클래스 선언부
class shape {
private:
int height;
int width;
public:
int GetHeight();
int GetWidth();
void SetHeight(int userHeight);
void SetWidth(int userWidth);
}
// 클래스 구현부
int shape::GetHeight() {
return height;
}
int shape::GetWidth() {
return width;
}
void shape::SetHeight(int userHeight) {
height = userHeight;
}
void shape::SetWidth(int userWidth) {
width = userWidth;
}
friend 함수
클래스의 멤버 함수가 아닌 전역 함수임에도, private
, protected
멤버에 대한 접근이 허용된 함수이다.
-> 접근하고픈 class 선언부에 friend
키워드를 작성하고 함수 원형을 적는다.
friend 클래스
특정 클래스의 private
,protected
멤버에 접근할 수 있는 class이다.
-> 접근하고픈 class 선언부에 friend class
를 작성하고 클래스 name을 적어준다.
class Circle {
friend void GetArea(); // friend 함수
friend class shape; // friend 클래스
}
class shape {
private:
int Height;
int Width;
}
//main
void GetArea() {
//do something..
}
friend
는 대부분의 경우에는 안전하게 멤버 변수를 보호하면서, 특수한 상황에서는 멤버 변수에 대한 접근을 허용하는 예외 규칙이라고 할 수 있다.
멤버 함수를 소유한 객체를 가리키는 포인터로, 객체가 저장되어 있는 주소를 저장한다.
이는 클래스의 멤버 함수 내에서만 사용 가능하고, 개발자가 선언하는 변수가 아니다.
컴파일러가 선언하는 변수로, 컴파일러에 의해 묵시적으로 삽입 선언되는 매개 변수이다.
class Student {
int stdNum;
int stdName;
public:
void SetStdNum(int stdNum) {
this->stdNum = stdNum //첫 번째는 class꺼, 두 번째는 매개변수
}
}
/* this만 따로 출력도 가능하다. */
각 객체 속의
this
는 다른 객체의this
와 다름
클래스를 헤더 파일과 cpp파일로 분리하여 작성한다.
.h
)에 저장 -> 클래스 이름.h
클래스 이름.cpp
단, 클래스 구현부에는 사용할 선언부를
include
해야 한다.
이를 통해, 클래스 재사용
조건 컴파일 문으로 해결한다.
#define
을 이용하여 심볼을 만든다.#ifndef
를 추가한다.#endif
를 추가한다.// shape.h
// 심볼 이름은 컴파일 상수와의 충돌을 방지하기 위해, 클래스 이름으로 사용하는 것이 좋다.
#ifndef SHAPE_H
#define SHAPE_H
class shape {
// declaration member function & variable...
}
#endif
//main.cpp
#include <iostream>
using namespace std;
#include "shape.h"
#include "shape.h" // 조건 컴파일문으로 인해, 여러 번 include해도 문제가 발생하지 않는다.
int main() {
//do something..
}
shape.h에 SHAPE_H가 없으면, define으로 선언하고 / 있으면, 바로 endif로 넘어간다.