C#과 유니티로 만드는 MMORPG 게임 개발 시리즈 강의를 수강하며 인터페이스 파트에서 배우고 느낀 점을 정리해보았다.
1. 추상 클래스와 추상 함수
1-1 추상 클래스
- 기능 : abstract 를 사용해 추상 클래스를 선언할 수 있다.
- 용도 : 반드시 이 함수를 재정의(오버라이드)해야 한다고 강요해야 할 때 사용할 수 있다.
- 유의점 : 추상 클래스는 인스턴스를 만들 수 없으므로 더 이상 new 키워드로 생성할 수 없다.
1-2 추상 함수
- 특징 : 추상 클래스의 내부 함수는 추상 함수로 만들 수 있다. 또한 추상 함수는 빈 생성자만을 가질 수 있기 때문에, 생성자 안에 아무것도 선언할 수 없다.
* 추상 클래스와 가상 클래스의 차이
추상 클래스의 경우 파생 클래스에서의 재정의를 강제할 수 있지만 가상 클래스에서는 할 수 없다.
추상 클래스의 경우 객체 생성이 불가하지만(인스턴스화X) 가상 클래스는 new 키워드로 객체를 생성할 수 있다.(인스턴스화O)
class Program
{
abstract class Monster // abstract -> 기능 : 추상 클래스로 해당 클래스를 선언한다.
{
public abstract void Shout();
}
class Orc : Monster
{
public override void Shout()
{
Console.WriteLine("록타르 오가르!");
}
}
class Skeleton : Monster
{
// 가상 함수에서는 하단의 함수 재정의 부분이 없다면 Monster 내부의 shout()이 실행됨
// 추상 함수에서는 하단의 함수 재정의 부분이 없다면 오류가 발생함.
public override void Shout()
{
Console.WriteLine("꾸에에엑!");
}
}
static void Main(string[] args)
{
}
}
2. 인터페이스
- C#은 문법상 C++과 달리 다중 상속이 불가능하다. (다이아몬드 문제 때문)
- 이를 대신해 인터페이스는 상속되지만 구현부는 파생 클래스에서 알아서 할 수 있도록 인터페이스 기능을 제공한다.
- 인터페이스로 선언되면 public이나 private 같은 접근 제한자 없이 인터페이스 함수의 뼈대 선언만 하게 된다.
- 일반적으로 인터페이스의 컨벤션으로 변수 앞에 I를 붙인다.
* (죽음의) 다이아몬드 문제란?
하나의 클래스가 여러 개의 상위 클래스를 상속받았을 때, 동일한 이름을 가진 메소드가 2개 이상 존재할 경우 어떤 클래스의 메소드를 상속받아야 하는지 모호해지는 문제를 말한다.
- 인터페이스 사용 예제
abstract class Monster
{
public abstract void Shout();
}
interface IFlyable
{
void Fly();
}
class Orc : Monster
{
public override void Shout()
{
Console.WriteLine("록타르 오가르!");
}
}
class FlyableOrc : Orc, IFlyable
{
public void Fly() // 상속받은 인터페이스의 함수를 선언하지 않으면 오류가 발생함.
// 반드시 해당 부분을 구현해야 한다.
{
}
}
- 인터페이스를 사용했을 때의 유용함
static void DoFly(IFlyable flyable)
{
flyable.Fly();
}
static void Main(string[] args)
{
FlyableOrc orc = new FlyableOrc();
DoFly(orc);
}
다양한 클래스를 구현할 때 인터페이스를 이용하면 공통적인 기능을 쉽게 추가할 수 있다.
또한 위의 코드처럼 인터페이스를 상속받는 클래스만 접근이 가능한 함수를 만들 수도 있고,
다른 클래스와 인터페이스를 함께 상속한 클래스의 경우 인터페이스 속성을 사용해 클래스를 불러올 수도 있어 편리하다.
'C#' 카테고리의 다른 글
[C#] Delegate (대리자) (0) | 2022.08.21 |
---|---|
220820 Property (프로퍼티) + 식 본문 멤버 (Expression-bodied members) (0) | 2022.08.20 |
[C#] 일반화(Generic) (0) | 2022.08.16 |
220816 배열과 컬렉션 (0) | 2022.08.16 |
220718 C# 연습문제 풀이 (0) | 2022.07.18 |