본문 바로가기

C++/C++ 문법

[C++] 클래스, 접근제어지시자(public, private), const 함수

728x90
반응형

클래스와 구조체

 

구조체에서 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로 선언되지 않은 함수가 멤버변수의 값을 변경하지 않더라도, 변경할 수 있는 가능성을 내포하고 있는

함수이기 때문에 호출을 아예 허용하지 않는 것이다.

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형