sitelink1 | |
---|---|
sitelink2 | |
sitelink3 | |
sitelink4 | |
sitelink5 | |
sitelink6 |
해드퍼스트 책에서는 맨 첫장에 strategy 패턴을 소개하면서 interface와 abstract클래스의 개념적인 차이에 대해 일련의 예를 들어가며 설명해 주고 있었다.
그 차이는 바로 상속과 구현이라고 했는데, 처음에 객체지향에 대해 공부할 땐 구성의 의미에 대해 잘 몰랐었다.
사실 interface나 abstract클래스의 사용을 봤을때 문법적인 차이 말고는 개념적으로도 유사한 점이 많다.
둘다 상속 또는 확장을 통해서 서브클래스에 반드시 구현해야 하는 메서드를 포함시키기 때문에 서브클래스가 무엇을 해야 하는지 규정짓고 있다는 점이 유사하다.
곰곰히 생각해본 결과 interface는 다중 상속이 가능하다.
필요에 의해 만들어야 할 클래스가 있다면 그 클래스의 기능을 파악하고 미리 정의된 기능대로 interface를 상속하게 된다.
즉, interface는 그 클래스의 역할 또는 임무를 명시적으로 표현한다고 생각된다.
코드상으로는 abstract클래스나 interface에게 코드의 표현이라던지 구현의 방법에 있어서 도대체 어떤 차이가 있는지 구분하기 힘들다.
내가 만드는 클래스가 abstract클래스를 확장하던, interface를 상속받던 구현 방법에는 변함이 없을테니까 말이다.
위의 설계도나 코드를 보면 IDisplay 라는 interface를 사용하여 diplay 라는 메서드를 구현해야 함을 상속시키고 있다.
왜 그래야 하는지 모른다. 단지, interface를 사용해야 한다는 강박관념 때문인걸까?
그래야 유연한 프로그램이 가능하다는 것을 강조하는 것일까?
대략 느낌상의 차이는 알고 있었지만 명확한 개념적 분리가 이뤄지지 않아서...
지식인을 검색해봤다. 역시 지식인이다.
나의 궁금증을 잘 풀어주는 답변을 찾았다.
abstract와 interface, 정확하게 말하면, abstract class 와 interface의 차이를 말씀하시는 거겠죠....(abstract modifier는 class 와 method 둘 다 붙일 수 있습니다. method와 interface를 비교할 수는 없으니까요.)용어에서 알 수 있듯이, 한쪽은 class이고, 다른 한쪽은 interface 입니다. class와 interface의 역할은 분명히 나뉘어져 있죠.
일반적으로, class는 초기화 되어서 생성될 수 있습니다. 그러나, abstract class는 초기화 되어서 생성될 수 없는 class 입니다. class의 성질을 모두 가지면서 이러한 성질 하나의 차이로 abstract 와 concrete class 로 나뉘게 됩니다. 그럼, abstract class는 왜 필요할까요? abstract class는 그 자체로 불완전하기 때문에 다른 class가 이 abstract class를 상속받아야 합니다. 즉, 이 abstract class는 개발자가 구현시에 반드시 이 class를 상속받고자 하기 원할 때에 사용할 수 있습니다. 이러한 것을 '설계 의도' 라고도 얘기를 하죠. javax.servlet.http.HttpServlet을 예를 들면, 개발자가 서블릿을 구현하려면 반드시 HttpServlet이라는 abstract class를 상속받아서 구현해주어야 합니다. (물론, 다른 방법도 있긴 하지만 설명을 간단하기 위해서 일반적으로 사용하는 방법을 설명드립니다.) 이것은 다시 말하면, 서블릿을 개발하는데 기본적인 API를 제공하는 java 진영에서는 이 HttpServlet을 개발자가 반드시 구현해주어서 웹으로 서비스를 해주기를 원한다는 얘기죠. 개발자가 HttpServlet 상위의 모든 부분을 구현해주어서 별도의 서블릿을 만들어도 상관없지만, 기타 공통으로 사용되는 부분들은 상위의 클래스 (HttpServlet 상위의 클래스)로 모두 옮겨놓고, 단지 개발자는 service 메소드만 구현하도록 만든거죠.
interface 라는 것은 타입(type) 또는 역할(role)이라는 관점에서 보셔야 할 겁니다. class와 interface의 차이 중에 하나가 단일 상속과 다중 상속입니다. interface는 다중 상속이 가능합니다. 또한, interface는 abstract 클래스와 마찬가지로 직접적으로 초기화할 수 없습니다. interface가 실제 구현상에서 사용되는 예들은 다형성(polymorphism)일 것입니다. 이것은 interface가 하는 역할이 해당 객체에 대한 타입(type) 또는 역할(role)을 규정짓는데 사용된다는 것을 의미합니다. 다시 말하면, interface는 해당 객체에 대한 행동 규약을 미리 정해놓는다고 생각하시면 됩니다. 이렇게 구현된 객체는 외부에서 바라볼때에 구체적으로 구현된 클래스를 바라보는 것이 아니라, interface를 바라보면 그 interface를 구현한 클래스가 어떤 기능을 하는지 알 수 있습니다. 또한, 같은 행동이라 하더라도 실제로 필요에 따라서는 그 구체적인 구현이 달라질 수 있으며 시간이 지나면서 구현 자체가 다른 방식으로 변경될 수 있습니다. 이러한 경우, 외부에서 바라보는 객체는 interface만을 바로보았기 때문에 그 변경에 대한 영향을 최소한으로 줄일 수 있는 장점이 있습니다. 사실, interface는 객체지향 개발, Component-based 개발에서 중요한 요소로 사용되는 역할을 합니다.