전체 코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Rookiss_CSharp
{
// https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part1?srsltid=AfmBOopkXVxKs-MQPYZkTjEYW-yIDMO5xP7l5hQq0hQasUWhobvyKO6N
// 55강 인터페이스
// 가상함수를 통해 자식 클래스에서 함수를 오버라이드 할 수 있지만, 강제성이 없음
// 추상클래스, 함수에 abstract 키워드를 통해 자식 클래스에서 오버라이딩 하도록 강제할 수 있음
// 추상클래스의 단점 : 자식클래스에서 여러 추상 클래스 부모를 가질 수 없음(다중상속 불가함)
// 결국에 이를 해결하려면 인터페이스로 기능별로 만들어서(구현은 안하고 모양만 만듬) 자식 클래스에서 사용하여 자식에서 직접 구현가능
// 결국 추상클래스 보다는 인터페이스로 만들어서 사용하는게 좀 더 유연하게 구현가능
// 인터페이스를 구현하고 있는 클래스라면 반드시 해당 인터페이스가 요구하는 메서드를 구현해야함
// 인터페이스는 여러개 구현해도 문제가 없지만, 클래스는 문제가됨(다중상속 불가함)
// abstract 키워드 추가시 추상클래스가 됨
// Monster monster = new Monster(); => 불가함
// 추상클래스는 인스턴스를 만들 수 없음
abstract class Monster
{
// 추상 클래스 안에서는 함수들도 추상적으로 만들 수 있음(abstract 키워드 추가)
// {} 추가 불가, 추상클래스라 구현 불가
// 즉, 개념적으로만 존재
// 자식 클래스에서는 Shout() 함수를 오버라이드를 해야함
public abstract void Shout();
// 가상함수
// public virtual void Shout() { }
}
// 날아다니는 기능을 강요할 상황이라면
// 인터페이스명에 I를 붙이는 것은 코드 convension
interface IFlyable
{
// fly를 물려주지만, 구현하는 클래스에서 내용을 직접 구현함
void Fly(); // 기본적으로 public (접근 지정자 명시 불필요)
}
// C#에서는 다중상속 불가능(C++에서는 가능)
// C#에서 막는 이유 : 죽음의 다이아몬드(Diamond Problem)라는 단점이 있음
// 만약 SkeletonOrc에서 Shout() 함수를 호출한다면, 부모인 Orc에서 Shout() 함수를 호출할지, 부모인 Skeleton에서 Shout()함수를 호출할지 난감해짐, 구조도 와장창 꼬임
// 이런 이유로 C#에서는 다중상속을 문법상 허락하지 않음
/*
죽음의 다이아몬드(Diamond Problem)
Creature
/ \
Orc Skeleton
\ /
SkeletonOrc
/*
class SkeletonOrc : Orc, Skeleton
{
}
*/
// 이 사유로 interface 키워드 등장하고, 클래스가 클래스 내에서 인터페이스 내용을 구현함
class FlyableOrc : Orc, IFlyable
{
public void Fly()
{
}
}
class Orc : Monster
{
// 오버라이딩
public override void Shout()
{
Console.WriteLine("옥타르 오가르");
}
}
class Skeleton : Monster
{
// 오버라이딩
public override void Shout()
{
Console.WriteLine("꾸에엑!");
}
}
class Program
{
static void DoFly(IFlyable flyable)
{
flyable.Fly();
}
static void Main(string[] args)
{
IFlyable flyable = new FlyableOrc();
DoFly(flyable);
// List 클래스 또한 다양한 인터페이스들로 만들어졌음(IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>)
// List<>
}
}
}
출처
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문| Rookiss - 인프런 강
현재 평점 4.9점 수강생 6,987명인 강의를 만나보세요. 기초 프로그래밍 지식이 없는 사람들을 위한 C# 프로그래밍 기초 강의입니다. 문법 암기 위주의 수업이 아니라, 최대한 필요한 부분만을 요
www.inflearn.com
55강 Interface(인터페이스)
'C# > 기본 문법' 카테고리의 다른 글
| C# Delegate(대리자) (0) | 2025.12.14 |
|---|---|
| C# Property(프로퍼티) (0) | 2025.12.14 |
| C# Generic(일반화), Boxing(박싱)과 Unboxing(언박싱) (0) | 2025.12.14 |
| C# Dictionary (0) | 2025.11.20 |
| C# List (0) | 2025.11.20 |