bdfgdfg

[C++ 객체지향] 캡슐화 및 은닉성 본문

게임프로그래밍/C++

[C++ 객체지향] 캡슐화 및 은닉성

marmelo12 2022. 1. 9. 12:44
반응형

캡슐화 및 은닉성

- 캡슐화는 간단히 말해 관련된 데이터와 함수를 묶는 것.

- 실제 구현 내용을 외부에 감추어 은닉한다.

 

절차 지향 언어인 C에서는 이것이 불가능한데 C에서의 구조체는 단순히 관련된 데이터들을 묶어주는 데이터 덩어리.

그렇기에 특정 함수와 관련된 데이터를 추적하기가 어렵다.

 

객체지향 언어에서는 이러한 캡슐화가 지원되는데 관련된 데이터와 함수들을 클래스 안에서 사용이 가능해짐에 따라

클래스라는 캡슐 속에서 기능들을 캡슐화하는 게 가능해진 것.

 

리모컨을 생각해보자. 우리는 간단하게 TV를 향해 리모컨을 들고 채널을 바꾸거나 소리를 높이고 낮출 수 있다.

리모컨 내부를 몰라도(은닉) 우리는 버튼 하나만 누르면(캡슐화) 원하는 대로 리모컨의 기능을 사용할 수 있는 것이다.

 -> 리모컨의 동작원리는 리모컨의 송신부의 적외선 신호를 통해 TV의 수신부로 신호를 받아들여 처리한다고 한다..

 

리모컨의 정확한 내부도를 모르지만 대충 비슷하게 작성해보자.

class RemoteControl // 리모컨
{
public:
	void VolumeUp() 
	{ 
		// 볼륨업! 
		SendInfraredraySignal(); 
	}
void VolumeDown() 
	{  
		// 볼륨다운! 
		SendInfraredraySignal(); 
	}
private:
void SendInfraredraySignal() 
	{ 
		// 적외선 신호 송신
	};
private:
	Circuit m_circuit; // 내부 회로도
	bool    m_InfraredRay;
};

이렇게 우리는 리모컨 내부를 모르지만 볼륨을 높이거나 낮추는 데에도 내부적으로 무언가를 처리한 다음 우리가 원하는 결과를 얻을 수 있을 것이다.

 -> 외부로 공개된 것은 볼륨업, 다운기능 그 외의 내부적으로 처리하는 것은 외부에 비공개.

만약 여기서 외부에 비공개된 데이터나 기능들에 접근이 가능하다면 어떻게 될까.

 

우리가 실제로 사용하는 리모컨도 내부를 뜯어 이것저것 만지다가 실수로 부서질 수도 있고 다시 사용하다가 버튼을 눌러도 동작을 하지 않는 등 우리가 원하지 않는 결과를 초래할 수 있다.

 

객체지향 프로그래밍에서도 마찬가지다. 클래스에서 모든 데이터와 기능을 public(외부 공개)으로 해둔다면, 다른 사용자가 실수로 내부의 중요한 기능들을 수정해버린다면 해당 객체는 제대로 동작하지 않을 것이다.

 

그렇기에 캡슐화라는 개념과 더불어 은닉성이라는 개념이 같이 붙어 다니는 것도 이러한 이유이다.

 

 

 

 

반응형
Comments