인터페이스 선언: class키워드 대신에
interface
키워드를 사용한다!
인터페이스 이름도 클래스 이름 작성 방법과 동일하다. (대소문자 구분, 첫 문자 대문자, 나머지 소문자로 하는 것이 관례)
public 접근 제한은 다른 패키지에서도 인터페이스를 사용할 수 있도록 해준다.
클래스 구성 멤버: 필드, 생성자, 메소드
인터페이스 구성 멤버: 상수, 메소드
인터페이스는 객체로 생성할 수 없어서 생성자도 가질 수 없다!
원래는 추상 메소드로만 선언 가능했으나 자바 8부터는 디폴트 메소드와 정적 메소드도 선언 가능!
인터페이스는 객체 사용 설명서! => 따라서 필드 선언이 불가하다.
하지만 상수 필드는 선언이 가능!
인터페이스에 고정된 값으로 런타임 시 데이터 변경 불가
상수 선언 시, 반드시 초기값을 대입해야 한다!
객체가 가지고 있는 메소드를 설명한 것
(호출 시 어떤 매개값이 필요하고, 리턴 타입이 무엇인지만 알려준다)
실제 실행부는 객체(구현 객체)가 가지고 있다.
인터페이스에 선언되지만 사실은 객체가 가지고 있는 인스턴스 메소드
사실 이게 뭔지 잘 모르겠음... 왜 이런 기능을...?
기존 인터페이를 확장해서 새로운 기능을 추가하기 위해 만들어졌다.
뒷장에 예시를 보며... 깨달아보도록 합시다. 일단 넘어가자!
디폴트 메소드와는 다르게 객체가 없어도 인터페이스만으로 호출이 가능!
Static이니까!
인터페이스에 선언된 필드는 모두 상수 필드이다. 때문에
public static final
키워드를 생략하더라도 자동적으로 상수 필드가 된다는 사실!!! (컴파일 과정에서 알아서 붙음)
대문자로 작성, 서로 다른 단어는 언더바로 연결하는 것이 관례
public interface RemoteControl {
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
}
인터페이스를 통해 호출된 메소드 → 최종적으로 객체에서 실행!
그렇기 때문에 인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언!
리턴 타입, 메소드명, 매개변수만 기술되고 중괄호{}를 붙이지 않는다
인터페이스에 선언된 추상 메소드는 모두 public abstract의 특성을 갖기 때문에 생략하더라도 자동적으로 붙는다.
public interface RemoteControl {
// 상수
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
// 메소드
public void turnOn();
public void turnOff();
public void setVolume(int volume);
}
자바 8부터 추가된 인터페이스의 새로운 멤버!
형태는 클래스의 인스턴스 메소드와 동일하지만
default
키워드가 리턴 타입 앞에 붙는다. (public 특성을 갖고 있기 때문에 생략해도 붙음)
public interface RemoteControl {
// 상수
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
// 메소드
public void turnOn();
public void turnOff();
public void setVolume(int volume);
// 디폴트 메소드
default void setMute(boolean mute) {
if(mute) {
System.out.println("무음 처리합니다.");
} else {
System.out.println("무음 해제합니다.");
}
}
인터페이스 내에서도 코드를 작성할 수 있게 해준다!
마찬가지로 자바 8에서 추가된 인터페이스의 새로운 멤버이다.
형태는 클래스의 정적 메소드와 완전 동일하다!
static
키워드를 붙여주면 됩니다.
정적 메소드 역시 public의 특성을 갖기 때문에 public을 생략해도 컴파일 과정에서 (생략)
public interface RemoteControl {
// 상수
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
// 메소드
public void turnOn();
public void turnOff();
public void setVolume(int volume);
// 디폴트 메소드
default void setMute(boolean mute) {
if(mute) {
System.out.println("무음 처리합니다.");
} else {
System.out.println("무음 해제합니다.");
}
// 정적 메소드
static void changeBattery() {
System.out.println("건전지를 교환합니다.")
}
}