가상 함수와 추상 클래스
2025년 10월 30일 09시
카테고리 -
LECTURE,
객체지향프로그래밍II
객체지향프로그래밍II(김정준) 9주차 강의내용
가상 함수와 오버라이딩
- 가상 함수(virtual function)
- virtual 키워드로 선언된 멤버 함수
- virtual 키워드의 의미
◼ 동적 바인딩 지시어
◼ 컴파일러에게 함수에 대한 호출 바인딩을 실행 시간까지 미루도록 지시
class Base {
public:
virtual void f(); // 가상 함수
};
-
함수 오버라이딩(function overriding)
- 파생 클래스에서 기본 클래스의 가상 함수와 동일한 이름의 함수 선언
◼ 기본 클래스의 가상 함수의 존재감 상실시킴
◼ 파생 클래스에서 오버라이딩한 함수가 호출되도록 동적 바인딩
◼ 다형성의 한 종류
- 용어 정리
◼ 오버라이딩 : 가상 함수를 재정의
◼ 함수 재정의 : 일반 함수를 재정의
- 가상 함수를 통해 파생 클래스에서 재정의할 함수에 대한 인터페이스를 제작 가능
-
동적 바인딩
- 파생 클래스에 대해
- 기본 클래스에 대한 포인터로 가상 함수를 호출하는 경우
- 객체 내에 오버라이딩한 파생 클래스의 함수를 찾아 실행
◼ 실행 중에 이루어짐
◼ 실행시간 바인딩, 런타임 바인딩, 늦은 바인딩으로 불림
- 오버라이딩의 성공 조건
◼ 가상 함수 이름, 매개 변수 타입과 개수, 리턴 타입이 모두 일치
- 오버라이딩 시 virtual 지시어 생략 가능
◼ 가상 함수의 virtual 지시어는 상속됨, 파생 클래스에서 virtual 생략 가능
-
가상 함수의 접근 지정
◼ private, protected, public 중 자유롭게 지정 가능
-
범위 지정 연산자(::)
- 정적 바인딩 지시
- 기본클래스::가상함수() 형태로 기본 클래스의 가상 함수를 정적 바인딩으로 호출
- 가상 소멸자
◼ 소멸자를 virtual 키워드로 선언
◼ 소멸자 호출 시 동적 바인딩 발생
순수 가상 함수와 추상 클래스
- 기본 클래스의 가상 함수 목적
- 파생 클래스에서 재정의할 함수를 알려주는 역할
◼ 실행할 코드를 작성할 목적이 아님
- 기본 클래스의 가상 함수를 굳이 구현할 필요가 있을까?
- 순수 가상 함수(pure virtual function)
- 함수의 코드가 없고 선언만 있는 가상 멤버 함수
- 선언 방법
◼ 멤버 함수의 원형=0;으로 선언
class Shape {
public:
virtual void draw()=0; // 순수 가상 함수 선언
};
- 추상 클래스 : 최소한 하나의 순수 가상 함수를 가진 클래스
-
추상 클래스의 특징
- 온전한 클래스가 아니므로 객체 생성 불가능
- 추상 클래스의 포인터는 선언 가능
-
추상 클래스의 목적
- 추상 클래스의 인스턴스를 생성할 목적 아님
- 상속에서 기본 클래스의 역할을 하기 위함
◼ 순수 가상 함수를 통해 파생 클래스에서 구현할 함수의 형태(원형)을 보여주는 인터페이스 역할
◼ 추상 클래스의 모든 멤버 함수를 순수 가상 함수로 선언할 필요 없음
- 추상 클래스의 상속
- 추상 클래스를 단순 상속하면 자동 추상 클래스
- 추상 클래스의 구현
- 추상 클래스를 상속받아 순수 가상 함수를 오버라이딩
◼ 파생 클래스는 추상 클래스가 아님