프로필사진

Go, Vantage point

가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.


Github | https://github.com/overnew/

Blog | https://everenew.tistory.com/





티스토리 뷰

반응형

 

 

 

다중 상속의 다이아몬드 문제

 

 

유니티에서 생성하는 스크립트들은 기본적으로 MonoBehaviour를 상속하고 있기 때문에 다른 클래스를 상속할 수가 없다.

이는 다이아모드 문제로 인해, C#이 다중 상속을 지원하지 않기 때문이다.

 

다이아몬드 문제란 다중 상속 시 오버라이딩한 메서드의 호출 모호함에서 발생한다.

예를 들어 C#에서 다음과 같이 다중 상속을 진행했다고 생각해보자.

 

 

Child 클래스는 ParentA와 B를 다중 상속하고 있다.

이때 상위의 Work() 메서드를 호출하는 base.Work()를 호출하면 ParentA의 Work()가 실행돼야 할까? 아니면 ParentB의 Work()가 실행되어야 할까?

이처럼 호출의 모호함에서 발생하는 문제는 상속 형태가 다이아몬드를 닮아 다이아몬드 문제라고 부른다.

 

이러한 문제를 해결하기 위해 대부분의 언어에서는 다중 상속을 지원하지 않지만, 인터페이스의 다중 상속(구현)으로 이를 대체하고 있다. ( java와 C# 등)

 

 

 

유니티에서 다중 상속 인터페이스로 구현하기

 

 

다시 유니티로 돌아와서 다중 상속이 필요한 작업을 생각해보자.

대표적으로는 Scene상에 존재하는 여러 캐릭터마다 다른 스크립트 파일을 적용한 경우가 있다.

전체를 Scene을 관리하는 스크립트에서는 캐릭터들 마다 동일한 코드가 존재하더라도 GetComponent<각자의 Script>()로 접근을 해야만 한다.

 

예를 들어 각 캐릭터의 Hp에 접근해야 하는 경우 아래와 같은 코드를 캐릭터마다 맞게 작성해야 한다.

Object.GetComponent<Object's Script>().getHp();

이런 경우는 캐릭터들마다의 공통된 속성을 모아서 부모 클래스를 만들어 상속시키면 다형성으로 코드를 최적화할 수 있다.

 

하지만 유니티에서는 이미 스크립트들이 MonoBehaviour를 상속하고 있기 때문에 인터페이스로 다중 상속을 구현해보자.

 

인터페이스에는 추상화 메서드만 작성 가능하므로 유닛들마다 공통되게 필요한 getHp() 메서드를 추상화 선언한다.

 

 

 

유닛의 스크립트에는 UnitInterface 인터페이스를 상속시키자

 

인터페이스의 추상화 메서드들은 상속하는 클래스가 구현해야 하므로 Hp를 가져오는 메서드를 구현해주자.

 

구현을 마쳤다면 인터페이스를 통해 유닛들의 Hp를 가져와보자.

 

Scene을 관리하는 스크립트에서 유닛들의 Hp를 obj.GetComponent<UnitInterface>().getHp() 로 불러올 수 있다.

따라서 각 유닛마다 스크립트를 다르게 적용하지 않아도 상위 인터페이스 구현을 통해 공통된 작업을 할 수 있다.

 

실제로 유닛의 Hp가 호출됨을 확인할 수 있다.

 

 

 

 

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함