본문 바로가기
JAVA

인터페이스

by e-pd 2021. 1. 3.

https://github.com/whiteship/live-study/issues/8


인터페이스를 정의하는 방법

 

일반적인 인터페이스 특징

  • 상태가 없음
  • 동작 구현 없음
  • 동작 시그니쳐만 있음

개체 생성은 불가능하다.

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
    }
    
}

'JAVA' 카테고리의 다른 글

멀티쓰레드 프로그래밍  (0) 2021.01.16
예외처리  (0) 2021.01.10
패키지  (0) 2020.12.28
상속  (0) 2020.12.21
클래스  (0) 2020.12.15