클래스 기초
접근 지정자
3가지 접근 지정자
- private
동일한 클래스의 멤버 함수에만 제한한다.
클래스 밖에서 직접 접근 불가 -> 클래스 안에서만 사용 가능하다.
- protected
클래스 자신과 상속받은 자식 클래스에한 허용한다.
- public
모든 다른 클래스에 허용한다.
클래스 밖에서도 직접 접근 가능하다.
동일한 클래스의 멤버 함수에만 제한한다.
클래스 밖에서 직접 접근 불가 -> 클래스 안에서만 사용 가능하다.
클래스 자신과 상속받은 자식 클래스에한 허용한다.
모든 다른 클래스에 허용한다.
클래스 밖에서도 직접 접근 가능하다.
접근 지정자 | 해당 클래스에서의 접근 | 파생클래스에서의 접근 | 클래스 밖에서의 접근 |
---|---|---|---|
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
으로 설정한다.
왜냐면, 멤버 함수는 객체가 사용할 수 있어야 하므로, 클래스 밖에서 접근할 수 있어야 하기 때문이다.
접근자 함수(accessor function)
접근자 함수 : public
를 갖는 멤버 함수로, 클래스의 멤버 변수에 접근을 도와주는 기능 제공한다.
->보통은, Get 함수와 Set 함수로 구현된다.
- Get 함수 : 멤버 변수에 대한 접근이 가능하도록 한다.(멤버변수의 값을 얻도록 함)
- Set 함수 : 멤버변수의 값을 수정할 수 있도록 한다.
=> 위의 두 접근자 함수는 function name의 접두어로 사용된다.
// 클래스 선언부
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함수 및 friend 클래스
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
는 대부분의 경우에는 안전하게 멤버 변수를 보호하면서, 특수한 상황에서는 멤버 변수에 대한 접근을 허용하는 예외 규칙이라고 할 수 있다.
멤버함수의 this 포인터
this 포인터
멤버 함수를 소유한 객체를 가리키는 포인터로, 객체가 저장되어 있는 주소를 저장한다.
이는 클래스의 멤버 함수 내에서만 사용 가능하고, 개발자가 선언하는 변수가 아니다.
컴파일러가 선언하는 변수로, 컴파일러에 의해 묵시적으로 삽입 선언되는 매개 변수이다.
class Student {
int stdNum;
int stdName;
public:
void SetStdNum(int stdNum) {
this->stdNum = stdNum //첫 번째는 class꺼, 두 번째는 매개변수
}
}
/* this만 따로 출력도 가능하다. */
각 객체 속의
this
는 다른 객체의this
와 다름
this가 유용한 경우
- 매개변수의 이름과 멤버변수의 이름이 같은 경우
- 멤버 함수가 객체 자신의 주소를 리턴할 때
분할 컴파일
바람직한 C++ 프로그램 작성법
클래스를 헤더 파일과 cpp파일로 분리하여 작성한다.
- 클래스 선언부 : 헤더 파일(
.h
)에 저장 ->클래스 이름.h
- 클래스 구현부 : cpp파일에 저장 (멤버함수의 구현) ->
클래스 이름.cpp
단, 클래스 구현부에는 사용할 선언부를
include
해야 한다.
이를 통해, 클래스 재사용
중복 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로 넘어간다.
Author And Source
이 문제에 관하여(클래스 기초), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@podong/클래스-기초저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)