게임 개발/C++

[C++] 연산자 오버로딩 - 1. 전위형 / 후위형 증감 연산자

유행성바코드 2025. 3. 30. 22:09

목차

  • 01. Intro
  • 02. 증감 연산자
    • 전위형 증감 연산자
    • 후위형 증감 연산자
    • 연산자 오버로딩 적용
  • 03. 마무리
  • 04. 연관 내용

01. Intro

오늘은 [전위형 & 후위형 증감 연산자]에 대한 특징을 알아보도록 하겠습니다.

 


02. 증감 연산자

증감 연산자는 값을 1씩 증가하거나 감소시키는 단항 연산자를 의미합니다.

int a = 0;
a = a + 1;
a = a - 1;

a++;
--a;

위 코드처럼 변수의 값을 1씩 증감하는 코드를 간단하게 작성할 수 있습니다. 

 

a++;
--a;

위와 같은 코드를 증감 연산자라고 합니다.

--a; 처럼 변수 앞에 연산자가 오는 것을 [전위형 증감 연산자]라고 합니다.

a++; 처럼 변수 뒤에 연산자가 오는 것을 [후위형 증감 연산자]라고 합니다.

 

이 두 방법은 서로 작동 방식과 다른 특징을 가지고 있습니다.

이에 대해 자세히 알아보겠습니다.

 

전위형 증감 연산자

특징

int a = 0;
++a;
--a;

 

증감 연산자를 해석할 때는 앞에서 순서대로 읽으면 됩니다.

그래서, 전위형 증감 연산자는 변수 a의 값을 먼저 1 증감시키고 다시 a에 대입합니다.

따라서, 증감된 값을 즉시 사용합니다.

 

내부 동작

전위형 증감 연산자의 내부 동작은 아래와 같습니다.

 

1. 현재 값을 1 증감시킵니다.

2. 현재 값을 레퍼런스 변수로 반환합니다.

 

연속 사용 가능

#include <iostream>

using namespace std;

int main()
{
	int num = 0;

	++(++num);

	return 0;
}

레퍼런스로 반환하므로 전위형 증감 연산자를 연속으로 사용할 수 있습니다.

 

후위형 증감 연산자

int a = 0;
a++;
a--;

앞에서 순서대로 읽으면, 후위형 증감 연산자는 변수 a의 값을 사용하고, 그 후에 1을 증감시킵니다.

 

정확히는 변수 a의 값을 1 증감시키지만, 증감시키기 전의 값을 사용합니다.

이를 이해하려면, 후위형 증감 연산자의 내부 동작을 확인해야 합니다.

 

내부 동작

후위형 증감 연산자는 아래와 같은 과정을 통해 작동합니다.

 

 

1. 현재 값을 복사해서 저장합니다.

2. 기존 값에 1을 증감시킵니다.

3. 복사본을 반환합니다. 

 

연속 사용 불가능

복사본을 반환하므로 후위형 증감 연산자는 연속으로 사용할 수 없습니다.

 

연산자 오버로딩 적용

위의 내용을 바탕으로 int 기능을 하는 Int 클래스를 만들어 보겠습니다.

 

클래스 및 멤버 변수 선언

먼저, Int 클래스를 선언하고 멤버 변수인 _num를 추가하겠습니다.

class Int
{
public:

private:
	int _num;
};

 

생성자

int형 데이터를 받을 수 있는 생성자를 선언하겠습니다.

class Int
{
public:

	// 생성자 추가
	Int(int num) : _num(num) {}

private:
	int _num;
};

 

 

전위형 증감 연산자 오버로딩

전위형 증감 연산자는 아래와 같은 형태를 가지고 있습니다.

Int& operator++()

 

위 형태로 전위형 증감 연산자를 오버로딩하겠습니다.

class Int
{
public:

	Int(int num) : _num(num) {}

	// 전위형 증감 연산자 추가
	Int& operator++()
	{
		++_num;
		return *this;
	}
	
