자바에서 인터페이스(Interface)란 메서드들을 선언하고 필요한 상수들을 정의한 프로그래밍 단위로 말할 수 있습니다. 즉, 상수와 구현되지 않은 메서드들만을 갖고 있는 순수한 설계의 표현이라고 할 수 있습니다.

자바에서 클래스는 단일 상속만 가능하기 때문에 다중 상속이 가능한 인터페이스를 지원하고 있습니다.

인터페이스는 처음에 public이 선택적으로 나올 수 있으며, 지정어 interface가 나옵니다. 그리고 인터페이스 이름이 나오고 지정어 extends와 함께 상위 인터페이스가 선택적으로 나올 수 있습니다.

다음으로 상수 정의메서드 선언이 나오며, 이 부분을 인터페이스 몸체라고 부릅니다.

바로 다음과 같이 작성할 수 있습니다.

interface Colors {
//	public static final int RED = 1;
//	public static final int GREEN = 2;
//	public static final int BLUE = 3;

	int RED = 1;
    int GREEN = 2;
    int BLUE = 3;
    
    void setColor(int color);
    int getColor();
}

인터페이스의 몸체 내에서 선언된 필드는 모두 내부적으로 상수를 의미하는 public static final 속성을 갖습니다. 또한 모든 메서드가 추상 메서드로 선언됩니다.

그렇기 때문에, 인터페이스를 구현하는 클래스의 경우에 인터페이스에 있는 모든 메서드를 구현하지 않을 경우에는 반드시 추상 클래스로 선언해야 합니다.

또한, 인터페이스는 생성자를 갖지 않습니다.

추가적으로 자바 8 부터 구현을 가지는 메서드, 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드인 디폴트 메서드(Default Method)와 인스턴스 생성과 상관 없이 인터페이스 타입으로 사용할 수 있는 메서드인 정적 메서드(Static Method) 기능을 제공하고 있습니다. 또한 자바 9 부터 인터페이스 내부에서만 사용할 수 있도록 private 메서드를 구현할 수 있습니다.

인터페이스 확장

이미 존재하는 인터페이스를 사용하여 확장할 수 있는데, 이를 extends 지정어와 함께 콤마로 구분된 상위 인터페이스 여러 개를 사용할 수 있습니다.

interface BaseColors {
	int RED = 1;
    int GREEN = 2;
    int BLUE = 4;
}

interface RainbowColors extends BaseColors {
	int YELLOW = 3;
    int ORANGE = 5;
    int NAVY = 6;
    int VIOLET = 7;
    
    void printColor(int color);
}

interface PrintColors extends BaseColors {
	int YELLOW = 8;
    int CYAN = 16;
    int MAGENTA = 32;
}

정의된 인터페이스 RainbowColorsPrintColorsBaseColors 인터페이스로부터 모든 상수와 메서드들을 상속받습니다.

상위 인터페이스로부터 상수를 상속받을 때, 확장된 인터페이스 내에 같은 이름의 상수가 있는 경우에 상위 인터페이스의 상수는 숨겨집니다.

또한, 아래의 경우처럼 여러 개의 인터페이스로부터 상속받는 다중 상속이 가능합니다.

interface ManyColors extends RainbowColors, PrintColors {
	int Coral = 3;
    int Lavender = 90;
}

인터페이스 구현

인터페이스는 클래스를 통하여 구현한 후 객체를 가질 수 있습니다. 인터페이스를 이용하여 클래스를 정의하는 기본적인 형태는 다음과 같습니다.

class ClassName implements InterfaceName {
	...
}

클래스 이름 다음에 implements가 나오고 구현하고자 하는 인터페이스 이름을 작성합니다.

또한, 상위 클래스를 확장하고 동시에 인터페이스를 구현하여 클래스를 만들 수 있습니다. 이런 경우, 클래스와 인터페이스로부터 다중 상속이 이루어지며 그 형태는 다음과 같습니다.

class ClassName extends SuperClass implements InterfaceName {
	// 변수
    // 메서드
}

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

일종의 클라이언트 코드와의 약속이며 클래스나 프로그램이 제공하는 명세(specification)라고 할 수 있습니다. 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있습니다.

클라이언트 쪽에서는 어떤 식으로 구현이 됐는지 알 필요 없고, 인터페이스 명세만 보고 사용합니다. 즉, 이 모듈이 무슨 일을 한다라는 명세를 클라이언트가 보고 사용하게 됩니다.

어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미를 담기도 합니다.

또한, 하나의 인터페이스를 여러 객체가 구현하게 되면 클라이언트 프로그램은 인터페이스의 메서드를 활용하여 여러 객체의 구현을 사용할 수 있습니다. 이를 다형성이라고 합니다.

이상으로 자바에서 사용하는 인터페이스에 대해서 간단히 알아봤습니다.

profile
꾸준함으로 성장하는 개발자 지망생

0개의 댓글