본문 바로가기

C#/기본 문법

C# Interface(인터페이스)

 

 

 

 

전체 코드


 

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<>
        }
    }
}

 

 

 

 

 

 

 


 

 

 

출처


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

 

[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