2. 목차
연산자 오버로딩이 필요한 이유
연산자 오버로딩 방법
① 멤버 함수를 사용한 연산자 오버로딩
• 피연산자가 한 개인 경우와 두 개인 경우
② 일반 함수를 사용한 연산자 오버로딩
③ 적절한 const, inline, & 등의 사용
연산자 오버로딩의 규칙 및 주의사항
+ α
① const
② C++ 스타일의 형변환
③ 스마트 포인터
3. 연산자 오버로딩이 필요한 이유
핵심: 클래스 타입을 기본 타입처럼 다룰 수 있게 한다.
(클래스만 가능한 것은 아니고, 구조체도 물론 가능하다.)
예)
• 연산자 오버로딩의 아주 기본적인 형
태이다.
• operator+, operator!= 등 오버로딩 할
연산자를 이름으로 하는 함수를 정의
하면 된다.
• 위 결과처럼 26줄과 27줄은 동일한 작
동을 한다. 즉, 같은 의미이다.
• 이처럼 연산자 오버로딩을 통해, 기존
의 산술 연산, 논리 연산 등을 구조체
나 클래스 자료형에서도 이용하게 할
수 있다.
4. 연산자 오버로딩 방법
1. 멤버 함수를 사용한 연산자 오버로딩
• 클래스의 경우 멤버 변수들이 보통 private
로 선언되는데, 멤버 함수로 연산자 오버로
딩을 할 경우 이에 접근하여 연산이 가능하
다.
5. 연산자 오버로딩 방법
++, -- 연산자의 경우 전치 연산, 후치 연산을 둘 다 정의해야 한
다.
• 복소수 같은 타입을 클래스로 정의할 경우,
++연산 같은 것이 필요할 것인데, 이러한
연산은 전치 연산과 후치 연산을 둘 다 만
들어야 한다.
6. 연산자 오버로딩 방법
2. 일반 함수를 사용한 연산자 오버로딩
• << 연산자처럼 양쪽의 피연산자가
서로 다른 객체일 경우 멤버 함수로
는 연산자 오버로딩이 불가능 하다.
• 따라서 전역 함수로 선언하고 두 피
연산자를 모두 파라미터로 받아 구
현하는데, 해당 객체의 private데이
터에 접근하기 위해 friend 선언을
해주어야 한다.
7. 연산자 오버로딩 방법
3. 적절한 const, inline, & 등의 사용
• 앞에서는 이해가 쉽도록 단순한 형태
로 선언했지만, 실제로 연산자 오버로
딩을 할 때에는 안전성과 속도의 최적
화를 위해 inline, const, 참조자 등을 사
용한다.
• 기본적으로 파라미터는 불필요한 자료
의 복사를 막기 위해 (const Point& p)
이런 식으로 쓰며,
• 대입 연산이 들어가는 +=,-=,*=,/= 등을
제외하고는 함수자체를 상수화 하기
위해 함수선언 뒤에 const를 붙여준다.
• 또한 대입 연산은 자신을 다시 반환하
는 것이기 때문에, 불필요한 복사를 막
기 위해 &를 붙여준다.
8. 연산자 오버로딩의 규칙 및 주의사
항
• 기존 연산 방법을 바꿀 수는 없다.
피연산자 중 적어도 하나는 객
체여야 한다.
• 기존 연산자의 의미를 해치지 않
도록 주의해야 한다.
표 출처: 뇌를 자극하는 C++ 프로그래밍
9. + α
1. const
• 값이 바뀔 이유가 없는 변수들에는 웬만하면 const를 붙여주는 것이 좋다.
• const는 속도 향상, 메모리 최적화에도 도움이 되는 경우가 있다.
• 역시 가장 큰 이유는 안정성에 매우 큰 도움이 되기 때문.
• const 사용법
• 포인터가 가리키는 대상 상수화 : const temp *ptr
temp const *ptr
• 포인터 변수를 상수화 : temp * const ptr
• 둘 다 상수화 : const temp * const ptr
• 함수 반환값 상수화: const int Function() { ... }
• 멤버 함수 상수화 : void Function(int pram) const { ... }
상수 객체에 대해 호출될 함수임을 뜻하는 것.
• 변경 불가능한 객체를 가리키는 반복자(Iterator)가 필요할 때는 const_iterator를 사
용
10. + α
2. C++ 스타일 형변환
• C++은 총 4가지 형변환을 지원함
• 기존 C의 캐스팅 방식은 문제가 많음
(괄호가 많을 경우 알아보기 힘들고, 안전장치가 아무것도 안 되어 있음)
• 따라서 가능하면 C++ 스타일의 캐스팅을 이용하는 게 좋다.
• 상속 계층 구조를 이동할 때는 dynamic_cast 이용
(그러나 안정성이 향상되는 대신 속도가 저하되는 단점이 있어, 성능이 중요한 경우 static_cast
이용)
• const 속성이나 volatile 속성을 제거할 때는 const_cast 이용
• 이외에 대부분의 경우 static_cast 이용
• 나머지 하나인 reinterpret_cast는 일반적으로 허용하지 않는 위험한 형변환을 할 때
사용되며(포인터를 정수로 변환하는 등), 거의 사용할 일이 없다.
11. + α
3. 스마트 포인터
• 포인터에 자동소멸 기능 등을 추가하기 위해 클래스화 시킨 것으로, 기본적으로 소
멸자를 통해 가리키는 객체를 delete시키며, 기존의 포인터와 동일하게 쓰기 위해 .
과 ->에 대한 연산자 오버로딩이 되어있다.
• 개인적으로도 스마트 포인터를 구현하여 사용할 수 있지만, C++11에서 매우 유용
하게 구현된 3가지 스마트 포인터가 있기 때문에 이것을 쓰는 것이 좋다.
• unique_ptr 는 말 그대로 하나밖에 존재하지 않는 포인터로, 동시에 여러 포인터가
같은 데이터를 가리킬 수 없도록 구현되어 있다. (크기: 4바이트)
• shared_ptr 는 참조 카운팅을 내재하여 여러 포인터가 같은 데이터를 가리킬 수 있
도록 하고, 가리키는 포인터가 전부 사라지면 메모리를 해제할 수 있도록 구현되어
있다. (크기: 8바이트)
• weak_ptr 는 shared_ptr 의 순환참조 문제를 방지하기 위해 참조 카운트를 증가시키
지 않고 참조할 수 있도록 하는 shared_ptr 의 부가 서비스 격이다.