인프런 커뮤니티 질문&답변
operator< 오버로딩 때...
작성
·
366
0
const 를 파라미터에 넣어주시고 함수 뒤에 또 const를 넣어주신 이유가 무엇이죠? parameter에 const를 넣어주신 이유는 입력 b를 유지하기 위한 것인가요?
답변 1
2
이 질문을 많이 해서 예전 답변을 복사붙여넣기 합니다. 원 질문과 답변은 79번 원더랜드 prim MST 영상에 있습니다.
연산자 오버로딩인 operator< 함수는 원래 const 로 만들고, 매개변수도 const 로 받는 것이 바람직합니다.
크루스칼에서 구조체 벡터를 정렬할 때도 const를 사용해 operator< 함수를 만들기 바랍니다. 아무래도 벡터와 sort 함수는 사용자가 많이 사용하는 라이브러리다 보니 보안이 느슨해서 const 를 하지 않아도 에러 없이 작동해서 그렇게 썼던것 같습니다. 바람직하지 않았던 것 같습니다. 우선순위큐 자료구조는 보안이 엄격해 const를 사용하지 않으면 에러가 납니다. 연산자 오버로딩을 할 때는 어떤 자료구조에 사용하건 const 사용을 무조건 하시기 바랍니다.
bool operator<(const Edge &b)const {
return val > b.val;
}
에서 Edge &b는 구조체를 값으로 받지 않고 주소로 받은 것입니다. 이렇게 하는 이유는 아무래도 구조체는 기본형 변수보다는 덩치가 있어서 값으로 받으면 프로그램 속도가 느려집니다. 그래서 주소로 받아 속도를 높이기 위한 것입니다. 그런데 주소로 받으면 operator< 함수가 구조체의 주소에 접근해 값을 변경할 수 있는 가능성이 있어 보안에 취약해 집니다. 그래서 const Edge &b 처럼 읽기 전용으로 선언해 operator< 가 구조체의 값을 변경하지 못하도록 하는 것입니다.
C++ 클래스에서 함수 헤더 뒷부분에 const를 붙이는 함수를 상수멤버함수라고 합니다. 상수멤버함수는 객체의 멤버변수를 읽기만 하지 값을 변경할 수 없는 함수입니다.
즉 둘다 보안을 위해 const를 붙이는 것이며, 우선순위큐 자료구조는 연산자 오버로딩 함수가 const로 작성된 것일때만 에러없이 작동을 합니다.





