본문 바로가기

C++

Chapter 5. 연산자 오버로딩(Operator Overloading)

Chapter 5. 연산자 오버로딩(Operator Overloading)
1. friend

 

 - 전역함수로 선언된 함수가 어떤 Class의 friend 함수로 선언되면 해당 Class의 신뢰를 얻어 private로 선언된 멤버 변수로 접근이 가능하다.
 - Class 자체를 friend로 선언해 사용할 수도 있다.
 - 일반적으로 Class 내에서 선언된 private 멤버 변수는 Class 내에서만 직접접근이 가능하며 다른 함수에서 접근하기 위해서는 간접 접근을 해야 하는데 friend 함수로 선언하면 함수 내에서 직접 접근이 가능해진다. 

 

 

2. 연산자 오버로딩(Overloading)
 - 연산자 오버로딩(Overloading)의 특징
  · 연산자 오버로딩(Overloading)은 함수 오버로딩(Overloading)과 유사한 개념이며 연산자를 함수로 선언해 또 다른 기능을 추가하는 것을 말한다.
  · 연산자 오버로딩(Overloading)은 Class를 데이터형으로 사용할 수 있다.
 - 연산자 오버로딩(Overloading) 함수 정의

  · 연산자 오버로딩(Overloading) 함수는 Class 멤버 함수를 정의하는 방법과 전역 함수로 정의하는 방법으로 나뉘며 Class 멤버 함수로 정의할 때는 Class내에서 정의하고 전역 함수로 정의할 때는 friend로 정의한다.
  · Class 멤버 함수로 오버로딩(Overloading)된 경우

  ◦ Class의 멤버함수를 호출할 수 있도록 연산자의 왼쪽 피연산자는 호출객체가 되고 오른쪽 피연산자는 인자로 전달되어 연산된다.
  · 전역 함수로 오버로딩(Overloading)된 경우

  ◦ 전역 함수로 오버로딩(Overloading) 함수를 정의하는 경우 피 연산자의 정보를 모두 넘겨줘야 하기 때문에 왼쪽 피연산자는 첫 번째 인자, 오른쪽 피연산자는 두 번째 인자로 함수에 전달된다.
- 단항 연산 오버로딩(Overloading)

 · Class 멤버 함수로 오버로딩(Overloading)된 경우

 · 전역 함수로 오버로딩(Overloading)된 경우

  ◦  Class 멤버 함수로 Overloading

 

 

 

 

  ◦  전역 함수로 Overloading

 

  ◦ 단항 연산자의 오버로딩도 Class의 멤버 함수로 정의하는 방법과 전역 함수로 정의 하는 방법으로 나뉘며 Class 멤버 함수로 정의하는 경우 피연산자는 호출객체가 되고 전역함수로 정의하는 경우 피연산자는 매개변수가 된다.
  · 전위 연산과 후위 연산의 정의(Class 멤버 함수)

   ◦  전위 연산 정의 

   ◦  후위 연산 정의

 

  ◦ 전위 연산의 경우 호출객체를 먼저 연산하기 때문에 기본형으로 만들면 되지만 후위 연산은 나중에 연산이 되기 때문에 int를 매개변수의 맨 마지막에  넣어주어야 한다.
 - 반환형에서의 const
  · const로 선언된 객체는 멤버변수의 변경이 불가능하며 const 참조자만 참조가 가능하다.
  · const 객체는 const 함수만 호출가능
  · 후위 증가 및 감소연산의 const
  ◦ 단항 연산자를 오버로딩(Overloading)할 때 const로 정의하는데 이는 허용하지 않은 연산의 컴파일을 허용하지 않기 위해서이다.
 - 연산자 Overloading의 제약
  · 연산자 우선순위는 변경될 수 없으며 연산자의 피연산자 개수는 바꿀 수 없다.
  · 연산자 Overloading 함수는 어떤 동작을 수행해도 상관은 없지만 연산자 고유의 기능을 뺏을 수는 없다.
  · 연산자 Overloading 함수는 기본 값(Default Parameter)을 가질 수 없다.
  · 연산자 Overloading에서 사용할 수 없는 연산자 

연산자

설명

.

 멤버 접근 연산자

.*

 멤버 포인터 연산자

::

 범위 지정 연산자

?:

 조건 연산자(3항 연산자)

sizeof

 Byte 단위 크기 계산

typeid

 RTTI 관련 연산자

static_cast

 형변환 연산자

dynamic_cast

 형변환 연산자

const_cast

 형변환 연산자

reinterpret_cast

 형변환 연산자

    ◦  이 연산자들은 다른 용도로 사용되기 때문에 따로 오버로딩(Overloading)이 불가능하다.
  · Class 멤버함수로 연산자로 반드시 오버로딩(Overloading)해야 하는 연산자 

연산자

설명

=

 대입 연산자

()

 함수 호출 연산자

[]

 배열 접근 연산자(index 연산자)

->

 멤버 접근을 위한 포인터 연산자

  ◦ 이 연산자들은 전역 함수로 정의가 불가능하다.

 

3. 기타 연산자 오버로딩(Overloading)
 - Default 대입(=) 연산자

  · 일반 변수에 대입 연산자(=)를 사용하면 변수 대 변수의 복사가 이뤄지기 때문에 문제가 없지만 Class 변수에 대입 연산자(=)를 사용하면 변수 대 변수가 아니기 때문에 문제가 발생해 연산자 오버로딩(Overloading)을 해줘야 한다.
  · 대입 연산자(=)를 오버로딩(Overloading)할 때는 멤버 대 멤버의 복사가 이뤄질 수 있도록 정의해줘야 한다.
 - cin / cout 객체
  · cin
  ◦ istream의 Class 전역 객체
  ◦ cin 객체가 우측 쉬프트(Shift) 연산자(>>)를 오버로딩(Overloading)했기 때문에 우측 쉬프트(Shift) 연산자(>>)로 입력을 수행할 수 있는 것이다.
  · cout
    ◦  ostream의 Class 전역 객체
    ◦  cout 객체가 좌측 쉬프트(Shift) 연산자(<<)를 오버로딩(Overloading)했기 때문에 좌측 쉬프트(Shift) 연산자(<<)로 입력을 수행할 수 있는 것이다.