본문 바로가기

IT

[C#] 필드 사용가능? - interface, abstract class, partial class, virtual method


안녕하세요, 모스크바에 살고 있는 개발자 윤진입니다.


C로 개발을 할때는 헤더파일에 온갖 함수선언을 하며,

공동작업을 하는 개발자들끼리 전체적인 그림을 그리곤 했습니다.

그럴때마다 Java의 interface 기능이 무척이나 부러웠죠. :)


C#에서는 다양한 방법으로 모듈을 설계&구현할 수 있습니다.

- interface

- abstract class

- partial class

- virtual method


그렇지만, 각각이 목적과 쓰임이 다릅니다.

interface는 1) 메소드, 2) 속성, 3) 인덱서, 4) 이벤트 만을 사전에 선언하여,

해당 interface를 상속받는 class가 빈 껍데기를 구현하도록 유도하고 있습니다.

만약 아래 코드처럼 interface에 필드를 넣으면, 컴파일 에러가 발생합니다.

컴파일러 : "인터페이스는 필드를 포함할 수 없습니다"

    interface InterfaceWithVariable
    {
        string s; // Error
        int InterfaceMethod();
    }

변수가 있다는 것은 특정 상태를 기억한다는 것이기에,

이런 '상태'라는 것은 구현영역에서 처리하는게 맞습니다.


abstract class는 abstract 타입의 1) 메소드, 2) 속성, 3) 인덱서, 4) 이벤트가 하나 이상 포함된 class 입니다.

추가 구현이 필요한 abstract 타입 있다는 것 외에는 일반 class 정의하듯 만들면 됩니다.

그렇기에 필드에 대한 별도의 제약사항은 없습니다.

    abstract class AbstractWithVariable
    {
        int i;
        protected abstract int AbstractMethod(int argument);
    }

위의 예처럼 얼마든지 class 필드를 만들 수 있습니다.


partial class도 abstract class처럼 필드에 대한 제약이 없습니다.

일반 class를 복수개로 쪼개놓은 것이기 때문에, 분리된 것을 합치면 일반 class가 됩니다.

한 partial class에서 정의한 변수를 다른 다른 partial class에서 사용할 수 있습니다.

    partial class PartialWithVariable
    {
        int i = 10;
    }

    partial class PartialWithVariable
    {
        public void Print()
        {
            Console.WriteLine(i);
        }
    }


virtual method는 상속과정에서 부모-자식 간에 메소드 처리방식을 규정하기 때문에,

abstract나 partial처럼 변수에 대한 제약이 없습니다.

    public class VirtualClass
    {
        int i;
        public virtual void Print(int i)
        {
            Console.WriteLine(i);
        }
    }


이상으로 필드에 얽힌 간단한 이야기를 마치겠습니다.

끝_