인터페이스를 사용하는 이유는 무엇입니까? 표준화만을위한 것인가? [닫은]


79

인터페이스를 사용하는 이유는 무엇입니까?

표준화만을위한 것인가?


1
반대로 ...? 인터페이스는 많은 용도가 ...
제이슨

6
나는 사람들이 C #과 관련되지 않은 게시물에 C #과 같은 태그를 붙이지 않기를 정말로 바랍니다. 정말 좋은 질문이며 C #은 무시 된 태그이기 때문에 놓쳤을 수도 있습니다.
Tyler Carter

답변:


171

인터페이스의 목적

  • 느슨하게 결합 된 소프트웨어 생성
  • 계약 별 지원 설계 (구현자는 전체 인터페이스를 제공해야 함)
  • 플러그 형 소프트웨어 허용
  • 서로 다른 개체가 쉽게 상호 작용하도록 허용
  • 클래스의 구현 세부 정보를 서로 숨 깁니다.
  • 소프트웨어 재사용 촉진

비유 1 : 미국 우주 왕복선과 마찬가지로 러시아 소유즈 우주선과 중국 선저우 5는 동일한 도킹 인터페이스를 구현하기 때문에 모두 국제 우주 정거장에 도킹 할 수 있습니다. (이것은 단지 예일뿐입니다. 실생활에서 사실인지 모르겠지만 예를 들어 우리의 불신을 중단합시다)

비유 2 : 다양한 컴퓨터 모니터를 가정용 컴퓨터에 연결할 수 있습니다. 벽면 크기의 TV, 구형 CRT (두꺼운 종류), 20 인치 평면 스크린 또는 시각 장애인이 터치로 "볼"수있는 점자 기계를 연결할 수 있습니다. 이러한 다양한 / 다양한 장치와 사용자의 호환성이 있습니다. 모두 인터페이스 표준에 동의하기 때문입니다.

C # 인터페이스의 세부 사항 -C # / OOP 인터페이스를 사용하면 보이지 않는 / 가상 세계에서 동일한 작업을 수행합니다.

당신은에 대한 올바른있어 표준화 뿐만 아니라, 유연성 , 확장 성 , 확장 성 , 유지 보수성 , 재사용 , 테스트 용이성전원 .

(소프트웨어 인터페이스를 더 많이 사용할수록 이러한 "버즈 워드"가 더 많이 이해 될 것입니다. 그리고 인터페이스가 우리를 똑같이 잘 해냈 기 때문에 항상 현실 세계의 인터페이스를 고려하십시오.)


18
내가 가장 좋아하는 인터페이스 사용은 테스트 가능성을 생략했습니다. A와 B라는 두 개의 클래스가 있고 A.foo가 B.bar를 호출하는 경우 B가 인터페이스를 구현하고 A에 "주입"할 수있는 한 대신 모의, 가짜 또는 스텁 클래스를 사용할 수 있습니다. 실제 B. 이것은 A.foo가 B.bar의 반환 값에 따라 동작을 변경할 때 특히 유용합니다. (B.bar가 bool을 반환한다고 가정합니다. A.foo에는 else 절이있는 if (B.bar) 문이있을 수 있습니다.) B에서 인터페이스를 사용하면 mockB, fakeB 및 / 또는 stubB를 만들 수 있습니다. B.bar가 true 또는 false를 반환 할 때 발생합니다.
aridlehoover 2010 년

@Alan R-테스트 가능성이 추가되었습니다. 감사.
John K

1
받아 들여지는 대답은 TOP 항목이며 대부분의 프레임 워크 디자인 지침 자료가 설명하거나 이해하지 못하기 때문에 폐기되지 않은 개념을 보는 것은 신선합니다. Generics를 진지하게 사용하고 있다면 그것들 없이는 어떻게 지 냈는지 모르겠습니다.
rama-jka toti

6
+1 forstandardization, but also flexibility, scalability, extensibility, maintainability, reusability, testability and power.
Ravi

29

인터페이스는 구현 된 것이 무엇을 할 수 있는지 설명하는 데 사용됩니다. 따라서이 인터페이스 유형과 동일한 인터페이스를 구현하는 여러 개체를 처리 할 수 ​​있습니다.

예를 들면 :

public interface IMyInterface{
    public void DoFirst();
    public int DoSecond();
}


public class A : IMyInterface{
   //class has to implement DoFirst and DoSecond
   public void DoFirst(){
     Console.WriteLine("Blubb1");  
   }

