Page 128

연산자를 오버로딩하는 함수나 메서드를 작성할 때 몇 가지 결정할 사항이 있다. 이들을 하나씩 살펴보자.

1 메서드와 전역 함수 가장 먼저 오버로딩할 연산자를 클래스의 메서드로 정의할지, 전역 함수(주로 클래스의 friend ) 로 정의할지 선택해야 한다. 그러기 위해서는 먼저 두 방식의 차이점부터 알아야 한다. 연산자가 클래스의 메서드일 때는 연산자를 사용한 표현식의 좌변은 반드시 그 클래스의 객체여야 한다. 반면 전역 변수로 정의하면 좌변에 다른 타입의 객체를 적을 수 있다. 연산자는 다음과 같이 크게 세 종류가 있다. 반드시 메서드로 정의해야 하는 연산자 : 어떤 연산자는 클래스 문맥을 벗어나면 의미가 없기 때문에 반드

시 어떤 클래스에 속한 메서드여야 한다. 예를 들어 operator=은 소속 클래스와 밀접한 관계에 있어서 클 래스와 별도로 존재할 수 없다. 15.1.5절 ‘오버로딩할 수 있는 연산자’에 나온 표를 보면 어떤 연산자를 반 드시 메서드로 정의해야 하는지 볼 수 있다. 나머지 연산자는 이런 제약이 없다. 반드시 전역 함수로 정의해야 하는 연산자 : 연산자의 좌변에 소속 클래스가 아닌 다른 타입의 변수도 나와

야 한다면 연산자를 전역 함수로 만들어야 한다. 대표적인 예로 좌변에 연산자가 속한 클래스 객체가 아닌 iostream 객체가 나와야 하는 operator<<와 operator>>가 있다. 또한 이항 연산자인 +나 -처럼 교환 법칙을 따르는 연산자는 반드시 좌변에 연산자가 속한 클래스가 아닌 타입의 변수가 나와야 한다. 이에 대 해서는 9장에서 설명한다. 메서드와 전역 함수 둘 다 가능한 연산자 : 현재 C++ 프로그래머 사이에서 연산자를 오버로딩할 때 메서

드로 만들어야 할지 아니면 전역 함수로 만드는 것이 나은지 의견이 분분하다. 필자가 생각하는 원칙은 앞 에서 설명한 것처럼 특별히 전역 함수로 만들어야 할 이유가 없다면 무조건 메서드로 만드는 것이 좋다. 이 원칙이 좋은 이유는 메서드로 만들면 virtual로 선언할 수 있지만 전역 함수는 그럴 수 없기 때문이다. 따 라서 여러 연산자를 같은 상속 계층에 속하도록 오버로딩하려면 메서드로 만드는 것이 좋다.

메서드로 오버로딩한 연산자가 객체를 변경하지 않는다면 반드시 const로 선언해야 한다. 그래 야 const 객체에 대해서도 그 연산자를 호출할 수 있다.

2 인수 타입에 대한 결정사항 인수 타입에 대해서는 선택할 사항이 많지 않다. 앞에서 설명했듯이 인수 개수를 변경할 일이 별 로 없기 때문이다. 예를 들어 operator/를 전역 함수로 만들 때는 인수가 반드시 두 개여야 하 고, 메서드로 만들면 인수를 한 개만 받을 수 있다. 이 규칙에 어긋나면 컴파일 에러가 발생한다. 이런 점에서 연산자 함수는 일반 함수와 다르다. 일반 함수를 오버로딩할 때는 매개변수 개수에 제약이 없다. 또한 오버로딩할 연산자의 타입을 마음껏 정할 수 있지만, 실제로는 연산자가 속

692 3부 전문가답게 C++ 코딩하기

Profile for 한빛미디어

전문가를 위한 C++ (개정4판) - 맛보기  

『전문가를 위한 C++』(개정4판)은 새로 추가된 기능과 관련 도구를 비롯해 C++에 대한 모든 내용을 코드와 솔루션 위주로 소개한다. 저자는 실전 프로그래밍에 적용할 수 있는 현실적인 기법을 다양하게 소개하였으며, 본 교재는 C++를 더 깊이 이해하...

전문가를 위한 C++ (개정4판) - 맛보기  

『전문가를 위한 C++』(개정4판)은 새로 추가된 기능과 관련 도구를 비롯해 C++에 대한 모든 내용을 코드와 솔루션 위주로 소개한다. 저자는 실전 프로그래밍에 적용할 수 있는 현실적인 기법을 다양하게 소개하였으며, 본 교재는 C++를 더 깊이 이해하...

Advertisement