bdfgdfg

[C#] 인터페이스,추상클래스 본문

게임프로그래밍/C#

[C#] 인터페이스,추상클래스

marmelo12 2022. 4. 19. 12:15
반응형

C++에서는 존재하지 않는 인터페이스가 C#에는 존재한다.

 -> 문법적으로 따로 존재하지 않을 뿐, 똑같이 사용하는 방법은 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class IFlyable
{
    virtual void Fly() abstract// 추상클래스를 만든다. 인터페이스와 같은 역할은 
};
 
class Orc
{
 
};
// 다중상속이 가능하기에 위와 같이 사용가능.
class FlyOrc : public Orc, public IFlyable
{
    void Fly() override;
};
cs

(C++로 작성된 코드)

위와 같이 인터페이스는 이러한 기능이 필요하니 너는 그 기능을 구현해!라는 느낌이면

추상클래스는 공통된 개념을 두고 그 기능들을 물려주기 위해 작성된 설계도같은 것.

 -> 예로들어 자동차를 생각해보면 쉽다. 자동차가 뭐냐라고 물어볼 때 사람들은 단순히 BMW의 차 모델의 한 종류를 떠올릴 수 있고, SM5등 여러 차 모델을 떠올릴수도 있겠다. 거기서 추출가능한 공통된 개념. 예로들어 엔진이라던지,바퀴가 4개가 달렸다던지 하는 공통적인 기능을 모아 Car라는 추상 클래스를 만들고, 파생 클래스에서 그 기능을 물려받아 좀 더 세분화를 한다.(Car -> 차 브랜드(BMW,현대등등) -> 실제 해당 브랜드의 자동차)

 

둘 다 인스턴스화(객체 생성)는 불가능.

 

C++에서는 위의 개념을 섞어 사용하는 것 같지만, C#에서는 위의 개념들(인터페이스,추상클래스)을 구분했다.

 

C#의 인터페이스 구현은 다음과 같다.

1
2
3
4
5
6
7
interface 인터페이스이름
{
    반환형식 메소드이름1(매개변수 목록);
    반환형식 메소드이름2(매개변수 목록);
    반환형식 메소드이름3(매개변수 목록);
}
 
cs

사용법은 간단하고, 메소드 이외에 이벤트,인덱서,프로퍼티를 추가가능하며 그 외에는 추가가 불가능하다.

또한 정말 인터페이스만을 제공하기에 구현부또한 존재하지 않으며, 모든것이 public으로 선언되고, 인터페이스는 당연하지만 인스턴스화(객체 생성)가 불가능하다.

 -> 클래스에게 상속해 기능 구현을 강제하기 위함.

실제로 상속을하고 구현을 하지 않을 시 위와같은 컴파일 에러를 내뱉는다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
interface ILogger
{
    void WriteLog(string msg);
}
 
class ConsoleLogger : ILogger
{
    public void WriteLog(string msg)
    {
        Console.WriteLine("{0} {1}",DateTime.Now.ToLocalTime(),msg);
    }
}
 
class Program
{
    static void Main(string[] args)
    {
        // C++처럼. ConsoleLogger는 ILogger를 상속받았으므로, 자식을 참조할 수 있다.
        // 단 ILogger 그 자체를 인스턴스화는 불가능!(C++도 마찬가지)
        ILogger logger = new ConsoleLogger();
        logger.WriteLog("Hello");
    }
}
 
cs

 

인터페이스를 인스턴스화는 불가능하지만, 단순히 참조변수를 통해 해당 인터페이스를 상속받은 클래스의 객체를 참조하는건 가능하다.

 -> C++도 마찬가지.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class IFlyable
{
public:
    virtual void Fly() abstract// 추상클래스를 만든다. 인터페이스와 같은 역할은 
};
 
class Orc
{
 
};
// 다중상속이 가능하기에 위와 같이 사용가능.
class FlyOrc : public Orc, public IFlyable
{
public:
    void Fly() override
    {
        std::cout << "Test" << std::endl;
    }
};
 
 
 
int main()
{
    IFlyable* fly = new FlyOrc();
    fly->Fly();
    return 0;
}
cs

또한 인터페이스 사이에서도 상속이 가능하다.

 -> 그냥 코드를 수정해도 되겠지만, 외부 라이브러리의 인터페이스 코드에 접근이 불가능한경우 상속하여 재사용한다.

 

이제 추상클래스. 이론은 위에서 설명한게 전부다.

C++에서는 클래스 내부에 순수 가상함수를 선언하면 해당 클래스는 추상 클래스가 된다.

C#에서는 클래스 앞에 abstract라는 키워드를 붙여야 한다.

 

반응형

'게임프로그래밍 > C#' 카테고리의 다른 글

[C#] 인덱서(Indexer)  (0) 2022.04.21
[C#] 프로퍼티(갓)  (0) 2022.04.19
[C#] 부모 자식 사이의 형 변환 (is,as)  (0) 2022.04.18
[C#] ref,out 키워드  (0) 2022.04.18
[C#] 문자열 다루기  (0) 2022.04.18
Comments