이 글은 PC 버전 TISTORY에 최적화 되어있습니다.
서론
우리는 하나의 클래스로 여러 객체를 생성하는 것을 배웠습니다. 하지만 하나의 클래스로 만든 객체는 속성, 메소드가 다 똑 같기 때문에 너나 할 것 없이 같은 행동을 하고 같은 속성을 띌 것입니다. 우리는 이를 해결하기 위해 저번 파트에서 다뤘던 상속과, 오버라이드 함수를 통해서 다형성을 구현해보록 하겠습니다.
다형성에 대하여
다형성은 상속의 뒤를 이어 객체 지향 프로그래밍의 특징을 보여줍니다. 상속 계층도에서 부모 클래스가 가상 메소드를 만들고 파생되는 클래스 계층에서 이를 오버라이드(재정의)하여 각각의 파생 클래스 별로 다른 기능을 수행하도록 하는 것입니다. 부모 클래스에서 protected(상속 받은 객체만 사용 가능) virtual(가상의)로 메소드를 생성하고 이를 파생 클래스에서 override로 재정의 하여 사용합니다.
다형성 예제
Enemy 클래스 입니다. 이전에 배운 프로퍼티로 age, hp, name을 만들었고, 생성자에서 초기화 했습니다. 중요한 것은 Hit() 함수를 호출 했을 시에 실행되는 shout() 함수입니다. 부모 클래스를 통해 이 함수를 호출하면 내용이 없기 때문에 아무 반응도 일어나지 않습니다. 하지만 파생 클래스에서 재정의하여 사용하기 위해 virtual 키워드를 달아줍니다. |
Monster 클래스에서는 기존의 Monobehaviour 클래스를 상속하지 않고 Enemy 클래스를 상속합니다. 그러므로 내장함수 start(), update() 함수를 사용할 수 없음은 물론이고, print문도 사용 불가하기 떄문에 Debug.Log 를 통해서 자신이 누구임을 밝히도록 하겠습니다. 여기서 base라는 것은 부모 클래스인 Enemy 클래스를 의미합니다. |
Animal 클래스도 Monster 클래스와 별반 다를 것 없는 모습입니다. base.shout(); 를 지운 이유는 부모클래스의 shout 함수에 기능이 없기 때문에 빼도 상관 없기 때문입니다. |
부모의 가상 메소드가 어떻게 파생 클래스에서 재정의 되었는가를 보여줍니다. 이를 통해 객체마다 다른 기능을 할 수 있는 '다형성'을 구현했습니다. 이제 테스트를 해봐야겠죠. |
7 : Enemy 클래스는 Monster와 Animal 클래스의 부모이므로 두 객체 모두 담을 수 있다. 13 - 14 : Monster와 Animal 객체를 변수에 저장해준다. 25 - 27 : Enemy와 파생 클래스들의 객체 파라미터로 받아서 mySelf 변수에 할당해준다. 17 - 21 : GameObject.Find 를 통해서 게임 오브젝트를 찾아서 할당해주고, 컴포넌트 중 EnemyCube 스크립트를 찾아 SetParm을 통해 Monster 객체가 mySelf에 담기도록 한다. 29 - 33 : 담긴 객체의 Hit() 함수를 실행시킨다. |
각 큐브를 클릭해보면 위와 같이 자신 클래스에 재정의 된 Hit() 메소드를 실행시키는 것을 알 수 있습니다.
'Frontend > Unity' 카테고리의 다른 글
[유니티 디버깅] ② Debug.Log는 만능 해결사? (0) | 2016.08.03 |
---|---|
[유니티 디버깅] ⑦ 모노디벨롭을 통한 디버깅 (0) | 2016.08.03 |
[유니티 디버깅] ① 컴파일 오류 & 콘솔 (0) | 2016.08.02 |
[유니티 C# 기초 강의] 10. 클래스와 상속 (2) | 2016.07.25 |
[유니티 C# 기초 강의] 9. 프로퍼티 (8) | 2016.07.25 |
[유니티 C# 기초 강의] 8. 반복문 (2) | 2016.07.25 |