인터페이스 사용 이유와 장점에 대한 질문

tyolee83의 이미지

인터페이스를 써야할것 같으면서도, 쓰고 있으면서도 이걸 꼭!! 써야하는지에 대해 뭔가 미심쩍어서 계속 고민중입니다.

구글링을 하다가 어떤 블로그에서 다음과 같은 내용을 보았고, 그나마 이해가 되는데, 추가로 여쭤보고 싶은게 있어서 KLDP에 달아봅니다
(블로그 : http://blog.naver.com/PostView.nhn?blogId=mirakkul&logNo=20121109408)

일단 블로그 글은 다음과 같습니다.

-----------------
1. 개발시간을 단축시킬 수 있다.
일단 인터페이스가 작성되면, 이를 사용해서 프로그램을 작성하는 것이 가능하다.
메서드를 호출하는 쪽에서는 메서드의 내용에 관계없이 선언부만 알면 되기 때문이다.
그리고 동시에 다른 한 쪽에서는 인터페이스를 구현하는 클래스를 작성하도록 하여,
인터페이스를 구현하는 클래스가 작성될 때까지 기다리지 않고도 양쪽에서 동시에 개발을 진행할 수 있다.

2. 표준화가 가능하다.
프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음,
개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다.

3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
서로 상속관계에 있지도 않고, 같은 조상클래스를 가지고 있지 않은
서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.

4. 독립적인 프로그래밍이 가능하다.
인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에
실제구현에 독립적인 프로그램을 작성하는 것이 가능하다.
클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면,
한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.
--------------

1,2번은 이해되는데, 3,4번이 와닿지가 않습니다.

<질문> 1) 3의 내용은 적절한 예시를 보면 이해가 될것 같기도 한데, 어떻게 검색해야 할지 몰라서 검색이 힘드네요... 혹시 적절한 예제 있으면 알려주셨으면 합니다.

2) 4의 내용은 한 클래스에서 다른 클래스를 참조할때(인터페이스 관련 내용이니까 메소드 호출이겠죠) 직접 참조하지 않고 인터페이스를 통해 참조하면 좋다는 말인데.. 클래스를 직접 참조하더라도 함수 형만 바뀌지 않으면 영향을 안받는거 아닌가요? 두 클래스를 함께 컴파일 할때 영향이 있다는 얘기인건가요..?
그리고 함수 형식(파라미터 갯수나 타입)이 바뀌면 인터페이스도 어차피 바뀌어야 되니 영향을 미칠 것 같은데, 이 경우는 빼고 말하는 것이겠죠??

명확한 이해가 절실한데 참 힘드네요... 도움 부탁 드립니다 ㅠㅠ

oosap의 이미지

2)
>> 스트래티지 패턴을 알아보세요. 헤드퍼스트 디자인패턴 1장입니다.
[[디자인 원칙]]
애플리케 이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리 시킨다.
구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.
서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.
클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다.(OCP, Open-Closed Principle)

[[패턴 1. 스트래티지]]
알고리즘 군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지를 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.

등의 내용이 나와있어요. 위 디자인 원칙은 1장뿐이 아니고 책 전체에 걸쳐 설명하고 있습니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

sblade의 이미지

일단 자바 종속적인 내용이긴 한데,

3번같은 경우는 아래 링크의 예제를 보면 (첫 예제가 자바 예제입니다.)

http://debasishg.blogspot.com/2008/06/scala-to-java-smaller-inheritance.html

서로 관계없는 Employee, WageWorker, Contractor 를 Salaried 라는 interface 를 상속받게 해서 salary() 라는 method 를 제공해 주면 총 salary 를 계산하는 Salaried 로 parametrization 된 제 3의 method 가 세 클래스 모두를 처리할 수 있도록 하고 있습니다. 즉 이 interface 가 제공하는 것 이외의 다른 면에서 관계가 없는 class 들을 묶어주고 있습니다.

4번의 경우는 Java collection api 가 적절한 예인 것 같습니다. Map interface 를 예를 들면, 기본적인 map 의 기능을 이용하는 경우 (insertion, search, deletion) map 의 실제 구현이 HashMap 인지 TreeMap 인지는 중요하지 않습니다.

예를 들면 만약 HashMap 을 다른 사람이 구현해서 내가 그걸 사용하고 있었는데, 그 사람이 나중에 get(key k) method 의 이름을 전부 obtain(key k) 으로 바꾸고 싶다고 하면,

interface 를 통한 abstraction 이 안되어 있다면 내 코드를 전부 다시 고치고 재컴파일해야 되겠지만
get(key k)를 제공하는 map interface 가 있다면, 그 사람이 get(key k) { return obtain(key k); } 만 해주면 되겠죠.

또 나중에 또다른 사람이 엄청나게 빠른 SuperHashMap 이란 것을 구현해서 내 map 을 전부 이걸로 바꾸고 싶다면
map interface 가 없다면 내 코드를 다시 바꾸고 HashMap 을 참조하는 모든 클래스를 재컴파일해야 되지만
양측 모두 map interface를 따른다면 new HashMap 만 new SuperHashMap 으로 바꾸면 되겠죠.

lmk378의 이미지

글이 좀 이론적이고 어려운것 같아(사실 저도 잘 이해를 못하고 있습니다^^;;) 제가 느낀 interface에 대해서 쓸게요~
제 생각에 interface는 그냥 추상적인것에 이름을 붙이기 위해 필요한것 같습니다.
예로 들면 Listener란 interface가 있습니다.
리스너가 뭘까요? 듣는자? 추상적이지 않나요?
실제로 button을 클릭시 동작하는 메커니즘을 만들어 주기 위해 Listener를 사용합니다.(버튼의 동작을 듣는자로 해석하시면 될것 같아요^^;;)
또한 자바의 경우 다중상속을 지원하지 않습니다. 하나의 클래스는 하나의 부모 클래스만 상속이 가능한 것입니다.
실제론 이것을 우회하기 위한 용도로도 사용합니다.
요약하면 실제 구현이 필요없는(혹은 구현을 하기도 어려운) 추상적인 Class를 생성해서 다른 여러 클래스에서
상속받아 공통적인 성분을 각 클래스에서 따로따로 구현하고 싶다 하시면 사용하면 되는겁니다.^^;;
만약 이걸 클래스로 만들어 버리면 이 클래스를 상속받는 다른 클래스는 다른 어떤 클래스도 상속할 수 없게 되는 겁니다~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.