치춘짱베리굿나이스

[Rank 4] CPP 02 본문

42/42s Cursus

[Rank 4] CPP 02

치춘 2022. 9. 11. 22:35

Ad-hoc polymorphism, operator overloading and Orthodox Canonical class form

임시 다형성, 연산자 오버로딩과 캐노니컬 클래스

임시다형성?

자바스크립트에서의 객체지향 (1) 객체지향 기본

 

자바스크립트에서의 객체지향 (1) 객체지향 기본

객체지향 올 것이 왔다 자바스크립트 프로그래밍을 하면서 그 편의성 때문에 클래스를 종종 이용하는데, 물론 잘 알고 쓰는 것은 아니다 심지어 자바스크립트의 클래스는 정석적인 클래스도..

blog.chichoon.com

예전에 정리했던 객체지향 글 복붙 (자스 기준이긴 하지만…)

여기서 임시 다형성이란 ‘같은 이름을 가진 함수가 타입에 따라 다르게 행동할 수 있는 성질' 이라고 정리했었다

오버로딩이 그 예이자 임시다형성 그 자체이며, 이름은 같은 함수들이 매개변수나 반환값에 따라 서로 다른 동작들을 하는 것을 볼 수 있다

연산자 오버로딩

1 + 2 = 3
"hello " + "world" = "hello world"

같은 + 연산자임에도 불구하고, 양 쪽에 있는 값의 타입에 따라 다르게 동작하고 있다

정수형 변수일 경우 사칙연산의 덧셈처럼 작용하여 두 수를 더한 값을 반환하고, 문자열 변수일 경우 문자열 두 개를 이어붙이는 기능을 한다

이처럼 같은 생김새에도 매개변수의 타입에 따라 서로 다른 동작을 하는 것을 (위에 적었듯) 오버로딩이라 하며, 연산자 오버로딩은 같은 연산자도 타임에 따라 다른 기능을 하도록 구현해주는 것이다

정통 캐노니컬 클래스

뭐..뭐요..?

암만 검색해봐도 42 관련 글들만 실컷 검색되는데 (…) 간략하게 적자면 C++98 ~ C++03 시절에 권장하던 클래스 작성 형식이다

다음과 같은 구성요소가 필수로 들어간다:

  • 기본 생성자
    • 새로운 인스턴스를 생성한다
  • 복사 생성자
    • 같은 클래스의 인스턴스 참조를 인자로 받아, 그 프로퍼티와 메서드를 복사한 새로운 인스턴스를 생성한다
  • 복사 대입 연산자 오버로드
    • a = b 처럼 대입 연산자를 사용할 경우, b 인스턴스의 프로퍼티와 메서드를 a에 복사할 수 있도록 하는 연산자 오버로딩을 구현한다
  • 기본 소멸자
    • 인스턴스가 소멸할 때 호출되는 그것이다 (바이바이)

정통 캐노니컬 클래스 (OCCF) 구현

class Foo {
    public: 
        Foo(); // 기본 생성자
        Foo(const Foo& instance); // 복사 생성자
        Foo& operator=(const Foo& instance); // 복사 대입 연산자 오버로드
        ~Foo(); // 소멸자
};
  • 기본 생성자
    • 인자로 아무것도 받지 않는다
  • 복사 생성자
    • 인자로 같은 클래스의 인스턴스 참조를 받는다
  • 복사 대입 연산자 오버로드
    • 인자로 같은 클래스의 인스턴스 참조를 받는다
  • 소멸자
    • 인자로 아무것도 받지 않는다

연산자 오버로딩 구현

[type] operator[operator]([arguments]);
// 예시: int operator+(const int num);

함수명을 지을 때 operator 옆에 연산자를 지정하면 해당 연산자의 오버로딩 메서드를 구현할 수 있다

예를 들어 =의 오버로딩을 구현하고 싶다면 operator= 이렇게

사용할 때는 [인스턴스1] = [인스턴스2] 와 같이 보편적인 연산자 사용하듯 사용하면 오버로딩 연산자가 호출된다

복사 생성자 구현

Foo::Foo(const Foo& instance) {
    *this = instance; // 복사 대입 연산자 호출
}

Foo& Foo::operator=(const Foo& instance) {
    _value = instance.getValue();
    return (*this);
}
Fixed::Fixed(const Fixed& instance) {
    std::cout << "Copy constructor called\n";
    *this = instance;
}

Fixed&    Fixed::operator=(const Fixed& instance) {
    std::cout << "Copy assignment operator called\n";
    _fixedValue = instance.getRawBits();
    return *this;
}
  1. 복사 대입 연산자 =의 오버로딩 구현
    • 복사 대입 연산자는 인자로 받은 인스턴스의 _fixedValue 값을 가져와 새로 생성할 인스턴스에 넣어준다
    • 해당 클래스에서 인스턴스별로 차이가 나는 부분이 _fixedValue 밖에 없으므로 해당 값만 복사해도 상관없다
  2. 복사 생성자에서 해당 대입 연산자 호출
    • 일단 Fixed 객체를 생성하고, 생성한 객체에 복사대입 연산자를 통해 프로퍼티 값만 가져와서 넣어준다

'42 > 42s Cursus' 카테고리의 다른 글

[Rank 4] CPP 04  (0) 2022.09.11
[Rank 4] CPP 03  (0) 2022.09.11
[Rank 4] CPP 00 ~ 01  (0) 2022.09.10
[Rank 4] CPP Module  (0) 2022.06.17
[Rank 2 / 3] Minitalk / Minishell - 시그널이란  (1) 2022.04.28
Comments