정신과 시간의 방
카테고리
작성일
2022. 8. 17. 16:02
작성자
risehyun

C#과 유니티로 만드는 MMORPG 게임 개발 시리즈 강의를 수강하며 인터페이스 파트에서 배우고 느낀 점을 정리해보았다.


1. 추상 클래스와 추상 함수

 1-1 추상 클래스

 - 기능 : abstract 를 사용해 추상 클래스를 선언할 수 있다.

 - 용도 :  반드시 이 함수를 재정의(오버라이드)해야 한다고 강요해야 할 때 사용할 수 있다.

 - 유의점 : 추상 클래스는 인스턴스를 만들 수 없으므로 더 이상 new 키워드로 생성할 수 없다.

 

 1-2 추상 함수

 - 특징 : 추상 클래스의 내부 함수는 추상 함수로 만들 수 있다. 또한 추상 함수는 빈 생성자만을 가질 수 있기 때문에, 생성자 안에 아무것도 선언할 수 없다.

 

* 추상 클래스와 가상 클래스의 차이

추상 클래스의 경우 파생 클래스에서의 재정의를 강제할 수 있지만 가상 클래스에서는 할 수 없다.

추상 클래스의 경우 객체 생성이 불가하지만(인스턴스화X) 가상 클래스는 new 키워드로 객체를 생성할 수 있다.(인스턴스화O)

    class Program
    {
        abstract class Monster // abstract -> 기능 : 추상 클래스로 해당 클래스를 선언한다.
        {
            public abstract void Shout();
        }

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

        }

        class Skeleton : Monster
        {
            // 가상 함수에서는 하단의 함수 재정의 부분이 없다면 Monster 내부의 shout()이 실행됨
            // 추상 함수에서는 하단의 함수 재정의 부분이 없다면 오류가 발생함.
            public override void Shout()
            {
                Console.WriteLine("꾸에에엑!");
            }
        }

        static void Main(string[] args)
        {

        }

    }

 

2. 인터페이스

- C#은 문법상 C++과 달리 다중 상속이 불가능하다. (다이아몬드 문제 때문)
- 이를 대신해 인터페이스는 상속되지만 구현부는 파생 클래스에서 알아서 할 수 있도록 인터페이스 기능을 제공한다.

- 인터페이스로 선언되면 public이나 private 같은 접근 제한자 없이 인터페이스 함수의 뼈대 선언만 하게 된다.

- 일반적으로 인터페이스의 컨벤션으로 변수 앞에 I를 붙인다.

 

* (죽음의) 다이아몬드 문제란?

하나의 클래스가 여러 개의 상위 클래스를 상속받았을 때, 동일한 이름을 가진 메소드가 2개 이상 존재할 경우 어떤 클래스의 메소드를 상속받아야 하는지 모호해지는 문제를 말한다.

 

- 인터페이스 사용 예제

        abstract class Monster
        {
            public abstract void Shout();
        }

        interface IFlyable
        {
            void Fly();
        }

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

        }

        class FlyableOrc : Orc, IFlyable
        {
            public void Fly() // 상속받은 인터페이스의 함수를 선언하지 않으면 오류가 발생함.
            				  // 반드시 해당 부분을 구현해야 한다.
            { 
            
            }

        }

 

- 인터페이스를 사용했을 때의 유용함

        static void DoFly(IFlyable flyable)
        {
            flyable.Fly();
        }

        static void Main(string[] args)
        {
            FlyableOrc orc = new FlyableOrc();
            DoFly(orc);
        }

다양한 클래스를 구현할 때 인터페이스를 이용하면 공통적인 기능을 쉽게 추가할 수 있다.

또한 위의 코드처럼 인터페이스를 상속받는 클래스만 접근이 가능한 함수를 만들 수도 있고,

다른 클래스와 인터페이스를 함께 상속한 클래스의 경우 인터페이스 속성을 사용해 클래스를 불러올 수도 있어 편리하다.

'C#' 카테고리의 다른 글

[C#] Delegate (대리자)  (0) 2022.08.21
220820 Property (프로퍼티) + 식 본문 멤버 (Expression-bodied members)  (0) 2022.08.20
[C#] 일반화(Generic)  (0) 2022.08.16
220816 배열과 컬렉션  (0) 2022.08.16
220718 C# 연습문제 풀이  (0) 2022.07.18