   public int DoSecond(){
     Console.WriteLine("Blubb2");
     return 2;  
   }
}

public class B : IMyInterface{
   //class has to implement DoFirst and DoSecond
   public void DoFirst(){
     Console.WriteLine("Blibb1");  
   }

   public int DoSecond(){
     Console.WriteLine("Blibb2");  
     return 4;
   }
}

클래스는 여러 가지 방법으로 인터페이스를 구현합니다. 그러나 IMyInterface로 사용할 수 있습니다. 예를 들면 :

public static void DoMethodsInInterface(IMyInterface inter){
    inter.DoFirst();
    inter.DoSecond();
}


public static void main(){

   DoMethodsInInterface(new A());
   DoMethodsInInterface(new B());
   //Or use it in a List
   List<IMyInterface> interlist = new List<IMyInterface>();
   interlist.Add(new A());
   interlist.Add(new B());
   foreach(IMyInterface inter in interlist){
      inter.DoFirst();
   }

}

이것이 인터페이스가 유용한 이유를 조금 분명하게 해주기를 바랍니다.


2
이 질문은 단순히 적절한 기능을 수행하는 멤버가 아닌 인터페이스를 사용하는 이유를 묻는 질문에서 연결되었으며 귀하의 대답은 그에 대한 대답에 가장 가깝습니다. 두 개의 관련되지 않은 클래스가 둘 다 메소드를 가지고 있다면, 두 클래스 Woozle중 하나에 대한 참조를 받아들이고 자하는 모든 코드 Woozle는 어떤 클래스를 다루고 있는지 알아야하며, 알고있는 클래스 만 가능할 것 Woozle입니다. 반대로, 두 클래스가 모두를 구현 IWoozler하면 정확한 유형을 알 필요없이 임의의 코드가 제공 될 IWoozler수 있습니다 Woozle.
supercat 2014 년

이 대답은 내가 본 것보다 더 잘합니다. 그것은 물체가 할 수있는 일에 관한 것입니다. 인터페이스는 분명히 객체에 특정한 액션 내에서 일어나는 일을 지시하지 않고 객체와 관련된 일련의 액션을 지정합니다.
m12lrpv

5

인터페이싱을위한 것입니다 :), 그래서 당신은 물건들 사이에 인터페이스 할 수 있습니다.

  • 동일한 물건의 여러 구현
  • 여러 다른 클래스에 인터페이스를 적용 할 때 이러한 클래스가 일부 작업을 수행하거나 일부 기능을 가질 수 있다는 일종의 규칙이 필요하기 때문입니다.

3

여기에 높은 수준의보기가 있습니다 ...

인터페이스는 Information Hiding 개념에서 큰 역할을합니다 .

기본적으로 호출 클래스가 해당 구현에 종속되지 않도록 클래스 의 구현 세부 정보 를 숨기는 데 도움 이됩니다. 따라서 인터페이스를 사용하여 호출 클래스를 변경하지 않고 구현을 수정할 수 있습니다. 이것은 차례로 코드 의 복잡성제한 하고 장기적 으로 유지 관리쉽게 만듭니다 .

인터페이스를 처음 이해하기 시작했을 때 "클래스에 대한 설명을 제공하는 계약"으로 설명되었습니다. 그것이 당신에게 도움이 될지는 확실하지 않지만 자동차의 인터페이스를 생각한다면 그것이 운전하고 , 고장 나고 , 회전 한다고 말할 수 있습니다. 따라서 A 지점에서 B 지점으로 이동하는 한 이러한 기능이 어떻게 구현되는지 알 필요가 없습니다.


2

인터페이스가 C # / Java와 같은 언어에서 사용되는 주된 이유는 해당 언어가 다중 (클래스) 상속을 지원하지 않기 때문 입니다 (다중 상속의 정확한 문제는 무엇입니까? 참조 ).

그러나 여러 (인터페이스) 구현이 허용되어 클래스를 다른 방식으로 사용할 수 있습니다.


1
관리 언어의 인터페이스는 다중 상속을 대체하지 않습니다. 그리고 다중 상속을 지원하는 언어에서도 구현이없는 인터페이스의 개념은 관련이 있고 유용합니다. (의존성 주입 참조)
aridlehoover

1
-1 잘 생각하지 않았거나 C # 또는 Java를 정말로 이해하지 못합니까?
John Saunders

