Part2::Ch 02. 연산자 오버로딩- 04. 논리 연산자 오버로딩

2025. 5. 2. 12:32Programming Language/C++

반응형

C++에서 논리 연산자 오버로딩(Logical Operator Overloading)은 &&, ||, ! 등의 논리 연산자를 사용자 정의 타입에서 사용할 수 있도록 기능을 확장하는 것을 말한다.

다만, 주의할 점이 많고 제한도 존재하기에 오버로딩을 하기에는 조심스러운 연산자라는 점을 이해하고 시작해보자.

 

이번에도 String 클래스를 하나 생성해서 한번 확인해보도록 하자.

  

1. !(NOT)연산자

먼저 NOT연산자에 대해서 보자면 , 먼저 해당 타입에 대한 반환값은 bool타입이 될 것이다.

먼저 우리가 만들 NOT 연산자 오버로딩에 대해서 구체적으로 말해보자면 파이썬이나 자바스크립트같은 곳에서 

이렇게 문자열의 내부에 값이 존재할때는 !s가 false가 되고 

이렇게 빈문자열이 오면 true가 되는 NOT 연산자를 만들어 보려고 한다.

 

그래서 return 할때 객체의 문자열에 어떤 값이 존재하는지를 확인해보면 되는데 이때 그냥 문자열의 길이가 0이라면 아무런 값도 없는 것으로 true를 반환해주면 된다.

실행해보면

이렇게 값을 비교해서 true를 반환하는 것을 확인할 수 있다.

 

이 연산의 문제는 !연산자의 반대인 

이 연산은 지금 시점에서 구현이 불가능하다는 점이다.

 

그래서 사실 not 연산자 오버로딩은 그렇게 많이 하는 경우는 없다고 한다.

 

그런데 사실 이 not 연산자는 해도 문제가 딱히 없는데 and 연산자와 or 연산자의 경우에는 문제가 조금 크게 발생한다.

 

2. &&(AND) 연산자와 ||(OR) 연산자

AND연산자와 OR 연산자의 경우는 오버로딩 하려면 먼저 뼈대만 먼저 만들어보면 우선 둘 다 이항 연산자기에 먼저 매개변수가 필요해진다.

이 매개변수는 bool 타입이 될 것이고(String 타입도 올 수 있는데 우선 왜 문제점이 있는지를 보기 위해서 bool 타입을 매개변수로 받아보려고 함) 

비교를 위한 함수를 임의로 하나 전역으로 선언하는데 내부에서 호출되면 콘솔에 호출되었다 내용을 띄우고 true를 return해주는 형태로 구현해보자.

 

이제 operatior에서 값을 return 할때 객체의 멤버 변수에 값이 존재하거나 b 가 true인 경우를 or 연산 해본다고 해보자.

원래라면

이 비교를 할때 s가 true가 나온다면 func()가 실행되지 않는 단락연산을 수행해서 func 함수의 출력문이 출력되면 안될텐데

이렇게 둘 다 실행되는 것을 볼 수 있다.

이는 결국 

s || func()
    ↓
s.operator||(func());

과 같이 일반 함수로써의 부름과 동일하여 func()를 호출할 수 밖에 없게 되는 것이다.

 

또한 이 논리 연산자의 경우는 시퀀스 포인터로써 AND 연산 혹은 OR연산이 나오기 이전까지의 결과가 모두 평가가 되어 있어야 하는데 보면 연산자를 만난 후에 좌항의 결과를 확인하기 때문에 시퀀스 포인터로써 역할을 할 수 도 없다는 것을 알 수 있다.

 

그래서 결국 AND연산자와 OR연산자의 연산자 오버로딩에 대해서는 많은 생각과 주의를 요한다는 점을 알아둬야 한다.

 

반응형