[C++] 연산자 오버로딩

2024. 2. 4. 08:12·Programming Language(Sub)/C++

연산자 오버로딩


연산자 오버로딩이란?

  • 프로그래밍 언어에서 기존에 정의된 연산자를 사용자가 직접 정의한 데이터 타입이나 클래스에 대해 재정의하는 것

  • 메서드 이름 형식 : "(operator)(연산자)"

  • 메서드 이름을 통해 함수를 직접 호출할 필요 없이 연산자 만으로 호출할 수 있다.

  • 다른 클래스에 속하는 객체 간의 연산의 경우에도 가능하다

    • v1이라는 벡터가 있을 때, v1 * 1.6 은 멤버 연산자를 통해 연산자 오버로딩이 가능

    • v2이라는 벡터가 있을 때, 1.6 * v1 은 벡터 클래스에 속하지 않는 비멤버 연산자를 통해 연산자 오버로딩이 가능

  • ex) 벡터의 합을 구할 때 덧셈, 뺄셈, 나눗셈, 곱셈(스칼라)을 사용자가 직접 정의함

      class Vector2 {
      public:
          // Vector2() : x(0), y(0) {}
          Vector2();
          // Vector2(float x, float y) : x(x), y(y) {}
          Vector2(float x, float y);
          // get함수는 const로 선언하는 것이 좋음
          // float GetX() const { return x; }
          float GetX() const;
    
          // float GetY() const { return y; }
          float GetY() const;
    
          // 멤버 연산자
          Vector2 operator+(Vector2 rhs) const;      // 프로토타입
          Vector2 operator-(Vector2 rhs) const;      // 프로토타입
          Vector2 operator*(const float rhs) const;  // 프로토타입(벡터에 실수 곱하는 함수)
          Vector2 operator/(const float rhs) const;  // 프로토타입(벡터에 실수 나누는 함수)
          float operator*(Vector2 rhs) const;        // 연산자 오버로딩
                                                  /*
                                                      return Vector2(x + rhs.x, y + rhs.y);
                                                      // rhs.GetX()를 사용 안해도 된다.
                                                      // 참조 : https://blog.naver.com/PostView.naver?blogId=tipsware&logNo=221667799577
                                                  */
    
      private:
          float x;
          float y;
      };
    
      Vector2::Vector2() : x(0), y(0) {}
      Vector2::Vector2(float x, float y) : x(x), y(y) {}
    
      float Vector2::GetX() const { return x; }
      float Vector2::GetY() const { return y; }
    
      // 비 멤버연산자
      // 멤버 메서드가 아니므로 const로 함수를 선언하지 않는다
      Vector2 operator*(const float a, const Vector2 b) {  // ex) 1,6 * Vector2typeclass
          return Vector2(a * b.GetX(), a * b.GetY());      // 전역함수라 get 함수 사용.
      }
    
      // 멤버연산자
      Vector2 Vector2::operator+(const Vector2 rhs) const {
          return Vector2(x + rhs.x, y + rhs.y);
      }
      Vector2 Vector2::operator-(const Vector2 rhs) const {
          return Vector2(x - rhs.x, y - rhs.y);
      }
      Vector2 Vector2::operator*(const float rhs) const {  // ex) Vector2typeclass * 1.6
          return Vector2(x * rhs, y * rhs);
      }
      Vector2 Vector2::operator/(const float rhs) const {
          return Vector2(x / rhs, y / rhs);
      }
      float Vector2::operator*(const Vector2 rhs) const {  // Vector의 스칼라 곱. Vector 각 성분끼리 곱의 합.
          return x * rhs.x + y * rhs.y;
      }
    
      int main(void) {
          Vector2 a(2, 3);
          Vector2 b(-1, 4);
          cout << a.GetX() << " , " << a.GetY() << '\n';
          cout << b.GetX() << " , " << b.GetY() << '\n';
          Vector2 c = a - b;
          Vector2 c1 = a + b;
          /* c1과 동일한 결과
          Vector2 d1 = a.operator+(b);
          Vector2 d2 = Sum(a, b); // "Sum 함수 --> 멤버 메서드의 활용 참고"
           */
          Vector2 c2 = a * 1.6;  // 비멤버 연산자가 없다면 1.6 * a는 에러 발생
          Vector2 c3 = a / 2;
          float c4 = a * b;
          Vector2 c5 = 1.6 * a; // 비멤버 연산자
          cout << c.GetX() << " , " << c.GetY() << '\n';
          cout << c1.GetX() << " , " << c1.GetY() << '\n';
          cout << c2.GetX() << " , " << c2.GetY() << '\n';
          cout << c3.GetX() << " , " << c3.GetY() << '\n';
          cout << c4 << '\n';
          cout << c5.GetX() << " , " << c5.GetY() << '\n';
      }
    • Vector2 Add(Vector2 rhs) --> Vector2 operator+(Vector2 rhs)

      • 멤버 연산자

      • Vector2 c1 = a + b 로 호출 가능

    • Vector2 operator*(const float a, const Vector2 b)

      • 비멤버 연산자

      • Vector2 c5 = 1.6 * b 로 호출 가능

참조) 두들낙서 C/C++ 강좌

'Programming Language(Sub) > C++' 카테고리의 다른 글

[C++] 깊은 복사와 얕은 복사(Deep Copy, Shallow Copy)  (0) 2024.03.12
[C++] 동적할당  (0) 2024.02.04
[C++] 멤버 메서드의 활용  (0) 2024.02.04
[C++] 상수형 매개변수와 상수형 메서드  (0) 2024.02.04
[C++] 클래스(Class) (2) - 정적 멤버, 정적 메서드  (0) 2024.01.30
'Programming Language(Sub)/C++' 카테고리의 다른 글
  • [C++] 깊은 복사와 얕은 복사(Deep Copy, Shallow Copy)
  • [C++] 동적할당
  • [C++] 멤버 메서드의 활용
  • [C++] 상수형 매개변수와 상수형 메서드
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (456)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (129)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (5)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[C++] 연산자 오버로딩
상단으로

티스토리툴바