C++

상수형 매개변수와 상수형 메서드

코다람쥐 2021. 12. 23. 14:05

https://www.youtube.com/watch?v=ii9ZAOxlOU0&list=PLlJhQXcLQBJqywc5dweQ75GBRubzPxhAk&index=65 

 

1. 은행계좌 클래스를 통해 보는 상수형 메서드

#include <iostream>

using namespace std;

class Account {

public:
Account() : money(0) { }
Account(int money) : money(money) { }

void Deposit(int d) {
money += d;
cout << d << "원을 예금했다!!" << endl;
}

void Draw(int d) {
if (money >= d) {
money -= d;
cout << d << "원을 인출했다!!" << endl;
}
}

int viewMoney() {
return money;
}

private:
int money;
};

int main() 
{
Account doodle(100);

doodle.Deposit(100);
doodle.Draw(20);

cout << doodle.viewMoney() << endl;
}

위와 같은 코드에서 실수로 money멤버 변수에 접근하여 돈 계산에 대한 버그가 나버리면 은행에서는 큰 일로 번질 수도 있다.

 

예를들어,

	int viewMoney() {
		money++;
		return money;
	}

viewMoney메서드에서 money++;를 하는 어처구니 없는 실수를 했다고 가정을 하면

지능적인 사람들은 viewMoney()메서드를 100만번 호출하여 100만원을 공짜로 얻는 것을 이용할 것이다.

그래서 이러한 실수를 방지하기 위해서 메서드를 상수화시키면 된다.

상수형 메서드는 자기가 속한 클래스의 멤버변수를 변경하지 못하게 막는 역할을 한다.

 

 

	int viewMoney() const {
		money++;
		return money;
	}

이렇게 메서드 뒤const 키워드를 붙여주면 "money++;"은 구문오류가 뜨게 된다.

const int viewMoney()가 아니고 int viewMoney() const임을 다시한번 명심하자.

 

참고로 const int viewMoney()는 출력값을 상수형으로 바꾸는 역할을 하는데 별로 중요하진 않고 잘 쓰이지도 않는다.

 

2. 은행계좌 클래스를 통해 보는 상수형 매개변수

1.의 코드중에서 또 다른 실수를 했다고 가정하자.

	void Deposit(int d) {
		d = money;
		money += d;
		cout << d << "원을 예금했다!!" << endl;
	}

이번엔 코드가 길어져서 실수를 하게 되어 매개변수d에 접근하여 돈복사가 되는 버그가 터졌다고 가정한다.

이러면 예금할 때마다 돈이 2배로 늘어나는 코드가 되어버린다.

	void Deposit(const int d) {
		d = money;
		money += d;
		cout << d << "원을 예금했다!!" << endl;
	}

이러한 실수를 방지하기 위해 매개변수 앞const 키워드를 넣어주면 매개변수 d값을 변경하려고 할 때 구문오류가 발생한다.