virtual 키워드가 붙은 가상함수의 정의부를 생략하고,
함수명 옆에 = 0을
붙이거나 abstact를 붙임으로써, 해당 클래스를 객체화할 수 없는
추상클래스로 만드는 함수.
abstract 키워드 사용
= 0 사용
: 파생클래스에서 순수가상함수가 있는 클래스를 상속함으로써,
반드시 해당 기능을 구현해야 한다는 것을 나타내는 역할을 합니다.
기능을 구현하지 않으면 컴파일이 에러 발생시킨다.
순수 가상함수를 하나라도 가지고 있으면 해당 클래스는 추상 클래스가 된다.
추상클래스는 객체화할 수 없다.
언어적으로도 abstact 이므로 구체화할 수 없으며, 선언부를 정의하지 않았기 때문에 함수 호출이 불가능하다.
-> 추상클래스를 상속받으면, 반드시 함수를 오버라이드 해야한다.
추상클래스를 통해 유저가 편리하게 클래스를 재정의할 수 있다.
-> 반드시 재정의해야 한다.
재정의해야 한다!
-> 파생클래스는 추상클래스의 순수가상함수를 통해서 구체화해야 할 함수를
미리 파악할 수 있다.
: 효과적으로 만들기 위한 작업이다. 반드시는 아니지만, 효과적!
함수를 정의하지 말자
멤버 변수를 만들기 말자.
예를 들자면
Animal 클래스에서 공통적인 동작을 이루는 walk 함수를 만들고,
공통적인 변수들도 구성함, 하지만 추상클래스일 경우이다.
-> 이상없다.
회사에서 갑자기 돌고래를 만들어 달라고 할때 문제가 생긴다.
왜냐하면 돌고래는 걷지도 못하고, 다리도 없기 때문이다.
오히려 돌고래는 지느러미가 있다.
-> walk함수를 재정의해야 한다.
다리가 없으니, 새롭게 돌고래에 변수를 만들어야 하고, animal에서의 변수는 사용도 하지 않게된다.
돌고래 뿐만이 아니라 닭 등등 추가할 경우 돌고래와 같은 문제가 발생한다.
따라서 추상클래스에서는 순수가상함수만 선언하고, 멤버변수는 사용하지 말고,
오버로딩 용도로 사용할? 예정인 함수들에 대한 정의도 하지 말자!
효율적인 추상클래스
-> 중복이 되는 클래스의 함수의 경우는 따로 구현 함수를 만들고 다중 상속을
함으로써 중복을 방지할 수 있다.