인터페이스와 추상 클래스

sz L·2023년 4월 7일
0

씨샵

목록 보기
7/17
post-thumbnail
post-custom-banner

인터페이스

인터페이스는 메서드 원형들의 집합에 이름을 붙인 것입니다.

공용 런타임과 이를 기반으로 하는 모든 관리 프로그래밍 언어들은 다중 상속을 지원하지 않습니다.
CLR은 인터페이스를 이용해서 축소된 형태의 다중상속을 지원합니다.

일반적으로 interface라는 용어는 "상이한 시스템간의 계약 정보를 표현하는 것" 이라고 정의할 수 있습니다.

C#의 예약어이면서, OOP의 기본개념으로 자리잡고 있는 Interface는 형태상으로 몇가지 특징이 있습니다.

  • 선언(Declaration)은 있고, 정의(Definition)은 없다.
  • 다중 상속이 가능하다.
  • C#의 Property는 내부적으로 메소드로 구현되기 때문에 포함할 수 있다.
  • C# 컴파일러는 인터페이스 메서드를 구현할때, public 으로 선언하도록 요구한다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace cs19_Interface
{
    interface ILogger
    {
        void WriteLog(string log);
    }

    interface IFormattableLogger : ILogger
    {
        void WriteLog(string format, params object[] args);     //args 다중 파라미터
    }

    class ConsoleLogger : ILogger       // 상속이 아니라 구현이라함(인터페이스여서)
    {
        public void WriteLog(string log)
        {
            Console.WriteLine("{0} {1}",DateTime.Now.ToLocalTime(),log);
        }
    }

    class ConsoleLogger2 : IFormattableLogger
    {
        public void WriteLog(string format, params object[] args)
        {
            string message = string.Format(format, args);
            Console.WriteLine("{0}, {1}", DateTime.Now.ToLocalTime(), message);
        }

        public void WriteLog(string log)
        {
            Console.WriteLine("{0} {1}", DateTime.Now.ToLocalTime(), log);
        }
    }

    class Car
    {
        public string Name { get; set; }
        public string Color { get; set; }
        public void Stop()
        {
            Console.WriteLine("정지!");
        }

    }

    interface IHoverable
    {
        void Hover();       //물에서 달린다

    }
    interface IFlyable
    {
        void Fly();         //날다

    }

    // C#은 다중상속이 없다
    class FlyHoveraCar : Car, IFlyable, IHoverable
    {
        public void Fly()
        {
            Console.WriteLine("납니다.");
        }

        public void Hover()
        {
            Console.WriteLine("물에서 달립니다.");
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            ILogger logger = new ConsoleLogger();
            logger.WriteLog("안녕~!!");

            IFormattableLogger logger2 = new ConsoleLogger2();
            logger2.WriteLog("{0} X {1} = {2}", 6, 5, 6 * 5);
        }
    }
}


추상클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace cs20_abstractClass
{
    abstract class AbstractParent
    {
        protected void MethodA()
        {
            Console.WriteLine("AbstractParent.MethodA()");
        }
        public void MethodB() // 클래스랑 동일 !
        {
            Console.WriteLine("AbstractParent.MethodB()");
        }
        public abstract void MethodC(); // 인터페이스랑 동일 ! 추상메서드
    }

    class Child : AbstractParent
    {
        public override void MethodC()  // override 는 virtual과 똑같음
        {// 재정의 (사실은 구현!)
            Console.WriteLine("Child.MethodC() - 추상클래스 구현 !");
            MethodA();
        }
    }

    abstract class Mammal // 포유류 최상위 클래스
    {
        public void Nurse()
        {
            Console.WriteLine("포유한다.");
        }
        public abstract void Sound();
    }

    class Dogs : Mammal
    {
        public override void Sound()
        {
            Console.WriteLine("멍멍!!");
        }
    }
    class Cats : Mammal
    {
        public override void Sound()
        {
            Console.WriteLine("야옹~~");
        }
    }


    internal class Program
    {
        static void Main(string[] args)
        {
            AbstractParent parent = new Child();
            parent.MethodC();
            parent.MethodB();
            // parent.MethodA();  --> protected는 자기자신과 자식클래스 안에서만 사용가능
        }
    }
}

profile
가랑비는 맞는다 하지만 폭풍은 내 것이야
post-custom-banner

0개의 댓글