지난 포스팅 인터페이스에서 잠시 언급된 추상과 가상에 대한 이야기를 하도록 하겠습니다. 추상과 가상을 먼저 이야기 했으면 좋았겠지만, 제 포스팅은 그냥 의식의 흐름으로 적는 포스팅이기 때문에 순서가 엉망입니다. 우선 인터페이스에 대한 이야기가 궁금하시면 아래 포스팅을 참고해주세요.
https://math-development-geometry.tistory.com/39
우선 추상은 키워드 abstract를 사용합니다. 클래스나 함수, 속성, 인덱서 앞에 제한자로 사용이 가능합니다. 가상은 키워드 virtual을 사용하고 함수나 속성, 인덱서 앞에 사용할 수 있습니다. 여기서 abstract와 virtual은 대부분 비슷하게 사용되지만 차이점은 구현체의 존재 유무입니다.
정리하면 abstract가 사용가능한 범위는 함수, 속성, 인덱서, 이벤트, 클래스
virtual은 함수, 속성, 인덱서, 이벤트에서 사용 가능합니다.
자, 이제 사용 범위에 대해서 알아봤는데요. 큰 차이점은 구현체의 유무라고 했는데요. 쉽게 이야기하면 abstract으로 선언된 것이 있는 경우 해당 위치에서 명시적으로 구현이 된 것이 아니고, 상속 받은 위치에서 구현을 하도록 맡기는 것입니다. 그리고 상속 받은 클래스에서는 abstract를 구현하지 않으면 에러가 나기 때문에 클래스를 구조화할 경우 해당 클래스를 상속 받아서 필수적으로 구현해야하는 것과 아닌 것을 나눌 수 있는데요. 여러명이 같은 프로젝트를 할때, 다른 사람의 의도를 정확히 알기 어렵기 때문에 이런 기능을 이용하면 해당 클래스를 상속 받아서 사용하는 프로그래머 입장에서는 따로 설명을 하지 않아도 이를 인지할 수 있게 됩니다. 이와 반대로 virtual은 상속 받은 클래스에서 따로 구현을 할 필요가 없습니다. 필요할 경우에만 구현을 하게 됩니다.
그럼 예를 들어서 abstract와 virtual이 어떻게 사용되는지 알아보도록 하겠습니다. 이번에는 게임 캐릭터를 예로 들어보겠습니다. (제 머리 속에는 LoL 을 생각하고 글을 쓰고 있어요. )
일반적으로 A를 누르면 공격이고 S를 누르면 멈추는 기능이 있죠? 이런 공통적인 기능은 virtual로 구현하면 됩니다. 모든 캐릭터가 공격과 멈추는 기능은 같기 때문입니다. 하지만 QWER와 같은 스킬은 전부 다르죠. 그런 경우 abstract으로 구현합니다. 왜냐면 모든 케릭터는 QWER에 스킬 3개와 궁극기가 있기 때문이죠. 코드를 보면서 이야기를 정리해보도록 하겠습니다.
BaseCharacter라는 클래스는 이렇게 구현할 수 있겠습니다. 물론 Attack() 과 Stop() 은 virtual 이 아닌 일반 함수로 구현하여도 상관없지만, 기본 공격동작 외에 다른 동작을 추가하고 싶다면 각 캐릭터마다 필요한 동작을 추가하면 됩니다. 그리고 나머지 abstract으로 정의된 함수들은 실제로 BaseCharacter에서 구현하지 않고 이를 상속한 클래스에서 구현하게 됩니다.
이런 식으로 Character A를 구현할 수 있습니다. override 된 함수에 각 캐릭터마다 특별한 스킬을 구현해주면 한개의 캐릭터가 완성되는 것이죠. 이번에는 Character B를 구현해볼께요. 이때 Attack()과 Stop() 함수를 override 해보도록 하겠습니다.
CharacterA에 비해서 CharacterB는 Attack()과 Stop()을 override 하여 새로운 기능을 추가해주었습니다. 그리고 base.Attack()과 base.Stop()함수는 상속 받은 클래스의 구현된 함수로 들어가기 때문에 기존에 구현한 기능은 그대로 수행하게 됩니다. 만약에 base 함수를 지우게 되면 파생 클래스에서 구현한 동작은 실행되지 않습니다. 만약에 기존의 Attack() 기능을 사용하지 않고 완전 새로운 기능을 추가하고 싶다면 base 함수를 삭제하여도 되는 것이죠.
'C# Programming' 카테고리의 다른 글
C# - Design Pattern / 디자인 패턴의 종류와 간단한 정리 (0) | 2019.07.30 |
---|---|
C# - sealed class 들어봤니? (0) | 2019.07.12 |
C# - interface 인터페이스 사용법과 원리 (0) | 2019.07.10 |
C# - ConcurrentBag 사용법, 안전하게 데이터 관리하기 (0) | 2019.07.09 |
C# - Parallel 사용법, 병렬처리 쉽게 하기 (0) | 2019.07.08 |