더북(TheBook)

클래스에 operator==()operator<()만 정의하면 std 네임스페이스에 선언된 rel_ops 네임스페이스에는 필요할 때 두 연산자 함수를 이용해 !=, >, >=, <= 연산자 함수를 생성할 수 있는 함수 템플릿이 들어 있다. 따라서 using 지시자로 std::rel_ops만 활성화해두면 이들 네 가지 함수를 정의하는 작업을 안 해도 된다. std::rel_ops 네임스페이스의 템플릿으로 생성되는 연산자 함수 중에 하나라도 직접 정의한 함수가 있다면 std::rel_ops 네임스페이스의 템플릿에서 생성되는 연산자 함수보다 직접 정의한 함수가 우선순위를 갖는다. operator<() 함수는 특수하다. 이 함수는 순서 관계(ordering relation)라고 부른다. 순서 관계는 검색과 비교 알고리즘에서 중요하게 쓰인다.

operator==() 함수는 두 컨테이너나 객체가 같은 내용을 갖고 있는지 테스트한다. 여기에는 다소 흥미로운 부분이 있다. 두 연산자 x, y가 있으면 (x<y || y<x || x==y)는 셋 중에 하나는 반드시 true이므로 이 식도 true라고 생각할 것이다. 그러나 반드시 그렇게 동작하는 것은 아니다. x==ytrue이면 x<ytrue가 될 수 없고, y<xtrue가 될 수 없는 것은 분명하다. 한 가지 확신할 수 있는 것은 상등한(equal) 원소들은 서로 다를 수 없다는 것이다. 그러나 x!=y일 때 x<yy<x 중에 어느 하나가 true일 것이라고 가정해서는 안 된다. (!(x<y))&&(!(y<x))true일 때 xy는 동등관계(equivalent)라고 한다. 간단히 말하자면 정렬할 때 선호도(preference)가 없다는 뜻이다. 일반적인 예가 대소문자를 구분하지 않고 문자열을 정렬하는 것이다. 대소문자 무시일 때 문자열 "A123""a123"은 동등관계다(어느 쪽도 우선하지 않는다). 즉, 둘은 같지도 않고, 상등(equal)하지도 않다.**

반복자 클래스가 반드시 정의해야 하는 나머지 연산들은 반복자 카테고리에 따라 정해진다. 1장에서 각 카테고리에 해당하는 연산들을 봤을 것이고, 이들 연산은 카테고리에 따라 누적되는 형태이므로 가장 상위 카테고리인 랜덤 액세스 반복자는 전체 연산을 지원해야 한다.

** 역주

STL에서는 두 값이 같은지 판단하는 두 가지 방법이 있다. 하나는 두 값이 완전히 같은지 판단하는 것, 즉 equality를 판단하는 것이다. 이를 상등관계라고 한다. 이 방법은 operator==()로 판단하며, x==y이면 두 값이 같다고 판단한다. 주로 find() 계열에서 이 방법이 쓰인다. 다른 하나는 두 값의 동등관계를 판단하는 것, 즉 equivalence를 판단하는 것이다. 이 방법은 operator<()로 판단하며 x==y 대신 !(x<y) && !(y<x)로 판단한다.

데이터를 내부에서 정렬된 순서로 관리하는 컨테이너는 동등관계(equivalence)로 값을 넣기 때문에 operator<()를 사용한다. 정렬된 순서이므로 값이 크냐, 작냐로 판단하는 것이다.

반대로 값을 찾을 때는 상등관계(equality)를 사용하므로 operator==()을 사용한다. 즉, 값이 일치하느냐로 판단한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.