인터페이스를 정의하는 방법
일반적인 인터페이스 특징
- 상태가 없음
- 동작 구현 없음
- 동작 시그니쳐만 있음
개체 생성은 불가능하다.
package 범위 interface도 메서드는 public 이다.
(public) interface 인터페이스명
인터페이스는 public (생략가능)
누구라도 따라 명령할 수 있어야하기 때문에
(인터페이스에서 이름으로 ~able을 붙이기도 한다)
다중 상속은 상태와 메서드가 중복 될 위험이 있지만 인터페이스는 실체가 없기때문에
중복 될 수 있다. 중복될 시 추상화 메서드 하나만 구현하면 된다.
public interface Phone {
void power();
}
public interface Computer {
void power();
}
public class SmartPhone implements Computer, Phone{
@Override
public void power() {
System.out.println("smartphone power");
}
}
인터페이스 구현하는 방법
클래스 선언부에 implements 키워드를 추가하고 인터페이스명 명시
public class 구현클래스명 implements 인터페이스명 {
인터페이스에 명시되어 있는 추상메서드들을 모두 구현
}
인터페이스는 규약이기때문에 구현해야하는 추상화 메서드는 모두 구현해야한다.
인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
interface reference를 이용하여 구현체를 사용할 수 있는데,
해당 객체는 참조하고 있는 인터페이스를 구현해야한다.
public class DiscountTicket implements Ticket{
}
public class NormalTicket implements Ticket{
}
public static void main(String[] args) {
Ticket ticket = new DiscountTicket();
}
인터페이스 상속
인터페이스도 상속이 가능하다.
구현시 상속받은 추상메서드를 모두 구현해야한다.
public interface GrandParent {
void grandParent();
}
public interface Parent extends GrandParent{
void parent();
}
public interface Child extends Parent{
void child();
}
public class Family implements Child{
@Override
public void child() {}
@Override
public void parent() {}
@Override
public void grandParent() {}
}
기본 메소드 (Default Method), 자바 8
public interface Bird {
void speak();
default void fly() {
System.out.println("fly");
}
}
가령 새라는 인터페이스를 만들고 fly라는 default method를 생성하면
구현체에서 fly를 구현하지 않더라도 사용할 수 있다.
public class Pigeon implements Bird{
@Override
public void speak() {
System.out.println("gugugu");
}
}
public static void main( String[] args) {
Bird bird = new Pigeon();
bird.fly(); // fly
bird.speak(); // gugugu
}
default method를 override 가능하다.
public class Duck implements Bird{
@Override
public void speak() {
System.out.println("Quack");
}
@Override
public void fly() {
System.out.println("오리날다");
}
}
인터페이스를 다중 구현하는 경우에 default method가 중복되는경우에는 에러가 발생한다.
인터페이스의 static 메소드, 자바 8
public interface Bird {
void speak();
static void fly() {
System.out.println("fly");
}
}
interface에서 static 메소드를 정의하여 사용할 수 있다.
public class Eagle implements Bird{
@Override
public void speak() {
System.out.println("eagle eagle");
}
}
public class App {
public static void main(String[] args) {
Eagle eagle = new Eagle();
eagle.speak(); //eagle eagle
Bird.fly(); //fly
}
}
static method를 사용하기 위해서는 인터페이스명으로 static method를 호출한다.
static method는 overrider 할 수 없음.
인터페이스의 private 메소드, 자바 9
자바 9부터 interface내 private method를 사용할 수있다.
인터페이스에서 다른 메소드를 호출 할 수 있다.
구현 클래스에서 private method를 상속할 수 없다.
public interface CustomCalculator {
default int addEvenNumbers(int... nums) {
return add(n -> n % 2 == 0, nums);
}
default int addOddNumbers(int... nums) {
return add(n -> n % 2 != 0, nums);
}
private int add(IntPredicate predicate, int... nums) {
return IntStream.of(nums)
.filter(predicate)
.sum();
}
}
public class App implements CustomCalculator {
public static void main(String[] args) {
CustomCalculator calculator = new App();
System.out.println(calculator.addOddNumbers(1,2,3,4)); // 6
System.out.println(calculator.addEvenNumbers(1,2,3,4)); // 4
}
}