내가 말하고 싶은 것은 C ++에서 인터페이스 대신 순수한 추상 클래스를 사용할 수 있다는 것입니다. 인터페이스를 사용하여 Java / C #에서 수행 할 수있는 대부분의 작업은 순수 추상 클래스를 사용하여 C ++에서 수행 할 수 있습니다. C ++에서 클래스가 여러 동작을 갖도록하려면 여러 순수 추상 클래스를 상속합니다. 그러나 Java / C #에서는이를 수행 할 수 없습니다. 나는 인터페이스가 "유용하지 않다"고 말하는 것이 아니라 그 이상을 말하는 것이다. Java & C #과 같은 언어는 다중 인터페이스 상속 없이는 실제로 객체 지향 프로그래밍 언어가 될 수 없다. (다중 클래스 상속이나 믹스 인을 허용하지 않음)
Catalin DICU

1
+1 이것은 본질적으로 C # 및 Java 경험을 통해 어려운 방법으로 발견 된 것입니다. 다중 상속을 피하여 단순화하려고하면 다른 곳에서 복잡성이 발생합니다. 통합 된 기본 접근 방식이 없기 때문에 결국 복잡성이 더 심해집니다. C # Programming Language 3rd Edition , 1.9 Interfaces 에서 Krzystof Cwalina의 주석을 참조하십시오 . 현재 C # 및 Java에는 클래스의 다중 상속이 허용되는 경우 간단한 솔루션이있는 해결되지 않은 문제가 있습니다.
Daniel Earwicker 2010-08-11

-1 상속과 인터페이스는 정말 매우 다릅니다.
kenny

2

인터페이스가 다소 어색합니다. 그들은 동일한 이름과 구현 된 인터페이스가 동일한 동작을 의미한다고 믿기 만해도 계약에 의한 디자인을 지원합니다. 이것은 API 문서 덕분에 작동하며 사람이 확인해야합니다. 이는 인터페이스를 너무 약하게 만듭니다. 이를 해결하는 한 가지 방법은 공식 사양 일 수 있습니다. 반면에 인터페이스는 너무 강하고 너무 엄격합니다. 종종 재사용을 방해하는 인터페이스를 발전시킬 수 없습니다. 이는 메시지 (호출 메소드)를 보내는 프로토콜 (동적 언어의 메커니즘)에 의해 해결되며 해당 메시지가 수신자에 의해 지원되지 않으면 표준 콜백이 호출됩니다. 제약이있는 구체적인 프로토콜을 갖는 것이 더 좋을 것입니다.


1

원격을 생각하십시오 ...

여기에는 클라이언트와 서버가 있습니다. 인터넷에 의해 물리적으로 분리되어 있다고 가정 해 보겠습니다. 클라이언트는 실제 실행이 서버에서 발생하는 메서드를 호출하고 있습니다. 클라이언트의 관점에서 클라이언트는 실행을 수행하는 서버의 개체에 대해 아무것도 알지 못합니다. 그러나 호출 할 메서드를 알고 있습니다. 클라이언트 프로그램을 빌드하는 동안 인터페이스 (또는 계약)에만 노출되기 때문입니다. 우리는 실제로 서버에 살고있는 전체 객체에 노출되지 않습니다. .net 원격에서 몇 가지 데모 앱을 시도하면 나머지는 알아낼 것입니다. 즐거운 프로그래밍.


0

인터페이스를 사용하는 이유는 무엇입니까?

일부 언어는 vtables를 사용하여 다형성 메서드 호출을 구현하고 대부분의 유형 정보를 삭제하므로 인터페이스를 정의 하지 않기 가 어렵습니다 .

그래서 언젠가는 단순히 인터페이스를 사용합니다. 언어 디자인에 필요하기 때문입니다.


0

인터페이스로 시작하여 프록시를 구현하여 구체적인 구현의 메소드를 호출 할 때 지연로드를 허용하거나 일부 확인을 수행 할 수 있습니다.


0

인터페이스는 구현 로직에서 데이터 유형을 분리합니다.


0

인터페이스는 특정 동작의 기능 선언 만 포함하는 프로토 타입 모달을 제공합니다.

이 동작을 클래스에 구현하려면 클래스에서이 인터페이스를 구현해야합니다. 그러면 클래스가이 동작 기능을 갖거나 여러 동작을 가질 수 있습니다.

클래스는 여러 인터페이스를 구현할 수 있기 때문입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.