2019/10/22

4

C++ 추상화 기초 클래스(abstract base class; ABC)와 순수 가상 함수(pure virtual function)

추상화 기초 클래스(abstract base class) 추상화 기초 클래스는 기초 클래스로 쓰이고 순수 가상 함수가 1개 이상의 클래스를 추상화 기초 클래스라고 부릅니다. 줄여서 ABC라고 부르기도 합니다. 그리고 이 추상화 기초 클래스의 모든 멤버 함수가 순수 가상 함수일 때 인터페이스(Interface)라고 부릅니다. 이러한 추상화 기초 클래스를 상속받는 클래스를 구체화 클래스(concrete class)라고 부릅니다. 추상화 기초 클래스는 기초 클래스로부터 상속받는 여러가지 클래스가 있을 때, 공통적인걸 하나로 묶는 클래스입니다. 하나로 묶으면서 파생 클래스마다 다른 동작을 해야하는건 순수 가상 함수로 선언을 합니다. "대충 이런일은 할 건데 이 행동은 파생 클래스마다 다를 거니까 설계만 해놓았어..

프로그래밍/C++ 2019.10.22 Plorence

C++ 접근 제어자 - protected

protected는 public과 private특징을 섞었습니다. 멤버 변수에 protected를 지정하면 파생 클래스에서는 public처럼 접근이 가능하지만 객체에서는 직접 접근이 불가능합니다. #include using namespace std; class Person { private: int stat; protected: int power; public: virtual void Show(int A) { cout

프로그래밍/C++ 2019.10.22 Plorence

C++ 가상 함수의 동작 원리

C++는 가상 함수들이 어떻게 동작해야 하는지 규정하고 있고 그 구현은 컴파일러 개발자의 몫입니다. 구현된 방법을 알면 가상 함수의 개념을 좀 더 잘 이해할 수 있습니다. 컴파일러는 가상 함수를 어떻게 처리하는가? 먼저 각각의 객체에 숨겨진 멤버를 하나씩 추가합니다. 숨겨진 멤버는 함수의 주소들로 이루어진 배열을 지시하는 포인터를 저장합니다. 일반적으로 그 배열을 가상 함수 테이블(VirTual Function Table, 줄여서 vtbl)이라고 합니다. vtbl에는 클래스의 객체들을 위해 선언된 가상 함수들의 주소가 저장되어 있습니다. 기초 클래스의 한 객체는 그 클래스를 위한 모든 가상 함수들의 주소로 이루어진 테이블을 지시하는 포인터를 가집니다. 파생 클래스도 가상 함수들의 주소로 이루어진 별개의 ..

프로그래밍/C++ 2019.10.22 Plorence

C++ 정적 결합(Static Binding)과 동적 결합(Dynamic Binding)

프로그램이 함수를 호출할 때 실행 코드의 어느 블록이 사용되는지에 대한 대답은 컴파일러에게 있습니다. 먼저 소스 코드에 있는 함수 호출을 특정 블록에 있는 함수 코드를 실행하라는 뜻으로 해석하는 것을 "함수 이름을 결합(binding)이라고 합니다. C언어에서는 각각의 함수가 별개의 함수에 해당하기 때문에 이 작업이 간단하지만(함수 오버 로딩이 없음.) C++에서는 함수 오버 로딩 때문에 이 작업이 조금 복잡합니다. 이 결합은 컴파일 타임에 이루어지고 이 결합을 정적 결합(static binding)또는 초기 결합(early binding)이라고 합니다. 하지만 가상 멤버 함수(virtual 키워드가 달린)들은 프로그램이 실행할 때 사용자가 객체를 결정하기 때문에 컴파일 타임에는 진행할 수 없습니다. 그..

프로그래밍/C++ 2019.10.22 Plorence