	Int& operator--()
	{
		--_num;
		return *this;
	}

private:
	int _num;
};

 

후위형 증감 연산자 오버로딩

후위형 증감 연산자는 아래와 같은 형태를 가지고 있습니다.

Int operator++(int)

전위형 증감 연산자와 달리 매개 변수에 int가 추가됩니다.

또한, 레퍼런스를 반환하는 것이 아니라 복사본을 반환합니다.

 

위 형태로 후위형 증감 연산자를 오버로딩하겠습니다.

class Int
{
public:

	Int(int num) : _num(num) {}

	Int& operator++()
	{
		++_num;
		return *this;
	}
	
	Int& operator--()
	{
		--_num;
		return *this;
	}

	// 후위형 증감 연산자 추가
	Int operator++(int)
	{
		Int temp = *this;
		++_num;
		return temp;
	}

	Int operator--(int)
	{
		Int temp = *this;
		--_num;
		return temp;
	}

private:
	int _num;
};

 

출력 함수 추가

private 영역에 선언된 멤버 변수 _num을 가져올 수 있는 getter 함수를 선언 및 정의하겠습니다.

class Int
{
public:

	Int(int num) : _num(num) {}
	
    // Getter 함수 추가
	int getNum() const { return _num; }

	Int& operator++()
	{
		++_num;
		return *this;
	}
	
	Int& operator--()
	{
		--_num;
		return *this;
	}

	Int operator++(int)
	{
		Int temp = *this;
		++_num;
		return temp;
	}

	Int operator--(int)
	{
		Int temp = *this;
		--_num;
		return temp;
	}

private:
	int _num;
};

 

결과 출력

직접 만든 Int 클래스를 바탕으로 전위형과 후위형 증감 연산자를 사용해 보겠습니다.

#include <iostream>

using namespace std;

class Int
{
public:

	Int(int num) : _num(num) {}

	int getNum() const { return _num; }

	// 전위형 증감 연산자
	Int& operator++()
	{
		++_num;
		return *this;
	}
	
	Int& operator--()
	{
		--_num;
		return *this;
	}

	// 후위형 증감 연산자
	Int operator++(int)
	{
		Int temp = *this;
		++_num;
		return temp;
	}

	Int operator--(int)
	{
		Int temp = *this;
		--_num;
		return temp;
	}

private:
	int _num;
};

int main()
{
	Int num = 100;

	++(++num);
	// 102
	cout << num.getNum() << endl;

	// (num--)--;

	// 102
	cout << (num--).getNum() << endl;

	// 100
	cout << (--num).getNum() << endl;

	return 0;
}

위 코드를 실행하면, 다음과 같은 결과가 나옵니다.

 

cout << (num--).getNum() << endl;

해당 코드는 num을 감소시키기 전의 복사본에 대해서 getNum() 함수를 호출하므로, 102가 출력됩니다.

 

cout << (--num).getNum() << endl;

해당 코드는 num이 가지고 있는 데이터를 참조 반환하므로, 감소시킨 후의 결과인 100이 출력됩니다.

 


03. 마무리

오늘은 전위형과 후위형의 증감 연산자 오버로딩에 대해서 알아보았습니다.

내일부터 Int 클래스에 다양한 연산자를 오버로딩함으로써 추가해 보도록 하겠습니다.


04. 연관 내용

 


 

읽어주셔서 감사합니다.

틀린 내용 지적은 언제나 환영입니다!

'게임 개발 > C++' 카테고리의 다른 글

[C++] friend 키워드  (0) 2025.04.01
[C++] 연산자 오버로딩 - 2. 사칙 연산자  (0) 2025.03.31
[C++] 람다 함수 - 2. 활용  (0) 2025.03.26
[C++] 람다 함수 - 1. 기본 형태  (0) 2025.03.25
[C++] 동적 할당 - new/delete  (0) 2025.03.21