cents1 과 cents2를 더하고 싶다.
더하는 기능을 함수로 구현해보았지만, 보기에 매우 불편하다. 그냥 int형끼리 더하는 것처럼 + 로 해결할 수 없을까?
그러한 고민의 해답으로 나온 것이 연산자 오버로딩이다.
함수 이름을 연산자로 선언해서 함수처럼 활용하게 하는 것이다.
현재 operator + 함수는 인자를 두 개 받아들이고 있다.
물론 클래스 바깥이면 접근이 불가능하니 인자를 두 개로 받는 것이 맞다.
그런데 클래스 안이면 굳이 인자가 두 개 필요할까 싶은 의문이 든다. 왜?
이미 클래스 안에서 내가 this->를 이용해 하나를 이미 쓸 것이기 떄문이다.
인자는 하나만 받고, 실제 코드에서 this->를 활용해 접근이 가능함을 보여준다.
딱 저 형태만 봤을 때, 아 인자가 하나인데 이 하나는 연산할 때 오른쪽에 위치하는 거구나! 를 인지할 수 있다
_________________________________________________________________________________________________________________________
cout<<p1<<p2 이렇게 할 수 없을까?
하지만 컴파일러는 p1<<p2 이렇게만 하면 뭐 하라는 건지 모른다.
우리가 정확히 표현하자면, p1과 p2 안에 있는 변수를 호출하고 싶은 거겠지?
왜 friend 함수를 써야할까?
우리가 연산자 오버로딩을 할 때
" A << B "" 이라고 하면 A가 첫번째 인자, B가 두번째 인자의 형태가 된다.
그런데 <<를 새로 구현할 때 cout, 즉 out을 왼쪽 인자로 받아야한다. 그래서 friend로 선언한 것이다.
그리고 마지막에 return out을 해주는 이유는, p1<< p2 << p3 이렇게 연결하기 위함이다.
ofstream 즉 out file stream 파일 입출력을 할 때도 동일하게 적용된다.
cin을 구현하기 위해 >>를 선언할 때도 마찬가지로 해주면 되고 대신에 ostream이 아닌 istream이겠지.
__________________________________________________________________________________________________________________________
- 연산자와 ! 연산자를 구현했다. 어렵지 않았다. 코드를 다시 들여다보며 복습하자.
!연산자의 경우 !가 어떤 기능을 하는지에 따라 코드가 바뀌겠지?
== 연산자 역시 마찬가지.
vector<Cents> 20개 짜리 배열을 선언하고
random_shuffle로 배열을 어지럽혀 놓고
다시 정렬을 하려한다.
sort함수의 경우 <를 이용해 대소 비교를 활용해 정렬을 함으로 우리는 < 연산자를 오버로딩 해줘야한다.
______________________________________________________________________________________________________________________
우리는 C나 C++ 문법 초반에 ++전위 연산, ++ 후위연산을 배웠다.
그 연산자들의 기능이 어떻게 다른지 초점을 맞추면 코드 이해가 편하다.
먼저 전위 연산자의 경우 그냥 바로 ++하면 되겠지.
하지만 후위 연산자는?
return은 그대로의 값을 return 해줘야하고, 그 사이에 값을 증가시켜야한다.
그러니 temp 값을 선언해 냅두고 원래 값은 증가시키고, temp 값을 리턴해주면 되겠지.
클래스 안의 배열을 값을 변경하고 가져오는 기능을 하는 코드다. 하지만 보기 매우 불편하다.
그냥 [] 를 바로 쓸 수 없을까?
operator []을 오버로딩 해줬다.
평소 우리가 배열의 []을 활용할 때, 값은 변경하고 싶진 않지만, 해당 값을 출력하고만 싶을 경우는 있다.
이럴 땐 연산자 [] 를 다른 버전으로 두 번 오버로딩해주면 된다.
const int& operator (const int index) const
int& operator(const int index) 이렇게 두 가지로.
또한 [] 안의 값이 0이상이어야겠지? 이럴 땐 assert를 쓰는 것이 좋다. if 문을 활용하면 시간이 너무 오래 걸림.
마지막으로 , 주의 할점.
우리가 동적할당으로 클래스를 활용하려 할때,
IntList* list = new IntList;
하고 나서 그냥 list[3]은 뭘까?
그냥 클래스 배열의 4번째 인덱스다. 이건 우리가 원하는 것이 아니다.
우리가 원하는 것은 , 클래스 배열의 첫번 째 원소 안의 배열 멤버를 변경하는 것이다.
그러니 (*list)[3] 이런 식이 맞겠지.
'C++(따라하며 배우는 C++)' 카테고리의 다른 글
Chapter 9-(3). 연산자 오버로딩 (0) | 2021.10.27 |
---|---|
chapter 9-(2). 연산자 오버로 (0) | 2021.10.10 |
Chapter 8-(2). 객체지향의 기초 (0) | 2021.09.14 |
Chapter 8-(1). 객체지향의 기초 (0) | 2021.09.13 |
Chapter 7-(4). 함수 (0) | 2021.09.07 |