인터페이스는 추상클래스처럼 추상메소드를 가지지만 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반메소드 또는 멤버변수를 구성원으로 가질 수 없다.
오직 추상메소드와 상수만을 멤버로 가질 수 있으며 그 외의 다른 어떠한 요소도 허용되지 않는다.
추상클래스를 미완성설계도라고 한다면 인터페이스는 구현된 것이 아무것도 없고 밑그림만 그려져 있는 기본 설계도라고 할 수 있다.
인터페이스도 추상클래스처럼 불완전한 것이기 때문에 그 자체만으로 사용되기 보다는 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다.
2. 인터페이스 작성 및 상속
인터페이스를 작성하는 것은 클래스를 작성하는 것과 같다.
다만 키워드로 class 대신 interface를 사용한다는 것만 다르다.
일반적인 클래스의 멤버들과 달리 인터페이스의 멤버들은 다음과 같은 제약사항이 있다. * 모든 멤버변수는 public static final 이어야 하며 생략할 수 있다. * 모든 메소드는 public abstract 이어야 하며 생략할 수 있다.
인터페이스에 정의된 모든 멤버에 예외없이 적용되는 사항이기 때문에 제어자를 생략할 수 있는 것이며 생략된 제어자는 JVM이 자동적으로 추가해 준다.
인터페이스는 인터페이스로부터만 상속받을 수 있으며 클래스와 달리 다중상속, 즉 여러 개의 인터페이스로부터 상속받는 것이 가능하다.
3. 인터페이스의 구현
인터페이스도 추상클래스처럼 그 자체로는 인스턴스를 생성할 수 없으며 추상클래스가 상속을 통해 추상메소드를 완성하는 것처럼 인터페이스도 자신에게 정의된 추상메소드의 몸통을 만들어주는 클래스를 작성해야 하는데 그 방법은 추상클래스가 자신의 상속받는 클래스를 정의하는 것과 다르지 않다. * 다만 클래스를 확장한다는 의미해서 extends를 사용 안함 * 인터페이스를 구현한다는 의미의 implements 키워드를 사용
인터페이스의 이름은 주로 '~을 할 수 있는'의 의미인 'able'로 끝나는 것들이 많다.
그 이유는 어떠한 기능 또는 행위를 하는데 필요한 메서드를 제공한다는 의미를 강조하기 위해서이다.
또한 그 인터페이스를 구현한 클래스는 '~를 할 수 있는' 능력을 갖추었다는 의미이기도 하다.
이름이 able로 끝나는 것은 인터페이스라도 추측할 수 있지만, 반드시 able로 끝나는 것은 아니다.
4. 인터페이스를 이용한 다형성
다형성에서 자손클래스의 인스턴스를 조상타입의 참조변수로 참조하는 것이 가능하다는 것을 배웠다.
인터페이스 역시 이를 구현한 클래스의 조상이라 할 수 있으므로 해당 인터페이스의 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있으며, 인터페이스 타입으로의 형변환도 가능하다.
즉, 인터페이스는 메소드의 매개변수의 타입으로 사용될 수 있으며, 메소드의 리턴타입으로 인터페이스 타입을 지정하는 것도 가능하다. * 리턴타입이 인터페이스라는 것은 메소드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 의미이다.
5. 인터페이스의 장점
표준화가 가능하다.
프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다.
개발시간을 단축 시킬 수 있다.
인터페이스가 작성되면 메소드를 호출하는 쪽과 동시에 다른 한쪽에서는 인터페이스를 구현하는 클래스를 작성하게 되면 인터페이스를 구현하는 클래스가 작성될 때까지 기다리지 않고도 동시에 개발 진행 가능하다. ( 선언부는 인터페이스에 작성 되어있기 때문에 다 만들때까지 기다릴 필요 없다. )
서로 관계없는 클래스들에게 관계를 맺어줄 수 있다.
서로 상속관계에 있지도 않고, 조상클래스를 가지고 있지 않은 서로 아무런 관계도 없는 클래스에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어줄 수 있다.
독립적인 프로그래밍이 가능하다.
인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제 구현에 독립적인 프로그램을 작성하는 것이 가능하다.
클래스와 클래스 간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면 한 클래스의 변경이 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.