Q : 자바를 공부하는데여... 공부하다가 abstract와 Interface의 차이를 느끼지 못하여 이렇게 질분드립니다...
둘다 기능을 강제할수있고... 뭐 그런데... ...
차이가 있긴 있나여?
A : 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 개발에서 중요한 요소로 사용되는 역할을 합니다.
처음에 자바 공부를 시작하면서 이러한 문제에 대해서 고민을 많이 하게 됩니다. 결국 이러한 궁금증들은 java가 원래 어떠한 개념으로 탄생되었는지를 아시고, 객체지향 설계에 대해서 조금 더 공부하셔야지 풀릴 수 있는 문제일 것입니다.
'Homo Faber > Concepts' 카테고리의 다른 글
"Less is More" (0) | 2009.02.24 |
---|---|
유스케이스 드리븐 방식의 한계 (0) | 2008.03.10 |
자바에서 상속 (1) | 2008.03.04 |
Domain Driven 과 Model Driven (1) | 2008.02.28 |
Domain Driven Design(2) - Entity [Reference Object] (0) | 2008.02.26 |