<aside> 💡 목차


</aside>

객체를 인풋 파라미터로 넣을땐 무조건 & , const

![void function(**const** class**&** className) **const**

입력변수 내부의 const는 입력 객체를 보호하는것 입력변수 외부의 const는 호출 객체를 보호하는것](https://prod-files-secure.s3.us-west-2.amazonaws.com/09ccd4d5-876c-4bba-bbdf-cc77a0a11257/7c909988-4cf9-4b4f-8936-3395a5db0682/Untitled.png)

void function(**const** class**&** className) **const**

입력변수 내부의 const는 입력 객체를 보호하는것 입력변수 외부의 const는 호출 객체를 보호하는것

아까말한 객체를 인풋파라미터로 넣는 경우에는 무조건 패스바이 밸류로 넣어줘야하고, 앞에 const를 붙여주는게 필수됨(사실 권장인데 그냥 필수로 붙여!)
근데 그림에는 입력변수 밖에 const가 또 있네요?

입력변수에 들어간 const만 볼때는, other.mX, other.mY 갖다 쓰지만 

입력 객체의 값을 바꾸지는 않아서 아무 문제가 없어요, 

하지만 함수를 호출한 객체의 멤버변수mX, mY 값을 바꾼다고 하죠? 

근데 이때 const가 붙어 있다면 컴파일 에러가 날겁니다. 

"자 너는 const 안에서 아무것도 바꿀 수 없다고 하는데 바꾸려고했어!"

→ const 하고 & 를 왜 강제함?

1. 콘스트 무조건 왜 붙여야함?
	-> 이미 선언된 객체의 데이터는 보호되어야하니 콘스트를 붙여줘야함.

2. 레퍼런스타입 왜붙임?
	-> 만약 값에의한 복사를 하면, 원래 객체를 그대로 복사해와야하는데, 이러면 생성자가 만들어져야함, 즉, 메모리도 부족하고 무엇보다 큰 오버헤드가 발생함
	-> 그 복사될 객체가 큰값을 가지고있으면 너무 부담돼~
	-> 그래서 모든 객체의 인풋파라미터를 가지고올땐 래퍼런스타입으로 가져온다.