클래스와 구조체
구조체에서 struct를 class로 바꾸기만 하면 클래스의 선언은 끝난다.
구조체
struct Pos {
double posx;
double posy;
void ShowCurPos() {
std::cout << "현재 좌표의 x값 : " << posx << std::endl;
std::cout << "현재 좌표의 y값 : " << posy << std::endl;
}
};
클래스
class Pos {
double posx;
double posy;
void ShowCurPos() {
std::cout << "현재 좌표의 x값 : " << posx << std::endl;
std::cout << "현재 좌표의 y값 : " << posy << std::endl;
}
};
구조체와 역할도 동일하다. 여러 개의 변수를 하나의 의미로 묶는 것이다.
또한 클래스에 접근하는 방법도 동일하다.
클래스 변수를 하나 생성해 주고 도트연산자를 통해서 접근할 수 있다.
접근제어 지시자
클래스는 세 가지 접근 제어지시자를 통해서 선언된 함수 및 변수 등의 접근 범위를 제한할 수 있다.
public, protected, privated 지시자가 존재하는데
public 지시자를 사용하면 어디서든 접근이 가능하고 private 지사자를 사용하면 클래스 내부에서만 접근이 가능하다.
그리고 protected 지시자를 사용하면 상속관계에 놓여있을 때 유도 클래스에서의 접근을 허용한다.
* 이 내용은 '상속'과 관련있으므로 나중에 다시 포스팅하겠다.
접근제어 지시자를 사용하면 그 이후에 나오는 변수나 함수 등은 모두 해당 접근제어 지시자의 내용을 따른다.
아래 코드처럼 작성하였을 경우 posx와 posy는 클래스 밖에서 접근이 제한된다.
class Pos {
private:
double posx;
double posy;
};
접근이 제한된다는 의미는 클래스의 선언을 해도 함수의 값을 사용하거나 변경이 불가능하다는 뜻이다.
따라서 아래코드처럼 초기화하는 것도 불가능하다.
Pos PosA = {10.5, 20.5};
접근제어 지시자를 사용하고 또 다른 접근제어 지시자를 명시해 주면 해당 부분부터
새로 명시된 접근제어지시자의 내용을 따른다.
따라서 아래코드에서 posx와 posy는 클래스 밖에서 사용이 불가능하지만
ShowCurPos와 GetPos 함수는 사용이 가능하다.
#include <iostream>
class Pos {
private:
double posx;
double posy;
public:
void ShowCurPos() {
std::cout << "현재 좌표의 x값 : " << posx << std::endl;
std::cout << "현재 좌표의 y값 : " << posy << std::endl;
}
void GetPos(double x, double y) {
posx = x;
posy = y;
}
};
int main()
{
Pos PosA;
PosA.GetPos(10.5, 20.5);
PosA.ShowCurPos();
return 0;
}
클래스 내에서 함수의 선언과 정의 분리
구조체와 마찬가지로 클래스에서도 함수의 선언과 정의를 분리하는 것이 가능하다.
class TestClass {
private:
int num = 10;
public:
void GetNum();
};
void TestClass::GetNum() {
std::cout << num;
}
정의할 때에는 구조체와 마찬가지로 함수이름 앞에 범위지정연산자를 사용하여 클래스를 명시해주어야 한다.
객체, 멤버변수, 멤버함수
선언된 클래스를 우리는 객체라고 부른다.
또한 이 안에 들어있는 변수는 멤버변수, 함수는 멤버함수라고 부른다.
바로 위에서 사용한 코드를 예시로 들자면 posA는 객체이며 posx, posy는 멤버변수
GetPos, ShowCurPos는 멤버함수라고 할 수 있다.
멤버함수 뒤의 const 선언
const 선언을 멤버함수 뒤에 사용하면 함수 내에서 멤버변수의 값의 변경을 허용하지 않는다는 의미이다.
따라서 아래와 같은 코드의 컴파일은 허용되지 않는다.
class Calculate {
private:
int a = 10;
int b = 15;
public:
int plus () const
{
a++;
b++;
return a + b;
}
};
또한 const로 선언된 함수 안에서는 const로 선언되지 않은 함수의 호출이 허용되지 않는다.
따라서 아래와 같은 코드도 허용되지 않는다.
class TestClass {
private:
int num;
public:
void IntNum(int n) {
num = n;
}
int GetNum() {
return num;
}
void ShowNum() const {
std::cout << GetNum() << std::endl;
}
};
const로 선언되지 않은 함수가 멤버변수의 값을 변경하지 않더라도, 변경할 수 있는 가능성을 내포하고 있는
함수이기 때문에 호출을 아예 허용하지 않는 것이다.
'C++ > C++ 문법' 카테고리의 다른 글
[C++] 생성자와 소멸자, 생성자의 오버로딩, 디폴트 생성자, 객체의 동적할당 (0) | 2024.03.22 |
---|---|
[C++] 객체의 전달 (const&) (0) | 2024.03.21 |
[C++] 구조체 (0) | 2024.03.10 |
[C++] 배열, 동적 할당 (new와 delete) (0) | 2024.03.09 |
[c++] 참조자 (0) | 2024.03.09 |