핵심 개념
1. 연산자 함수: 연산자를 이용하듯 호출할 수 있는 메서드
2. 연산자 다중정의: 필요에 따라 연산자 함수를 다중 정의하는 것
학습 목표
1. 연산자와 연산자 함수의 차이
2. 연산자 함수의 다중 정의의 의미
3. 연산자 함수의 정의 및 선언 등
1. 연산자 함수: 연산자를 이용하듯 호출할 수 있는 메서드
- 왜? =>사용자가 훨씬 더 간결한 방법으로 코드 작성 코드의 확장성 (간결성, 확장성)
- “절대로 논리 연산자들을 다중정의해서는 안된다.”
ð 심각한 논리적 오류 왜?
2. 산술 연산자
- 산술 연산자일 경우 CMyData 형식을 반환
ð 이동 생성자가 호출
ð 이름 없는 임시 객체 호출
Ø 산술 연산 후 원본 인스턴스는 결과가 바뀌면 안됨
Ø 따라서, 임시객체를 생성하고 그 객체에 연산 결과를 저장, 리턴 후 소멸
ð CMyData& 로 반환 할 경우 ( a = b + c; )일 때,
Ø b + c 연산 결과 후 호출자 함수로 가면, 함수에서 계산된 값은 사라지고, (함수에서 생성된 객체는 함수 종료 후 사라지므로) 그 사라진 값의 주소를 반환하므로 a에는 원치 않는 결과를 대입하는 결과 발생
∴ 임시 객체를 의도적으로 생성
3. 대입 연산자 (4.3.1절 참고)
- 대입 operator를 다중정의 할 때, 기존의 메모리를 삭제하고 새로 할당한 메모리에 새로운 데이터를 저장한다.
- 그렇지 않을 경우 (메모리 차이로 인한) 데이터 손실 발생
- 주의할 점
n 위에 그대로 짤 경우, 자기 자신을 대입할 때( a = a; )
u 자기 자신의 주소를 삭제하고 대입을 하게 된다.
u 따라서, 먼저 자기 자신일 경우 그대로를 반환해주는 작업을 한다.
n 대입, 즉 데이터 저장을 한다고 반환을 void형식으로 할 경우
u ( a = b = c; )에서 b = c에서 void를 반환하고, (a = void)가 되므로 논리적으로 옳지 않다.
u 따라서 반환 형식을 CMyDat&로 전달한다.
A. 복합 대입 연산자
- ( += / -= etc..)
B. 이동 대입 연산자 ( != 대입연산자)
i. ( a = b + c; )에서 b + c는 임시객체가 생성되고 그 임시객체를 대입 연산자를 실행하면 이동 대입 연산자 호출됨
ii. 사라질 임시 객체에 대해 결과를 얕은 복사를 통해 주소만 지정해준다.
ð 메모리의 효율성
- (4.3.3절 참고)
4. 배열 연산자
- 배열의 개념
n “주소에 옵셋을 수행하여 계산된 주소를 다시 간접 지정하여 정보를 읽거나 쓰는 일련의 과정” – 열혈강의 최호성의 C 프로그래밍 295.p
n 위 개념에서 더 단순하게 작업하기 위해 [] 연산자를 생성함 == 배열
- 즉, []이 연산자 이므로 다중정의 가능하다.
- Int& operator[] (int nIndex);
n 일반적인 경우 이 연산자 함수가 사용됨
n r-value, l-value 모두 사용됨
- Int operator[] (int nIndex) const;
n 상수형 참조일 경우만 호출됨
n R-value로만 사용됨
- 경계검사(bounds checking): 변수가 사용되기 전에 어떤 경계 내에 위치하는지를 검사하는 기법(위키백과)
- C,C++에서 기본배열은 경계검사를 하지 않음
5. 관계 연산자: 상등 및 부등 연산자 + 비교 연산자
- 관계 연산 결과 자료형은 int 형
- 실습 참고
6. 단항 증감 연산자
- (전위식): int operator++()
- (후위식): int operator++(int)
- 후위 연산자가 가장 우선순위가 높음
우선순위 |
연산자 |
우선순위 |
연산자 |
1 |
x++ |
9 |
^ |
2 |
++x |
10 |
| |
3 |
* |
11 |
&& |
4 |
+ |
12 |
|| |
5 |
<< |
13 |
? : |
6 |
< |
14 |
= |
7 |
== |
15 |
, |
8 |
& |
A. 예제 후위 연산 함수 설명
n 후위 연산은 먼저 선언된 함수를 먼저 실행하고 후에 증가를 시키는 것이 목적
ð 따라서, 후위식 증가 연산자에서 멤버 백업(int nData = m_nData;)를 하고,
ð 백업한 값을 반환한다.
Ø 보기에는 후위처리 연산을 하지만
Ø 이미 인스턴스에선 값이 1 증가가 되었다.
연습문제
1. 대입 연산자 오버로딩 시 주의할 점 두가지 이유
A. 자기 자신을 대입할 경우를 대비해야 한다.
n 함수에서 기존의 데이터를 삭제하기 때문에
n 자기 자신의 주소를 삭제하고 대입을 하게 된다.
B. void 형식으로 반환해서는 안된다.
n 두 변수 이상 대입할 경우 ( a = b = c )
n a = void 형식이므로 적절하지 않다.
2. 각종 대입 연산자들의 적절한 반환 형식
A. 자기 자신의 주소를 반환한다.
3. 후위식 단항 증가 연산자 작성(함수 원형을 예로)
A. int operator++(int);
'C++ > 이것이 C++이다.' 카테고리의 다른 글
Ch7. 상속 심화 (0) | 2021.01.15 |
---|---|
Ch6. 상속 기본 (0) | 2021.01.15 |
Ch4. 복사 생성자와 임시 객체 (0) | 2021.01.15 |
Ch3. 클래스 (0) | 2021.01.15 |
Ch2. C++ 함수와 네임스페이스 (0) | 2021.01.15 |
최근댓글