Java 입문 | 인터페이스(Interface)

인터페이스(interface)는 상수와 메소드 선언들의 집합이다. 인터페이스를 이용하여 완벽하게 추상화를 시킬 수 있다. 인터페이스는 클래스와 유사 하지만, 인스턴스 변수가 부족하고 모든 메소드가 추상 메소드로 선언이 된다. 즉, 인터페이스는 추상 메소드와 상수만 가진다.

인터페이스는 존재하는 모든 멤버 변수는 상수로 사용되며, 모든 메소는 추상 메소드이다. 따라서 모든 변수에 final static을 붙이거나, 선언되는 메소드에 abstract 키워드를 붙일 필요가 없다. 그리고, 추상 클래스와 동일하게 인스턴스를 생성할 수 없다.

인터페이스 왜 사용하는가?

이런 인터페이스는 왜 사용하는 것인가? 자바에서는 클래스 상속은 하나의 상위 클래스만 가질 수 있다. 다시 말해서 자바는 다중 상속(multiple inheritance)를 지원하지 않는다. (그에 비해 C++ 같은 경우는 다중 상속이 가능 하다.) 그래서 완벽한 다중 상속은 아니지만 다중 상속과 비슷하게 구현을 할 수가 있다. 다른 이유는 기능의 통일을 위하여 인터페이스를 사용한다. 여러 클래스를 메소드를 통일하고 기능만 다르게 구현을 하고 싶은 경우가 있다. 이때 인터페이스를 사용하면 인터페이스를 데이터 타입 동일하게 선언하고 각 다른 클래스로 객체를 선언하여 같은 메소드를 호출하더라도 다른 기능이 동작하는 효과를 볼 수 있다.

인터페이스 정의

인터페이스는 클래스와 비슷하게 정의된다.

public interface 인터페이스이름 [extends 인터페이스이름, ...] {
   // 상수 선언
   // 메소드 선언
}

인터페이스의 모든 메소드의 접근 제한자는 public이기에 따로 선언하지 않아도 된다.

인터페이스 안에는 변수와 메소드만 선언되는데, 선언된 모든 변수는 final static 속성을 가지고 있다. 메소드는 기본적으로 public 접근 제한자가 포함되어 있다.

모든 인터페이스는 독립적으로 인스턴스를 생성할 수 없다. 반드시 파생 클래스에서 인터페이스의 메소드를 재정의 한 후에 파생 클래스의 인스턴스를 통해 사용해야 한다.

인터페이스 사용

클래스에서 인터페이스를 사용하기 위해서는 implements 키워드를 사용한다. 다음은 인터페이스를 포하는 클래스의 구문 형태이다. implements는 extends 키워드와 다르게 여러 개의 인터페이스를 나열하여 다중 상속을 구현할 수 있다. 클래스에 하나 이상의 인터페이스를 구현한다면 인터페이스들은 콤마(,)로 구분된다.

[public/final/abstact] class 클래스명 extends 상위클래스명 implements 인터페이스명[, 인터페이스명, ...] {
    // 멤버변수
    // 생성자
    // 메소드
    // 인터페이스에 선언된 모든 메소드 오버라이딩하여 반드이 선언
}

인터페이스 사용되었다면 사용된 인터페이스에 정의된 모든 메소드가 클래스 내에 반드시 오버라이딩되어 구현이 되어야 한다. 그리고 인터페이스의 메소드를 재정의 할 때는 반드시 public 접근 제한자로 지정해 줘야 한다.

인터페이스간에 상속

인터페이스도 클래스처럼 다른 인터페이스를 상속 받을 수 있다. 인터페이스들의 상속에도 extends 키워드를 사용한다.

public interface 인터페이스명 extends 인터페이스명[, 인터페이스명, ...] {
    // 상수 선언
    // 메소드 선언
}

인터페이스는 클래스와 동일하게 계층 구조를 가질 수 있다. 클래스는 하나의 상위 클래스만 상속이 가능 하지만 인터페이스는 여러개의 인터페이스을 상속 받을 수 있다.