• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

인터페이스 질문입니다.

20.08.18 07:37 작성 조회수 215

0

추상화는 규격을 만들고 상속받은 클래스에서 반드시 만들게 강제하는 것으로 이해를 하였습니다.

다만 그다음 인터페이스에서 추상화와 인터페이스의 다른점을 모르겠습니다. 그냥 추상화 쓰면될거같은데 인터페이스를 왜사용하는지에 대한 의문이 남아서 질문드립니다.

마지막에 설명해주신

static void PrintFigure(IFigurable obj)

 { 

Console.WriteLine($"{obj.GetType().FullName} 면적 : {obj.Area()}");

 } 를 보고 아 인터페이스는 따로 안만들고 다 쓸 수있는건가? 했는데 혹시나해서

static void Abstract_Test(Figure obj)

{

Console.WriteLine($"{obj.GetType().FullName} 면적 : {obj.Area()}");

 }

인터페이스가 아닌 추상클래스를 사용해도 똑같이 동작하는 것을 보고 도대체 추상화를 안쓰고 인터페이스를 왜쓰는지 궁금해서 질문남겼습니다.!! 

답변 3

·

답변을 작성해보세요.

1

추상 클래스와 인터페이스는 완전히 다른 목적입니다. 즉, 추상클래스는 클래스이고 인터페이스는 클래스가 아닙니다. 다시 말해서 추상클래스는 함수를 정의하고 있고, 이 클래스를 상속받는 자식 클래스에서 overriding할 수 있도록 해줌으로써 융통성을 배가시켜 주는 역할을 합니다. 따라서 특정 기능을 미리 구현해서 제공함과, 구현의 기능을 바꾸어 사용할 수 있도록 하는 것이지요.

그러나 인터페이스는 강력한 결합을 제거해주는 목적으로 이해하시면 됩니다. 영어로는 tightly coupling이라고 하는데 예를 들면 Student student = new Student();와 같이 사용하는 경우를 강력한 결합이라고 합니다. 설명해보면 이미 Student 클래스에서 정의한 함수와 속성 등을 그대로 사용해야만 하고, 만일 Student의 구현 내용이 바뀌게 되면 이를 사용한 코드들이 모두 영향을 받고 어쩌면 수정되어야 하는 상황인거죠.

인터페이스는 규약만을 정의한 것입니다. 즉, 누구든지 어떤 인터페이스를 구현해야 한다면 반드시 그 인터페이스에서 정의하고 있는 함수들을 구현해야 하는데 구현의 내용은 모르겠다는 겁니다. 즉 신경쓰지 않는다는 것이죠. 그리고 변수를 선언할 때 타입을 인터페이스를 사용해서 IStudent student = new Student1();으로 사용할 수 있는데 다른 사람이 Student2클래스를 만들었다면 IStudent student = Student2();와 같이 구현할 수 있습니다. 그러나 IStudent를 사용하는 변수는 목적에 따라서 IStudent를 구현한 많은 클래스 후보 중, 자신에게 적절한 클래스를 사용할 수 있지만 IStudent를 사용하기 때문에 기존의 소스코드를 바꿀 필요가 전혀 없는 것이지요. 왜냐하면 모든 IStudent를 구현하고 있는 클래스들은 동일한 시그니쳐를 가지고 있기 때문입니다.

이와 같이 인터페이스는 동일한 시그니처만을 선언하고 반드시 구현하도록 하는 역할을 하기 때문에 추상 클래스던지 아니면 일반 클래스와는 그 목적이 다르다고 할 수 있습니다.

인터페이스를 보다 더 이해하시려면 디자인 패턴쪽을 공부해보시면 많은 도움이 될것 같습니다.

0

추상클래스에 대해서 설명을 못드려서 답변 추가 합니다.

추상클래스는 public, protected 접근범위를 갖는 변수 또는 함수명을 정의(표준화)하고 그 구현을 자식 클래스들이 서로 다르게 (다형성) 구현할 수 있도록 하는 목적으로 사용됩니다. 자식들은 접근 가능한 모든 변수들에 대해서 공통적으로 사용할 수 있고 함수명도 모두 같기 때문에 프로그램 개발자 입장에서는 자식클래스들을 사용할 때 마치 인터페이스와 동일하게 표준화된 함수명 등을 사용할 수 있겠지요. 

그러나 인터페이스 선언에서는 변수를 사용해서 상속받게 할 수는 없습니다. 함수 역시 완성된 함수를 만들어서 자식 클래스들이 공유할 수 있도록 하거나 아니면 자식 함수에서 구현을 강제해서 기능을 갖추도록 할 수 있는 목적이 있습니다. 따라서 클래스들이 상속을 통해서 확장해나갈 때 이들이 공유해야 할 것들과 반드시 구현해야 하는 표준 함수를 선언하여 확장개발할 때 유용하게 사용됩니다.

0

손기명님의 프로필

손기명

질문자

2020.08.19

자세한 설명 감사합니다. 인터페이스와 추상화라는걸 처음 접해봐서 많이 헷갈렸습니다.

많은 구글검색과 다른 영상들도 보면서 어느정도 이해를 하였습니다.

다중상속이 금지된 c#에서 문제되는 기능부는 자식이 만들게하고 인터페이스만 남겨두어 사용할때도 사용하고

또한 인터페이스를 상속받은 클래스를 인터페이스 변수에 저장하고 그 변수를

인터페이스를 매개변수로 하는곳으로 보내서 메서드를 사용하는등 추상클래스에서는

할수없는 부분들을 할 수 있는 것을 보고 지금 막 설명할 수는 없지만 어떻게 어느상황에서

사용해야할지는 감이 왔습니다.

감사합니다.