C# 인터페이스
한 클래스는 하나의 Base 클래스만을 가질 수 있지만, 인터페이스는 여러 개를 가질 수 있다. 아래의 예를 보면, MyConnection 이라는 클래스는 Component 라는 하나의 Base 클래스와 IDbConnection, IDisposable이라는 2개의 인터페이스를 가지고 있음을 알 수 있다.
public class MyConnection : Component, IDbConnection, IDisposable
{
// IDbConnection을 구현
// IDisposable을 구현
}
C# 인터페이스의 정의
예를 들어, 아래 예제에서 CompareTo() 메서드 앞에 public 을 쓸 수 없다.
public interface IComparable
{
// 멤버 앞에 접근제한자 사용 안함
int CompareTo(object obj);
}
C# 인터페이스의 구현
public class MyClass : IComparable
{
private int key;
private int value;
// IComparable 의 CompareTo 메서드 구현
public int CompareTo(object obj)
{
MyClass target = (MyClass)obj;
return this.key.CompareTo(target.key);
}
}
C# 인터페이스의 사용
다음 코드는 IDbConnection이라는 인터페이스를 사용하는 예제이다. 이 코드에서 GetDbConnection() 메서드는 시스템의 구성파일로부터 DB타입과 Connection String을 받아와 해당 DB타입에 맞는 데이타베이스 Connection을 리턴한다. GetDbConnection()가 DB connection을 리턴할 때 IDbConnection을 리턴하고 있는데, 이 때문에 이 메서드를 사용하는 클라이언트에서는 어떤 DB를 사용하든지 상관없이 모든 DB 클래스에 공통적으로 구현된 IDbConnection 멤버들을(메서드, 속성등) 사용할 수 있게 된다.
public void Run()
{
// 인터페이스 사용하기 때문에
// 특정 DB Connection을 신경 쓸 필요가 없다
IDbConnection dbCon = GetDbConnection();
dbCon.Open();
if (dbCon.State == ConnectionState.Open)
{
dbCon.Close();
}
}
// IDbConnection 인터페이스를 리턴
public IDbConnection GetDbConnection()
{
IDbConnection dbConn = null;
string cn = ConfigurationManager.AppSettings["Connection"];
switch (ConfigurationManager.AppSettings["DbType"])
{
case "SQLServer":
dbConn = new SqlConnection(cn);
break;
case "Oracle":
dbConn = new OracleConnection(cn);
break;
case "OleDB":
dbConn = new OleDbConnection(cn);
break;
}
return dbConn;
}
인터페이스와 느슨한 커플링
게임속 플레이어는 다양한 오브젝트를 공격할 수 있습니다. 공격받은 오브젝트에 따라 반응이 서로 다릅니다. if문으로 일일히 타입을 검사하고 처리할 수 있습니다.
세련된 방법은 IDmageable 인터페이스를 사용 추상화하여 다룰수 있습니다.
인터페이스란 외부와 통신하는 공개 통로이며, 통로의 규격입니다. 인터페이스는 통로의 규격은 강제하지만 그 아래에 어떤일이 일어날지는 결정하지 않습니다.
IItem은 아이템 클래스들이 상속하는 인터페이스 입니다.(인터페이스앞에 I를 추가하는 것이 관례입니다.)
IItem.cs 스크립트를 다음과 같이 만듭니다.
using UnityEngine;
// 아이템 타입들이 반드시 구현해야하는 인터페이스
public interface IItem {
// 입력으로 받는 target은 아이템 효과가 적용될 대상
void Use(GameObject target);
}
IItem을 상속해서 만든 두 아이템을 클래스를 살펴봅시다.
public class AmmoPack : MonoBehavior, IItem {
public int ammo = 30;
public void Use(GameObject target) {
Debug.Log("탄알이 증가했다 : "+ammo);
}
}
public class HealthPack : MonoBehavior, IItem {
public int health = 30;
public void Use(GameObject target) {
Debug.Log("체력을 회복했다 : "+ health);
}
}
IItem을 상속한 클래스는 Use()메서드를 아이템의 역할에 따라 반드시 구현해야 합니다.
느슨한 커플링
IItem인터페이스를 상속한 클래스는 많아지고 충돌시 이들 모두를 검사하여 개별 처리하는 것보다
private void OnTriggerEnter(Collider other) {
AmmoPack ammoPack = other.GetComponent<AmmoPack>();
if(ammoPack != null) {
ammoPack.Use();
}
HealthPack HealthPack = other.GetComponent<HealthPack>();
if (HealthPack != null) {
HealthPack.Use();
}
}
다음과 같이 IItem타입으로 처리가능합니다.
void OnTriggerenter(Collider other) {
IItem item = other.GetComponent<IItem>();
if(item != null) {
item.Use();
}
}
IDamageable : 공격당할 수 있는 모든 대상은 IDamageable인터페이스를 상속해야 합니다. IDamageable.cs 스크립트를 다음과 같이 만듭니다.
using UnityEngine;
// 데미지를 입을 수 있는 타입들이 공통적으로 가져야 하는 인터페이스
public interface IDamageable {
// 데미지를 입을 수 있는 타입들은 IDamageable을 상속하고 OnDamage 메서드를 반드시 구현해야 한다
// OnDamage 메서드는 입력으로 데미지 크기(damage), 맞은 지점(hitPoint), 맞은 표면의 방향(hitNormal)을 받는다
void OnDamage(float damage, Vector3 hitPoint, Vector3 hitNormal);
}
'유니티좀비게임 > 총과슈터' 카테고리의 다른 글
Player Shooter 스크립 (0) | 2023.04.28 |
---|---|
GunData 스크립트 (0) | 2023.04.28 |
총 게임오브젝트 (0) | 2023.04.28 |