2012년 7월 28일 토요일

[java] interface의 필요성

Interface는 Java 초심자 입장에서는 참으로 이해하기 힘든 존재입니다.

이미 Class가 있는데 굳이 Interface라는 문법이 필요한가도 그렇고, 이 Interface가 실질적으로 로직은 기술할 수 없는 반쪽짜리 class라는 점이 더욱 그렇습니다.

이 Interface를 이해하기 위해서 USB를 예로 들어보겠습니다.

모든 컴퓨터 마다 몇개씩 달려있는 USB단자는 매우 편리합니다. 어떠한 주변기기든 USB에 꼽기만 하면 그걸로 O.K. 입니다.

우리는 아무 생각없이 사용하고 있지만, USB라는 표준이 없었을때 얼마나 불편한지를 생각해보면 이 USB라는 표준하나로 얼마나 많은 사람들이 편리함을 얻고있는지 알수있을 겁니다.

마우스, 키보드, 그외 각종 주변기기가 종류별로, 제조사 별로 모두 제각각의 단자를 가지고 있다면 기껏산 마우스가 자신의 컴퓨터에 맞지 않거나 하는 문제가 빈번히 발생할 겁니다. 또 이 문제를 해결하기 위해서 우리는 수많은 종류의 아답터를 구비해 놓고있어야할겁니다.

Interface는 USB표준과 같은 역할을 하는 것으로, 만약 여러분이 작성한 class가 파라미터를 Interface로 받도록 구현해놓았다면, 어떤 클래스든지 여러분이 만든 class의 기능을 이용하기 위해서 그 Interface만 구현하면 될겁니다.

이는 모든 마우스, 키보드 그외 컴퓨터 주변기기 제조사들이 USB표준대로만 물건을 만들어 팔면 별 고민없이 여러분의 컴퓨터에서 사용할수있는 상황과 같습니다.

실제 코드상의 예를 들자면 Java의 Comparable이 좋은 예가 될겁니다.
http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

정렬을 원하는 class라면 그 class가 무엇이든지 Comparable을 구현한 후, Collections.sort에 집어넣으면 정렬이됩니다.

만약 Java의 정렬을 구현한 개발자가 이와같은 설계대신 Integer, String, Date와 같은 기본적인 class의 정렬만 따로 구현해놨다면, 우리는 정렬이 필요할 때마다 직접 정렬 로직을 구현하거나, 정렬을 도와주는 helper class등을 따로 이용해야했을 겁니다.

게다가 Class의 정렬규칙이 변경되기라도 한다면 그 정렬 로직자체의 수정이 불가피했을 겁니다.

하지만 Java에서는 정렬이라는 행위를 추상화하고 Interface를 이용함으로서 이러한 불편함을 최소화했습니다.


우리가 Class를 설계할때도 항상 이러한 부분을 고려해야합니다. 자신이 만들고자 하는 기능을 최대한 작은 부분 부분으로 나누고 추상화해서 범용적으로 사용될 수 있는지 생각해 봐야합니다.

범용적으로 사용될만한 기능이 있다면, '이 기능을 사용하고 싶으면 이 Interface만 구현해.'
라고 설계합니다.

추후 로직의 재사용뿐만 아니라 유지보수시에도 상당히 편리해집니다.




댓글 1개: