· [중급자를 위한 유니티 스크립팅 튜토리얼] - Static
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 제네릭(Generic)
· [중급자를 위한 유니티 스크립팅 튜토리얼] - 상속
이 시리즈는 유니티에서 제공하는 튜토리얼을 정리해서 올린 것입니다.
--------------------------------------------------------------------------------------------------------------------------------------------------
다형성
다형성은 클래스가 두 가지 이상의 타입을 가질 수 있도록 하는 상속의 한 기능이다.
상속 계층구조 내에서 자식클래스는 부모클래스라고 할 수 있다. (is a 관계)
이 말은 부모클래스가 요구될때 자식클래스를 사용할 수 있다는 뜻이다.
--------------------------------------------------------------------------------------------------------------------------------------------------
위와 같은 상속 구조가 있다.
그리고 당신은 씬에 있는 enemy를 상속받는 모든 오브젝트의 컬렉션을 만들고싶다.
orc클래스의 컬렉션, goblin클래스의 컬렉션을 따로 만드는 대신
orc와 goblin을 포함하는 enemy클래스의 컬렉션을 만들어 한 번에 관리할수있다.
마찬가지로 orc, goblin, player를 모두 포함하는 humanoid 콜렉션을 만들어 한 번에 관리할 수 있다.
이것이 바로 다형성이다.
--------------------------------------------------------------------------------------------------------------------------------------------------
다형성은 메서드의 매개변수에도 적용이 된다.
OnTrigger()메서드들을 생각해보자
OnTrigger메서드의 매개변수로 Collider를 가지고 있으며
BoxCollider, Sphere Collider 같은 다양한 Collider를 매개변수로 받을 수 있다.
이런 다양한 종류의 Collider는 모두 Collider라는 부모 클래스를 상속받기에 가능한 것이다.
상속에서도 설명했듯이 그 반대는 성립하지 않는다.
부모클래스를 필요로하는곳에 자식클래스를 넣을수는있지만
자식클래스를 필요로하는곳에 부모클래스를 넣을수는 없다.
--------------------------------------------------------------------------------------------------------------------------------------------------
업캐스팅
업캐스팅은 자식클래스의 인스턴스를 생성후 부모클래스를 참조하는 것을 말한다.
이렇게 생성된 parentclass는 부모클래스의 멤버에만 접근할 수 있다.
--------------------------------------------------------------------------------------------------------------------------------------------------
parentclass가 자식클래스의 멤버에 접근하기 위해선 다운캐스팅을 해주어야한다.
혹은
이를 통해 업캐스팅된 클래스도 다운캐스팅을 통해 정상적으로 자식클래스의 멤버에 접근할 수 있다.
--------------------------------------------------------------------------------------------------------------------------------------------------
멤버 하이딩
상속을 통하면 자식 클래스는 부모 클래스의 멤버를 모두 물려받는다.
자식 클래스에서 부모 클래스의 멤버를 다시 만들거나 선언하는 것을 멤버 하이딩이라고 한다.
부모 클래스의 멤버를 하이딩하기 위해선 멤버의 타입앞에 new 키워드를 사용하면 된다.
--------------------------------------------------------------------------------------------------------------------------------------------------
humanoid를 상속받는 enemy를 상속받는 orc클래스의 계층구조를 생각해보자
humanoid에서 정의된 yell이라는 메서드에는 함성을 지르는 기능이 구현되어있다.
enemy클래스는 이 메서드를 하이딩해 공격력을 증가시키는 기능을 구현했다.
orc클래스는 이 메서드를 다시 하이딩해 특정한 장소로 이동하는 기능을 구현했다.
만약 humanoid 클래스의 컬렉션에 humanoid, enemy, orc클래스가 들어있고
이 컬렉션의 모든 클래스에게 yell 메서드를 호출하면 어떻게 될까?
멤버 하이딩의 여부에 관계없이 모두 함성을 지르는 yell메서드,
즉 humanoid의 yell 메서드가 호출될 것이다.
자식클래스에서 멤버하이딩을 통해 멤버를 재정의해도
업캐스팅을 거치면 무용지물이 된다.
이는 우리가 원하는 바가 아니다.
다형성의 의미(여러가지 형태를 갖는 것)를 상실했기 때문이다.
즉 멤버 하이딩은 우리가 지양해야할 기능임을 알 수 있다.
그렇다면 이를 해결하기 위한 기능은 무엇일까?
--------------------------------------------------------------------------------------------------------------------------------------------------
메서드 오버라이딩
메서드 오버라이딩은
부모클래스에서 정의된 메서드를 자식클래스에서
확장하거나, 재정의할수있는 기능이다.
메서드 오버라이딩을 사용하기 위해선 먼저 부모클래스에서
메서드를 virtual의 형태로 선언해야 한다.
그 후에 자식클래스에서 부모클래스의 메서드를 override한다.
자식클래스에서 override된 메서드는
앞서 했던 멤버하이딩과는 다르게 업캐스팅된 이후에도 override된 버전의 메서드가 실행된다.
--------------------------------------------------------------------------------------------------------------------------------------------------
만약 부모메서드의 기능은 그대로 유지하고 일부 기능을 추가하고싶을때는 base키워드를 사용한다.
base뒤에 부모클래스의 메서드이름과 괄호를 적어주면된다.
이렇게 하면 부모클래스의 기능 Do something을 유지하고
and another one 이라는 기능을 추가할 수 있다.
--------------------------------------------------------------------------------------------------------------------------------------------------
다형성과 업캐스팅, 멤버 하이딩, 오버라이딩은 밀접한 관계를 맺고있다.
다형성이라는 성질을 구현하기 위한 업캐스팅. 멤버 하이딩과 업캐스팅 조합의 한계. 그 한계를 극복하기 위한 메소드 오버라이딩.
오버라이딩을 통한 다형성의 구현 등 유기적으로 얽혀있는 개념이기에 이해가 어려울 수 있다.
댓글 1