02. abstract / interface — 웹툰PD 지망생 : 정민재
●/섹션 7. 유용한 문법

02. abstract / interface

728x90

 

의무 부여 : abstract

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {

        //의무 부여 : 추상 클래스 편 (= 존재 X)
        //특징 1 : abstract(추상) 클래스는 인스턴스화가 불가능
        abstract class Monster
        {
            //의무 부여 : 추상 함수 편 (= 존재 X)
            //특징 1 : abstract을 붙이고 {}를 지웠다. 함수지만 {}를 지워서 변수처럼 정의.
            //특징 2 : 의무 부여 했으니 자식 클래스에서 반드시 override 해야한다.
            
            public abstract void Shout();   //몬스터라면 무조건 샤우팅 하는 기능
        }

        class Orc : Monster
        {
            public override void Shout()
            {                
                Console.WriteLine("록타르 오가르!");
            }
        }

        class Skeleton : Monster
        {
            public override void Shout()
            {                
                Console.WriteLine("꾸에에엑!");
            }
        }
        

        static void Main(string[] args)
        {
            //추상 클래스 특징 1 : abstract(추상) 클래스는 인스턴스화가 불가능
            Monster monster = new Monster();        //오류
            
            //이처럼, 추상인 것(= 존재X)를 사용한다는 것은 말이 안된다.
        }
    }
}

 

 

클래스의 한계 - 다중 상속 불가능 (클래스를 2개 이상 쓰면 오류가 뜬다)

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {

        //의무 부여 : 추상 클래스 편 (= 존재 X)
        //특징 1 : abstract(추상) 클래스는 인스턴스화가 불가능
        abstract class Monster
        {
            //의무 부여 : 추상 함수 편 (= 존재 X)
            //특징 1 : abstract을 붙이고 {}를 지웠다. 함수지만 {}를 지워서 변수처럼 정의.
            //특징 2 : 의무 부여 했으니 자식 클래스에서 반드시 override 해야한다.
            
            public abstract void Shout();   //몬스터라면 무조건 샤우팅 하는 기능
        }


        //하늘을 나는 기능
        abstract class Flyable
        {
            public abstract void Fly();
        }


        class Orc : Monster
        {
            public override void Shout()
            {                
                Console.WriteLine("록타르 오가르!");
            }
        }

        class Skeleton : Monster
        {
            public override void Shout()
            {
                Console.WriteLine("꾸에에엑!");
            }
        }

        //다중 상속 불가능 (C++에서는 가능하지만, C# 에서는 불가능) 왜? 분명 단점이 있을 거니까 막아놓았을 것
        //죽음의 다이아몬드 문제
        class FlyableOrc : Orc, Flyable     //Flyable에 빨간줄
        {
             
        }

        static void Main(string[] args)
        {

        }
    }
}

 

클래스의 한계 - 다중 상속 불가능 (클래스를 2개 이상 쓰면 오류가 뜬다)

 

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //의무 부여 : 추상 클래스 편 (= 존재 X)
        //특징 1 : abstract(추상) 클래스는 인스턴스화가 불가능
        abstract class Monster
        {
            //의무 부여 : 추상 함수 편 (= 존재 X)
            //특징 1 : abstract을 붙이고 {}를 지웠다. 함수지만 {}를 지워서 변수처럼 정의.
            //특징 2 : 의무 부여 했으니 자식 클래스에서 반드시 override 해야한다.
            
            public abstract void Shout();   //몬스터라면 무조건 샤우팅 하는 기능
        }

        //하늘을 나는 기능
        abstract class Flyable
        {
            public abstract void Fly();
        }

        class Orc : Monster
        {
            public override void Shout()
            {                
                Console.WriteLine("록타르 오가르!");
            }
        }

        class Skeleton : Monster
        {
            public override void Shout()
            {
                Console.WriteLine("꾸에에엑!");
            }
        }

        class SkeletonOrc : Orc, Skeleton
        {
            //SkeletonOrc 가 만약에 Shout()함수를 호출하면, 부모클래스 Orc에 호출하는지, 부모클래스 Skeleton에 호출하는지 알 수가 없다.
            //이렇게 구조가 완전 꼬이게 된다 -> 그러므로 C# 에서는 이 문법을 막아놓음. 
        }

        static void Main(string[] args)
        {

        }
    }
}

 

 

