C #에서 추상 클래스와 인터페이스를 사용하는 경우

응용 프로그램을 디자인 할 때 추상 클래스를 사용할 때와 인터페이스를 사용할 때를 아는 것이 중요합니다. 추상 클래스와 인터페이스가 어떤면에서 비슷해 보이지만 달성하려는 작업에 가장 적합한 선택을 결정하는 주요 차이점이 있습니다. 이 블로그 게시물에서는 이러한 차이점과 사용시기를 결정하는 방법에 대해 설명합니다.

짧은 대답 : 추상 클래스를 사용하면 하위 클래스가 구현하거나 재정의 할 수있는 기능을 만들 수 있습니다. 인터페이스는 기능을 구현하는 것이 아니라 정의 만 허용합니다. 클래스는 하나의 추상 클래스 만 확장 할 수 있지만 여러 인터페이스를 활용할 수 있습니다. 

C # 추상 클래스 설명

추상 클래스는 인스턴스화 할 수없는 특수한 유형의 클래스입니다. 추상 클래스는 메서드를 구현하거나 재정의하는 하위 클래스에서 상속되도록 설계되었습니다. 즉, 추상 클래스는 부분적으로 구현되거나 전혀 구현되지 않습니다. 추상 클래스에서 기능을 가질 수 있습니다. 추상 클래스의 메서드는 추상적이고 구체적 일 수 있습니다. 추상 클래스는 생성자를 가질 수 있습니다. 이것은 추상 클래스와 인터페이스의 주요 차이점 중 하나입니다. 추상 클래스를 활용하여 구성 요소를 디자인하고 파생 클래스에서 구현해야하는 일부 수준의 공통 기능을 지정할 수 있습니다.

C # 인터페이스 설명

인터페이스는 기본적으로 계약이며 구현이 없습니다. 인터페이스에는 메서드 선언 만 포함될 수 있습니다. 메소드 정의를 포함 할 수 없습니다. 인터페이스에 멤버 데이터가있을 수도 없습니다. 추상 클래스에는 메서드 정의, 필드 및 생성자가 포함될 수 있지만 인터페이스에는 이벤트, 메서드 및 속성의 선언 만있을 수 있습니다. 인터페이스에서 선언 된 메서드는 인터페이스를 구현하는 클래스에 의해 구현되어야합니다. 클래스는 둘 이상의 인터페이스를 구현할 수 있지만 하나의 클래스 만 확장 할 수 있습니다. 인터페이스를 구현하는 클래스는 모든 멤버를 구현해야합니다. 추상 클래스와 마찬가지로 인터페이스는 인스턴스화 할 수 없습니다.

추상 클래스 또는 인터페이스를 사용해야합니까?

추상 클래스는 특정 구체적인 메서드와 파생 클래스가 구현해야하는 다른 메서드를 가질 수있는 유연성을 제공합니다. 반대로 인터페이스를 사용하는 경우 인터페이스를 확장하는 클래스의 모든 메서드를 구현해야합니다. 추상 클래스는 향후 확장 계획이있는 경우 (예 : 향후 확장이 클래스 계층 구조에있을 가능성이있는 경우) 좋은 선택입니다. 인터페이스를 사용할 때 향후 확장에 대한 지원을 제공하려면 인터페이스를 확장하고 새 인터페이스를 만들어야합니다.

다른 참고로, 필요한 경우 계층 구조에 새 인터페이스를 쉽게 추가 할 수 있습니다. 그러나 계층 구조에 이미 추상 클래스가있는 경우 다른 클래스를 추가 할 수 없습니다. 즉, 사용할 수없는 경우에만 추상 클래스를 추가 할 수 있습니다. 일부 동작이나 기능에 대한 계약을 원하는 경우 인터페이스를 사용해야합니다. 인터페이스 메소드에 대해 동일한 코드를 작성해야하는 경우 인터페이스를 사용하지 마십시오. 이 경우 추상 클래스를 사용하고 메서드를 한 번 정의한 다음 필요에 따라 다시 사용해야합니다. 인터페이스를 사용하여 애플리케이션의 코드를 특정 구현에서 분리하거나 특정 유형의 멤버에 대한 액세스를 제한하십시오.

