인터페이스(interface)는 객체의 사용 방법을 정의한 타입이다.
- 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다.
개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 하기 위해서
풀어서 얘기하자면, 인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하다.
즉, 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴값이 다를 수 있다.
따라서 코드 변경 없이 실행 내용과 리턴값을 다양화를 위해 인터페이스를 사용한다.
🚩 .java
소스파일로 작성되고 컴파일러를 통해 .class
형태로 컴파일된다.
✅ 선언
- interface
키워드를 사용해 선언한다.
[ public ] interface 인터페이스명 { ... } // public 생략 가능
- 인터페이스는 상수와 메소드만을 구성 멤버로 가진다.
- 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.
= 인터페이스는 데이터를 저장할 수 없기 때문에 데이터를 저장할 인스턴스 or 정적 필드를 선언할 수 없다.
상수 필드 (Constant Field)
인터페이스는 객체 사용 설명서와 같다. 때문에 런타임 시 데이터를 저장할 수 있는 필드를 선언할 수 없다. 그러나 상수 필드 선언은 가능하며, 이때 상수는 인터페이스에 고정된 값으로 값을 변경할 수 없다. 또한 상수를 선언할 때에는 반드시 초기값을 대입해야 한다.
- 상수는 public static final
로 선언한다.
... public
, static
, final
을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
[ public static final ] 타입 상수명 = 값;
- 상수명은 대문자로 작성하되, 서로 다른 단어로 구성되어 있을 경우에는 언더바(_)로 연결하는 것이 좋다.
- 인터페이스 상수는 static {}
블록으로 초기화할 수 없기 때문에 반드시 선언과 동시에 초기값을 지정해야 한다.
public interface RemoteControl {
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
}
추상 메소드 (Abstract Method)
추상 메소드는 객체가 가지고 있는 메소드를 설명하는 메소드를 말한다. 이 메소드는 호출할 때 어떤 매개값이 필요하고, 리턴 타입이 무엇인지만 알려준다. 실제 실행부는 객체(구현 객체)가 가지고 있다.
- 추상 메소드는 리턴 타입, 메소드명, 매개 변수만 기술되고, 중괄호 {}를 붙이지 않는 메소드를 말한다.
- public abstract
특성을 갖기 때문에 public abstract
를 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
public interface RemoteControl {
//상수
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
//추상 메소드 ... 메소드 선언부만 작성, public 생략 가능
public void turnOn();
public void turnOff();
public void setVolume(int volume);
}
디폴트 메소드 (Default Method)
디폴트 메소드는 인터페이스에 선언되지만 사실은 객체(구현 객체)가 가지고 있는 인스턴스 메소드라고 생각하면 된다.
※ Java8 이상부터 허용한다.
- 형태는 클래스의 인스턴스 메소드와 동일한데, default
키워드가 리턴 타입 앞에 붙는다.
[ public ] default 리턴타입 메소드명(매개변수, ...) { ... }
- 디폴트 메소드는 public
특성을 갖기 때문에 public
을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
public interface RemoteControl {
...
//디폴트 메소드 ... 실행 내용까지 작성
default void setMute(boolean mute) {
if(mute) {
System.out.println("무음 처리");
} else {
System.out.println("무음 해제");
}
}
}
정적 메소드 (Static Method)
정적 메소드는 디폴트 메소드와 달리 객체가 없어도 인터페이스만으로 호출이 가능하다.
※ Java8 이상부터 허용한다.
- 형태는 클래스의 정적 메소드와 완전 동일하다.
[ public ] static 리턴타입 메소드명(매개변수, ...) { ... }
- 정적 메소드는 public
특성을 갖기 때문에 public
을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
public interface RemoteControl {
...
//정적 메소드
static void setMute(boolean mute) {
System.out.println("건전지 교환");
}
}