다중상속을 하는 방법 : Interface

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //의무 부여 : 추상 클래스 편 (= 존재 X)
        //특징 1 : abstract(추상) 클래스는 인스턴스화가 불가능
        abstract class Monster
        {
            //의무 부여 : 추상 함수 편 (= 존재 X)
            //특징 1 : abstract을 붙이고 {}를 지웠다. 함수지만 {}를 지워서 변수처럼 정의.
            //특징 2 : 의무 부여 했으니 자식 클래스에서 반드시 override 해야한다.
            
            public abstract void Shout();   //몬스터라면 무조건 샤우팅 하는 기능
        }

        
        //다중 상속 해결법 - Interface

        //interface 클래스 편
        //특징 1 : public이나 class 다 날리고 interface만 쓴다
        //특징 2 : 클래스명 앞에 I를 꼭 붙인다.
        interface IFlyable  //하늘을 나는 기능
        {
            //interface 함수 편
            //특징 1 : public이나 abstract 없애고 자료형과 이름만 표현
            void Fly();
        }

        class Orc : Monster
        {
            public override void Shout()
            {                
                Console.WriteLine("록타르 오가르!");
            }
        }

        class Skeleton : Monster
        {
            public override void Shout()
            {
                Console.WriteLine("꾸에에엑!");
            }
        }
                
        //다중 상속 불가능 (C++에서는 가능하지만, C# 에서는 불가능) 왜? 분명 단점이 있을 거니까 막아놓았을 것
        //죽음의 다이아몬드 문제
        class FlyableOrc : Orc, IFlyable
        {
            //interface를 부모로 받은 경우, interface 안에 있는 함수를 무조건 사용해야 빨간줄이 뜨지 않는다.
            public void Fly()
            {

            }

        }

        static void Main(string[] args)
        {

        }
    }
}

 

 

interface로 인스턴스화 가능

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        //의무 부여 : 추상 클래스 편 (= 존재 X)
        //특징 1 : abstract(추상) 클래스는 인스턴스화가 불가능
        abstract class Monster
        {
            //의무 부여 : 추상 함수 편 (= 존재 X)
            //특징 1 : abstract을 붙이고 {}를 지웠다. 함수지만 {}를 지워서 변수처럼 정의.
            //특징 2 : 의무 부여 했으니 자식 클래스에서 반드시 override 해야한다.
            
            public abstract void Shout();   //몬스터라면 무조건 샤우팅 하는 기능
        }

        
        //다중 상속 해결법 - Interface

        //interface 클래스 편
        //특징 1 : public이나 class 다 날리고 interface만 쓴다
        //특징 2 : 클래스명 앞에 I를 꼭 붙인다.
        //특징 3 : 인스턴스화가 가능하다.
        interface IFlyable  //하늘을 나는 기능
        {
            //interface 함수 편
            //특징 1 : public이나 abstract 없애고 자료형과 이름만 표현
            void Fly();
        }

        class Orc : Monster
        {
            public override void Shout()
            {                
                Console.WriteLine("록타르 오가르!");
            }
        }

        class Skeleton : Monster
        {
            public override void Shout()
            {
                Console.WriteLine("꾸에에엑!");
            }
        }
                
        //다중 상속 불가능 (C++에서는 가능하지만, C# 에서는 불가능) 왜? 분명 단점이 있을 거니까 막아놓았을 것
        //죽음의 다이아몬드 문제
        class FlyableOrc : Orc, IFlyable
        {
            //interface를 부모로 받은 경우, interface 안에 있는 함수를 무조건 사용해야 빨간줄이 뜨지 않는다.
            public void Fly()
            {

            }

        }

        static void DoFly(IFlyable flyable)
        {
            //interface로 만든 함수를 사용
            flyable.Fly();
        }


        static void Main(string[] args)
        {
            //interface의 경우, 인스턴스화 가능
            IFlyable flyable = new FlyableOrc();

            DoFly(flyable);

        }
    }
}
728x90

' > 섹션 7. 유용한 문법' 카테고리의 다른 글

06.Lambda(람다)  (0) 2021.07.14
05.event(이벤트)  (0) 2021.07.14
04.델리게이트(delegate)  (0) 2021.07.14
03.프로퍼티  (0) 2021.07.14
01.Generic 일반화  (0) 2021.07.13