Microsoft의 인터페이스 설명서에 따르면 다음과 같습니다.

예를 들어 인터페이스를 사용하면 클래스에 여러 소스의 동작을 포함 할 수 있습니다. 언어가 클래스의 다중 상속을 지원하지 않기 때문에 C #에서는이 기능이 중요합니다. 또한 다른 구조체 나 클래스에서 실제로 상속 할 수 없기 때문에 구조체에 대한 상속을 시뮬레이션하려는 경우 인터페이스를 사용해야합니다.

암시 적 및 명시 적 인터페이스 구현

인터페이스는 암시 적으로 또는 명시 적으로 구현할 수 있습니다. 이 두 가지 구현이 어떻게 다른지 설명하겠습니다. 라는 인터페이스를 고려하십시오 IBusinessLogic.

공용 인터페이스 IBusinessLogic

{

   void Initialize ();

}

다음 클래스 BusinessLogicIBusinessLogic인터페이스를 구현합니다 .

공용 클래스 BusinessLogic : IBusinessLogic

{

   공개 무효 Initialize ()

   {

       // 일부 코드

   }

}

BusinessLogic클래스 의 인스턴스를 명시 적으로 만든 다음 Initialize()아래와 같이 메서드 를 호출 할 수 있습니다.

 IBusinessLogic businessLogic = new BusinessLogic ();

businessLogic.Initialize ();

다음 코드 조각은 IBusinessLogic암시 적으로 인터페이스를 구현하는 방법을 보여줍니다 .

공용 클래스 BusinessLogic : IBusinessLogic

{

   void IBusinessLogic.Initialize ()

   {

   }

}

이제 인터페이스에 Initialize()대한 참조를 사용하여 동일한 방법으로 메소드를 호출 할 수 있습니다 IBusinessLogic. 두 접근 방식의 차이점은 클래스에서 인터페이스를 명시 적으로 구현할 때 인터페이스에 대한 참조 만 사용하여 인터페이스의 메서드를 호출하도록 제한된다는 것입니다. 따라서 다음 코드 조각은 작동하지 않습니다. 즉, 컴파일되지 않습니다.

 BusinessLogic businessLogic = new BusinessLogic ();

businessLogic.Initialize ();

C #에서 더 많은 작업을 수행하는 방법 :

  • C #에서 추상 클래스와 인터페이스를 사용하는 경우
  • C #에서 AutoMapper를 사용하는 방법
  • C #에서 람다 식을 사용하는 방법
  • C #에서 Action, Func 및 Predicate 대리자를 사용하는 방법
  • C #에서 대리자를 사용하는 방법
  • C #에서 간단한 로거를 구현하는 방법
  • C #에서 특성을 사용하는 방법
  • C #에서 log4net으로 작업하는 방법
  • C #에서 리포지토리 디자인 패턴을 구현하는 방법
  • C #에서 리플렉션을 사용하는 방법
  • C #에서 filesystemwatcher로 작업하는 방법
  • C #에서 지연 초기화를 수행하는 방법
  • C #에서 MSMQ를 사용하는 방법
  • C #에서 확장 메서드를 사용하는 방법
  • C #에서 람다 식 사용 방법
  • C #에서 volatile 키워드를 사용하는 경우
  • C #에서 yield 키워드를 사용하는 방법
  • C #에서 다형성을 구현하는 방법
  • C #에서 자신 만의 작업 스케줄러를 빌드하는 방법
  • C #에서 RabbitMQ로 작업하는 방법
  • C #에서 튜플을 사용하는 방법
  • C #에서 가상 및 추상 메서드 탐색