인터페이스를 이용한 다형성 설명 (인터페이스를 쓰는 이유)

인터페이스를 이용한 다형성 설명 (인터페이스를 쓰는 이유)

다형성에 대해 영상을 찍던 중 설명이 길어져 따로 영상을 만들게 되었습니다 인터페이스는 다소 이해하기 쉽지 않지만 다양한 고급 개념에 두루 사용되는 기능입니다 다형성의 개념을 인터페이스를 이용해 설명합니다 [인터페이스의 장점] 1 구체적인 객체에 의존해서 구현하는 것이 아닌 추상화된 객체를 이용해 구현이 가능하다 interface의 개념은 초창기 Widnwos에도 있었습니다 Microsoft사는 자신의 소프트웨어에 다양한 I/O 객체를 손쉽게 접목시킬 수 있도록 모든 I/O 드라이버에 Read,Write,Open,Close,Seek 기능 구현을 강제 했고 이들은 모두 같은 함수 형태를 가지고 있어야 했습니다 (현재의 interface와 같은 기능이죠?) 그렇게 되면 Windows는 로지텍사의 키보드를 사용하든 Microsoft사의 키보드를 사용하던 상관없이 무조건 Read 함수를 호출하면 어떤 키보드인지 상관없이 값을 읽을 수 있게 하였습니다 이러한 개념은 제가 만든 IEnumerable 관련 영상에서도 말씀드렸지만 IEnumerable을 구현하는 객체는 그 무엇이든 간에 객체를 열거 할 수 있는 것 등으로 Net Framework안에 들어와 있습니다 interface를 사용하면 이런 것과 같이 구체 클래스가 아닌 그들이 가지고 있는 행동(함수)에 맞춰 개발을 할 수 있기 때문에 다양한 현실세계를 컴퓨터 안에서 일관되게 처리 할 수 있게 됩니다 2 객체간에 의존성을 없앨 수 있습니다 의존성이란 설계에 아주 중요한 개념으로 객체가 어떻게 소통하는지 나타내는 것입니다 설계를 구체 클래스에 하게 되면 객체간의 강한 의존성이 생기게 됩니다 그래서 interface를 사용해서 return이나 parameter로 다른 객체와 소통하는 구간에 사용하면 의존성이 줄어들어 자신과 소통하는 객체의 변화에 강한 클래스를 만들 수 있게됩니다 이런 의존성은 과거부터 있었던 많은 Framework에서 발전해 MVC, MVVM 패턴등으로도 승화 되었고 depedecny injection등의 기술이 사용됩니다 관련해서 GOF의 디자인패턴이란 책을 보시면 다형성을 이용한 객체의 의존성을 관리하는 여러 패턴을 살펴보실 수 있을 것입니다 [추가] 3 단위 테스트 가능한 코드를 만들 수 있다 테스트 가능한 코드를 만드는 것은 객체지향 적 사고를 품는 설계의 방식을 필요합니다 테스트 가능하도록 설계하지 않은 코드는 아예 단위 테스트가 불가능 하거나 직접 데이터를 조작하고 지우는 방법의 테스트를 진행해야 합니다 하지만 여기서 주목해야 할 부분은 " Net 예제로 배우는 단위 테스트"의 저자 로이 오셔로브의 생각입니다 그는 메모리에서만 동작해 빠르고 재실행 가능한 것이 유닛 테스트라고 정의 하고 있습니다 직접 데이터를 조작해서 원하는 결과가 이루어 지는 것은 통합 테스트의 과정이라고 말합니다 그럼 위와 같이 실제 데이터를 조작하지 않고 테스트를 작성하기 위해 어떤 방식의 설계를 해야할까요? 인터페이스를 이용해 의존성을 주입하고 주입된 의존성 코드를 테스트에서 mock, stub등으로 바꾸어 오류 상황을 재현해보기도 하고 직접 데이터가 올바로 생성되고 삭제되고 조작되는지 확인해 볼 수 있습니다 이러한 특징으로 interface를 사용해서 설계를 하면 코드가 모듈화 되고 그로인해 유지보수성도 올라간다는 특징이 있습니다 그럼 모든 곳에서 interface를 사용하면 아주 좋겠네요? 그게 또 그렇진 않습니다 interface를 사용하면 그만큼 복잡성이 올라가 실제로 어떤 클래스와 의존하고 있는지 찾기 힘듭니다 (장점이자 단점이 될 수 있겠네요) 그래서 동료들과 어떤 부분을 interface로 추상화 할 것인지 논의해 적절한 곳에 사용해야 합니다