인터페이스는 추상클래스의 일종으로 인터페이스를 상속받기 위해서는 extends가 아닌 implements를 써야한다.
추상클래스와 다른점으로
인터페이스의 모든 메서드는 public abstract이다.
즉, 모든 메서드는 추상메서드다.
(예외적으로 내부에서만 사용할 수 있도록 private를 붙이면 추상메서드가 아니어도 작성 가능하다)
인터페이스의 모든 필드는 public static final이다.
인터페이스는 다중 상속이 가능하다.
모든 메서드가 추상메서드이기 때문에 public abstract를 생략할 수 있다.
만약 인터페이스의 추상메서드가 하나만 있다면 람다식으로 객체를 생성할 수 있다
(이때, 추상메서드를 하나만 가지는 인터페이스를
함수형 인터페이스(FunctionalInterface)라고 한다)
(매개변수) -> { 함수 내용 }
람다식은 익명클래스에 비해 문법이 간결하기 때문에 자주 사용한다!
interface USB { // 인터페이스 USB
/*public abstract*/ void onConnect();
// 추상메서드로 앞에 public abstract생략 가능
}
class PC {
void connect(USB ob) { // 원래 자료형이 무엇이든 PC에 연결되면
ob.onConnect(); // 장치 내부에 연결 후 작동 수행
}
}
public class Ex07 {
public static void main(String[] args) {
PC pc = new PC();
// 1) 람다식 표현으로 객체생성
// USB mouse = () -> System.out.println("마우스 연결됨");
// 2) 익명클래스로 객체생성
USB mouse = new USB() {
@Override
public void onConnect() {
System.out.println("마우스 연결됨");
}
};
pc.connect(mouse);
// 1), 2) 모두 같은 결과를 출력한다.
}
맨 아래쪽을 보면 주석처리되어 있기는 하지만 람다식표현의 코드가 있다.
바로 아래에는 익명클래스로 만든 객체가 똑같이 있는데 코드길이가 람다식보다 길어서 람다식 표현을 더 많이 사용한다.
인터페이스의 추상메서드가 1개라서 사용이 가능했으며,
매개변수는 있지 않아 ( )안이 비어있고, 함수내용이 출력문 1줄로 끝나기 때문에 중괄호 { }도 생략되었다.