virtual 키워드는 메서드,속성, 인덱서 또는 이벤트 선언을 한정하는데 사용된다.
파생 클래스에서 필요에 따라서 재정의(override) 할 수 있지만 필수적으로 재정의 할 필요는 없다.
Virtual 한정자를 사용한 클래스는 완벽한 기능을 제공할 수 있다.
abstract 키워드를 사용하면 불완전하여 파생 클래스에서 구현해야하는 클래스 및 클래스 멤버를 만들수 있다.
추상클래스의 사용 목적은 여러개의 파생 클래스에서 공유할 기본 클래스의 공통적인 정의를 제공하는 것이다.
추상 클래스는 인스턴스화할 수 없다.
virtual과 abstract는 대부분 비슷하게 사용 되지만 구현체의 존재유무에 차이점을 가진다.
쉽게 이야기하면 abstract으로 선언된 것이 있는 경우 해당 위치에서 명시적으로 구현이 된 것이 아니고, 상속 받은 위치에서 구현을 하도록 맡기는 것이다. 그리고 상속 받은 클래스에서는 abstract를 구현하지 않으면 에러가 나기 때문에 클래스를 구조화할 경우 해당 클래스를 상속 받아서 필수적으로 구현해야하는 것과 아닌 것을 나눌 수 있다.
예를들어 여러명이 같은 프로젝트를 할때, 다른 사람의 의도를 정확히 알기 어렵기 때문에 이런 기능을 이용하면 해당 클래스를 상속 받아서 사용하는 프로그래머 입장에서는 따로 설명을 하지 않아도 이를 인지할 수 있게 된다.
이와 반대로 virtual은 상속 받은 클래스에서 따로 구현을 할 필요가 없다. 필요할 경우에만 구현을 하게 된다.
즉, 팀 단위의 작업을 할 때, 따로 기능구현을 해주어야 한다고 명시하기 위해 사용하는 경우가 많다.
사람들이 많이 플레이하는 '리그오브레전드' 를 예시로 든다면 모든 챔피언은 같은 공격기능과 멈추는 기능을 가지고 있다. 이런 공통적인 기능은 virtual로 구현하면 된다.
하지만 챔피언마다 QWER 4개의 스킬은 각기 다르게 가지고 있다. 이런 경우에는 abstract로 구현을 하게 된다.
공격과 멈추는 기능은 virtual이 아닌 일반 함수로 구현 하여도 상관없지만, 기본공격 동작 외에 다른 동작을 추가하고 싶다면(세트평타와 같은) 각 캐릭터마다 필요한 동작을 추가하면 된다.
이렇게 나머지 abstract로 정의된 함수들은 이를 상속받은 클래스에서 구현하게 된다. override로 각 캐릭터마다 특별한 스킬을 구현해 주면 하나의 챔피언이 완성되게 된다.
-Virtual은 하나의 기능을 하는 완전한 클래스이며, 파생클래스에서 상속해서 추가적인 기능추가 및 virtual 한정자가 달린 것을 재정의해서 사용가능하다
-Abstract는 여러개의 파생 클래스에서 공유할 기본 클래스의 공통적인 정의만 하고 , 파생클래스에서 abstract 한정자가 달린 것을 모두 재정의(필수)해야 한다.