본문 바로가기
C++

[C++]Class Operator와 대입연산자

by Junk_Seo 2018. 1. 25.
반응형

Operator(연산자 오버로딩)

class에 연산기능의 인터페이스를 구현하여 사용하는 것입니다. 

사용자의 편의성을 위해 구현하는 기능이지만 class라는 모듈에 operator를 구현하면 사용자는 사실 이 operator 연산이 무슨 기능을 하는지 알기가 어렵습니다. 

따라서 class의 모듈이 수학적인 기능만 가지고 있는 경우 operator를 구현하여 인터페이스를 제공하는 것이 좋습니다.

 

operator의 형태는 다음과 같이 operator뒤에 연산기호를 붙여서 함수 이름으로 사용합니다.

operator+

operator-

operator*

operator/

operator++

operator--

operator=

operator+=

......

 

반환 형식과 인수는 연산의 기능에 따라 사용자가 구현하면 됩니다. 기본적인 형식은 검색을 통해 알 수 있습니다.

대입연산자(operator=)

연산자 오버로딩에서 짚고 넘어가야 할 부분은 바로 대입연산자입니다. 이 대입 연산자는 다른 연산자 오버로딩과는 다르게 직접 구현하지 않아도 default 대입연산자가 존재하기 때문에 자동으로 추가되는 함수입니다.

복사 생성자와 마찬가지로 class 객체 대 객체를 call by value의 형태로 복사를 진행하기 때문에 얕은 복사와 깊은 복사가 존재합니다. 이에 대한 내용은 따로 검색하시길 바랍니다.

 

대입 연산자의 형태

class C_DATA {
private:
	int m_nData;
public:
	C_DATA();
	const C_DATA& operator=(const C_DATA& nInput);
};
const C_DATA & C_DATA::operator=(const C_DATA & nInput)
{
}

위 코드에서 "const C_DATA& operator=(const C_DATA& nInput);" 부분이 대입연산자의 기본 형태입니다.

 

 

중요한 점은 이 대입 연산자가 default 대입 연산자가 존재해 자동으로 추가되는 함수라는 것입니다.

즉, 프로그래머의 의도와 다르게 class 객체 대 객체의 call by value 형태의 복사가 가능하기 때문에 복사 생성자와 마찬기지로 프로그래머가 직접 사용하지 못하게 구현하여 사용자가 실수하는 일이 없도록 해야 합니다.

 

대입 연산자 사용을 막는 2가지 방법

1. private로 함수를 선언하고 정의하지 않는다.

class C_DATA {
private:
	int m_nData;
public:
	C_DATA();
private:
	const C_DATA& operator=(const C_DATA& nInput);
};

위의 코드처럼 private로 선언하고 정의부를 구현하지 않으면 객체 외부에서는 private 함수에 접근이 불가능합니다.

 

2. delete 키워드를 사용하여 명시적으로 함수를 지우는 방법

class C_DATA {
private:
	int m_nData;
public:
	C_DATA();
	const C_DATA& operator=(const C_DATA& nInput) = delete;
};

위의 코드처럼 delete 키워드를 사용하여 명시적으로 함수를 삭제하게 되면 이 함수를 사용할 경우 컴파일 과정에서 error를 발생시킵니다.

반응형