인터페이스는 클래스에게 특정기능을 위한 메소드들을 제공합니다.
인터페이스는 스펙배포 목적이며 통합개발실행환경을 제공하는 목적으로 쓰입니다.
인터페이스는 만들 때 는 하나의 클래스가 아닌 지금 존재하지 않는 클래스에서의 재사용까지 생각을 하면서 만들어야 합니다.
인터페이스를 현실세계에서 예를 들면 벽돌이 있습니다.
그리고 나무토막이 있습니다.
이것들은 공통적으로 쌓을 수가 있습니다. 그러면 현실세계에서는 그러한 “쌓을 수 있다”라는 말은 하나의 기능입니다. 그래서 자바에서는 그러한 것은 클래스마다 존재하는 것이 아니라, 인터페이스라는 것을 통하여 공통적으로 “쌓을 수 있다”라는 것은 표현 할 수 있습니다. 역으로 “쌓을 수 있다”를 생각해보면 벽돌과 나무토막이 나올 수가 있습니다. 그러한 현실세계를 나타내기 위해 자바는 인터페이스를 사용한다고 생각합니다. 그래서 그 “쌓을 수 있다”라는 것으로 공통점으로 해서 “쌓을 수 있다”라는 인터페이스를 사용하는 클래스들을 모아서 관리 할 수가 있고 그걸 이용해서 다형성을 구현할 수 있습니다.
물론 "쌓을 수 있다"는 인터페이스에는 무언가를 쌓기 위한 다양한 추상메소드가 선언되어 있고 벽돌과 나무토막은 그 메소드들을 구현하고 있을 것입니다.
이러한 "쌓을 수 있다"라는 인터페이스를 나무토막, 벽돌 등등 어떠한 클래스가 구현하느냐에 따라 동일한 인터페이스로 다양한 행동을 할 수 있습니다.
추가적으로 C++에서는 다중상속을 지원하고 있습니다. 하지만 자바에서는 다중상속을 지원하지 않고 있습니다. 그래서 C++의 코드를 자바로 이식할 때 자바에서는 인터페이스를 통해서 다중상속과 비슷한 효과를 볼 수 있기 때문에 인터페이스로 다중상속을 나타냅니다.
인터페이스는 기본적으로 인스턴스화가 될 수 없기 때문에 멤버변수를 가질 수 없습니다. 그렇기 때문에 생성자도 정의 할 수 없습니다. 하지만 상수형 데이터는 인스턴스화와 상관이 없기 때문이 가질 수 있습니다.
또한 기본적으로 인터페이스에 선언되어 있는 메소드들은 추상메소드의 형태입니다. 그 이유는 인터페이스는 메소드를 제공하기 위한 타입인데 그 메소드들을 쓰지 않는다면 의미가 없기 때문입니다.
인터페이스는 배용이기 때문에 메소드에 public,abstract 키워드를 써주어야 합니다. 그렇기 때문에 자바컴파일러에서 public, abstract가 없는 경우 기본적으로 public, abstract를 메소드에 자동으로 추가 해줍니다.
인터페이스를 구현하는 클래스는 그 인터페이스에 있는 메소드들을 꼭 구현해야 합니다. 인터페이스의 메소드를 구현하지 않을 거라면 그 인터페이스를 쓰면 안되고 쓸 수가 없습니다. 하지만 추상클래스의 경우는 인터페이스의 추상메소드들을 서브클래스에게 위임 할 수 있고, 인터페이스의 확장관계에는 확장한 인터페이스에서는 구현할 클래스에서 위임 할 수 있습니다.
방법은 다음과 같이 클래스에 구현을 하거나, 인터페이스들 끼리 확장도 가능합니다.
ClassName implements interfaceName
interfaceName extends interfaceName
ClassName extends ClassName implements interfaceName
ClassName extends ClassName implements interfaceName, interfaceName
이러한 인터페이스의 특성을 통해 명세와 구현을 분리할 수 있습니다다. 관심분리(소프트웨어용어) : 인터페이스만을 보여주고 실제 실행은 클래스객체를 통해서 하게하여 클래스의 구현부를 숨깁니다.
'IT > 개발' 카테고리의 다른 글
오버라이딩(overriding) (0) | 2013.08.17 |
---|---|
객체(object) 캐스팅(casting) (0) | 2013.08.17 |
추상클래스(abstract class) (0) | 2013.08.16 |
다형성(polymorphism) (0) | 2013.08.15 |
상속(inheritance)과 확장(extend) (0) | 2013.08.15 |