C++언어 공부/개념 공부

2024.01.31 C++ 언어 공부 6일 차 (동적 바인딩, 가상 함수, 인터페이스)

코딩입문시작 2024. 2. 1. 12:03

가상 함수 (virtual function)

  • 부모 클래스의 메소드에 virtual을 붙이게 되면 가상 함수가 되면서, 부모 포인터로 업캐스팅 했을 시, 오버라이딩(재정의) 된 함수를 사용하게 해주는 방법이다.

※ 가상 함수가 존재하는 경우, 소멸자에도 virtual 키워드를 추가해줘야 자식 클래스의 소멸자가 호출된다.
이 작업을 하지 않는다면 자식 클래스의 소멸자가 호출되지 않는다. 

 

가상 함수 추가!

  • 가상 함수는 자식 클래스가 재정의할 수 있는 함수이다. 만약 상속 관계가 아니라면 가상 함수를 선언할 필요가 없으므로 가상 함수는 상속 계층내에서만 의미가 있으며 자식 클래스에게 재정의 기회를 주기 위해 존재하는 것이라고 할 수 있다. 그러나 가상 함수를 반드시 재정의해야만 하는 것은 아니다.
  • 부모 클래스의 동작 그대로 쓰고 싶다면 단순히 상속만 받고 변경할 필요가 있을 때만 재정의하면 된다.
  • 부모 클래스가 가상 함수를 만드는 이유는 혹시라도 재정의하고 포인터로 호출할 때를 대비한 것이다.
    가상 함수는 재정의해도 되는 함수이지 반드시 재정의해야 하는 함수는 아니다. 

 

동적 바인딩

  • 가상 함수는 자신을 호출하는 객체의 타입, 즉 동적 타입에 따라 실제 호출될 함수가 결정된다. (포인터)
  • 실행 중에 호출할 함수를 결정하는 결합 방법을 동적 결합(바인딩) 이라고 한다.
  • 주소->메소드() 호출문을 미리 고정된 번지로 가서 호출하는 것이 아닌, 주소가 가리키는 객체의 타입에 따라 적절한 함수를 선택해서 호출하는 코드로 번역해야 하는 것이다.
  • 이렇게 해야 전달된 객체에 따라 각기 다른 동작을 할 수 있는 다형성을 구현할 수 있다. 

virtual을 적어 주게 된다면, 부모 클래스가 호출되는 것이 아닌, 정확히 말하자면 부모클래스에서 자식 클래스에 재정의된 함수를 사용하는 것이다. == 동적 바인딩

 

 

순수 가상 함수 (강제성 + 가상함수) 

  • 순수 가상 함수는 자식 클래스에서 반드시 재정의해야 하는 함수이다.
    ex) 전자제품 마다의 on off 기능
  • 장점? 실수를 안하게 된다.
  • 순수 가상 함수는 일반적으로 함수의 동작을 정의하는 본체(바디)를 가지지 않는다. 그러므로 이 상태에서는 호출할 수 없다.
  • 본체가 없다는 뜻으로 함수 선언부의 끝에 =0 이라는 표기를 하는데 이는 함수만 코드가 비어있다는 뜻이다.

 

 

추상 클래스

  • 순수 가상 함수를 멤버로 가지는 클래스

 

인터페이스 

  • 순수 가상 함수로만 이루어진 클래스를 인터페이스라고 한다. 멤버 변수는 가지지 않는다.
  • 인터페이스를 상속 받는 클래스들은 반드시 인터페이스 안에 있는 모든 함수들을 전부 재정의해야 한다.
  • 인터페이스 클래스 이름 앞에 I를 붙여주는 것이 관습이다. 

 

다중 상속

  • 두 개 이상의 부모 클래스를 하나의 자식 클래스에 상속하는 것이다.
  • 이미 잘 동작하는 클래스들을 다중 상속해서 새로운 클래스를 만들어 낼 수 있다는 것은 참으로 좋은 기능이다.
    하지만 여러가지 문제점도 있고, 복잡도에 비해 실용성이 떨어지는 문법이기는 하다.

 

모호성

  • 함수나 변수의 이름이 각각 다른 클래스에서 이름이 같을 시에, 메인 함수에서 호출시 어디 클래스에서 받아온건지 알려주어야 한다!