전체 코드

using System.ComponentModel;
using System.Numerics;
using System.Threading;
using System.Collections.Generic;

namespace CSharp
{

    internal class Program // 프로그램 진입점 클래스
    {
        // 구현을 강제시키고 싶을 경우 사용
        abstract class Monster // 추상 클래스
        {
            public abstract void Shout(); // 추상 메서드 (자식 필수 구현)
        }

        interface IFlyable // 인터페이스 // 기능을 추가하려면 뮤ㅜㅈ
        {
            void Fly(); // 인터페이스 메서드 (모든 자식 필수 구현)
        }
        //abstract interface IFlyable // 인터페이스
        //{
        //    void Fly(); // 인터페이스 메서드 (모든 자식 필수 구현)
        //}

        class Orc : Monster // 추상 클래스 상속
        {
            public override void Shout() // 필수 구현
            {
                Console.WriteLine("록타르 오가르!");
            }
        }

        class Skeleton : Monster // 추상 클래스 상속
        {
            public override void Shout() // 필수 구현
            {
                Console.WriteLine("꾸에에엑");
            }
        }
        // C#은 다중 상속 불가능
        class FlyableOrc : Orc, IFlyable // Orc 상속 + IFlyable 구현
        {
            public void Fly() // 인터페이스 필수 구현
            {
                Console.WriteLine("오크가 난다");
            }
        }

        static void DoFly(IFlyable flyable) // 인터페이스 기반 다형성
        {
            flyable.Fly(); // 각 타입별 구현된 Fly() 호출
        }

        static void Main(string args)
        {
            //Monster monster = new Monster(); // ❌ 추상 클래스는 인스턴스 불가

            IFlyable flyable = new FlyableOrc(); // 다형성 (업캐스팅)
            FlyableOrc orc = new FlyableOrc();   // 원래 타입

            DoFly(flyable); // '오크가 난다'
            DoFly(orc);     // '오크가 난다'

            // 리스트를 예제로 보면
            // 많은 인터페이스들을 조합해서 만든것을 알 수 있다.
        }
    }
}

1️⃣ 추상 클래스(abstract class) 개념 정리

구분설명비유
목적상속받는 자식 클래스들에게 공통된 틀 제공템플릿
특징1추상 메서드(몸통 없는 메서드) 가질 수 있음강제 약속
특징2구현된 메서드나 필드도 포함 가능부분 완성된 템플릿
특징3객체 생성 불가 (인스턴스화 불가)자체 사용 불가
특징4단일 상속만 가능부모는 한 명

✔️ 추상 클래스 예제 및 해설

abstract class Monster // 추상 클래스 선언
{
    public abstract void Shout(); // 추상 메서드 (몸통 없음, 강제 오버라이드)
}
  • abstract 키워드: 추상 클래스임을 명시
  • 추상 메서드: {} 없이 선언, 자식이 반드시 구현해야 함
  • 인스턴스화 불가: new Monster()는 에러

2️⃣ 인터페이스(interface) 개념 정리

구분설명비유
목적구현해야 할 기능의 목록 제공체크리스트
특징1모든 메서드는 기본적으로 추상 메서드몸통 없음
특징2다중 상속 가능여러 체크리스트
특징3필드, 구현 메서드 없음 (C# 최신버전 일부 가능하나 일반적으론 없음)데이터 없음
특징4인터페이스 자체 객체 생성 불가new 불가

✔️ 인터페이스 예제 및 해설

interface IFlyable // 인터페이스 선언
{
    void Fly(); // 구현 강제 메서드
}
  • interface: 인터페이스 선언 키워드
  • 접근 지정자 안 붙임
  • 몸통 없는 메서드만 정의 (구현은 자식 클래스가)

4️⃣ 다중 상속 문제 (C#이 막는 이유)

❌ 아래 코드는 불가능 (다중 상속 금지)

class SkeletonOrc : Orc, Skeleton // ❌ 다중 상속 불가
{
}

💥 문제점: "죽음의 다이아몬드 문제"

  • Orc와 Skeleton 모두 Monster 상속
  • 각자 Shout()를 다르게 구현
  • SkeletonOrc는 어떤 Shout()를 상속받아야 할지 모호
  • 이런 구조적 혼란 때문에 C#은 다중 상속 금지

5️⃣ 인터페이스 다중 상속 예시 (가능)

interface IFlyable { void Fly(); }
interface ISwimmable { void Swim(); }

class Duck : IFlyable, ISwimmable
{
    public void Fly() { Console.WriteLine("날다"); }
    public void Swim() { Console.WriteLine("수영하다"); }
}
  • 인터페이스는 다중 상속 가능
  • 실제 구현은 Duck이 각각 알아서 처리

profile
李家네_공부방

0개의 댓글