자바의 인터페이스

2022년 03월 12일

TOC

Interface

  • 인터페이스는 클래스나 프로그램이 제공하는 기능을 명시적으로 선언하여주는 클래스나 프로그램이 제공하는 명세이다.
  • 인터페이스를 사용하면 클라이언트 프로그램들은 인터페이스에 선언된 메서드 명세만을 보고 이를 구현한 클래스를 사용할 수 있어서 편리하다.
  • 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미이다. (하나의 클래스가 인터페이스를 implements 받은 것은 구현코드의 상속이 아니라서 타입상속을 받았다고 한다.)
  • 하나의 인터페이스로 선언된 명세를 이용하여 여러 다양한 객체를 구현하여 사용하는 것이 자바의 특성중 하나인 다형성이다.

Interface의 특징

  • 구현코드가 없는 추상 메서드로만 구성되어있다. (메서드를 선언하면 모든 메서드가 public abstract으로 컴파일된다.)
  • 구현 class는 interface의 모든 abstract method들을 overriding하거나 class를 abstract class로 만들어야한다.
  • 구현코드가 없어서 멤버변수를 가질 수 없고 모든 변수는 상수로 선언된다. (변수들은 public static final로 컴파일된다.)
  • 클래스 상속과 달리 구현 코드가 없으므로 하나의 클래스에 여러 인터페이스를 구현할 수 있다.
public interface 인터페이스_이름 {

    float pi = 3.14F; // public static final으로 컴파일된다.
    void makeSomething();
}

Java 8부터는 default method와 static method가 생겨 일부 구현 코드들도 존재한다.

  • default method

    • 해당 인터페이스를 구현하는 클래스들에서 기본적으로 공통으로 사용할 수 있는 메서드이다.
    • 구현 코드를 넣을 수 있다.
    • 구현 클래스에서 필요에 따라 재정의하여 사용할 수도 있다.
    • interface내에서 default method는 private method를 호출할 때 private method, private static method 둘 다 호출가능하다.
public interface Test {

    default void defaultMetnod() {
        privateMethod();  // private method
        privateStaticMethod();   // private static method
    }
}
  • static method

    • static method는 static변수와 같이 인스턴스를 생성하지 않아도 사용가능하다.
    • 구현 코드를 넣을 수 있다.
    • static method에서 private method를 호출할 때는 private static만 호출가능하다.

      public interface Test {

    static int total(int[] arr) { int total = 0; for (int num : arr) { total += num;

    } //privateMethod(); //private method라 오류발생 privateStaticMethod(); // private static method라 호출 가능 return total; } }

  • private method

    • 인터페이스 내부에서만 사용하기 위해 구현한 메서드로 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없다.
    • default method나 static method에서만 사용한다.

      public interface Test {

    private void privateMethod() { System.out.println("myMethod"); }

    private static void privateStaticMethod() { System.out.println("my Static Method"); } }

🧑🏻‍💻 예시 코드

public interface Calculator {

    double PI = 3.14;
    int ERROR = -999999;

    int add(int num1, int num2);
    int substract(int num1, int num2);
    int times(int num1, int num2);
    int divide(int num1, int num2);

    // default method는 위의 method와는 다르게 이 interface를 implement하는 클래스에서
    // 꼭 재정의를 하지 않아도 사용가능하다. (원하면 재정의도 가능)
    default void description() {
        System.out.println("정수의 사칙연산을 제공합니다.");
        myMethod();
        myStaticMethod();
        // default method에서는 private메서드를 기본, static둘 다 호출 가능하다.
    }

    // interface에서 static으로 생성한 method는 인스턴스 없이 사용 가능하다!!
    static int total(int[] arr) {
        int total = 0;
        for (int num: arr) {
            total += num;

        }
        //myMethod();
        myStaticMethod();
        // static method에서 private method를 호출할때는 private static만 호출가능하다.
        return total;
    }

    private void myMethod() {
        System.out.println("myMethod");
    }

    private static void myStaticMethod() {
        System.out.println("my Static Method");
    }
}

Interface의 형 변환

  • 인터페이스를 구현한 클래스는 아래와 같이 인터페이스 형으로 선언한 변수로 형 변환 할 수 있다.

    Calculator calculator = new CompleteCalculator();
    // Calc는 interface, CompleteCalc는 Calc를 구현한 class
  • 상속에서의 형 변환과 동일한 의미를 가지며 형 변환을 하는 경우 인터페이스에 선언된 메서드만을 사용가능하다. (클래스에서 새로 선언한 method는 사용불가하다.)

여러 인터페이스 구현 및 상속

  • 자바의 인터페이스는 구현 코드가 없어서 하나의 클래스가 여러 인터페이스를 구현할 수 있다. (인터페이스는 다중 상속이 가능하다는 의미)
  • default method가 중복되는 경우는 구현 class에서 해당 default method를 재정의해야한다.
  • default method의 재정의의 경우 super를 사용하여 interface의 method를 읽어와 재정의해도 되며 아예 새로 재정의하여도 된다.
  • 인터페이스 사이에도 상속을 할 수 있으며 이럴때는 extends를 사용한다.
  • 여러 interface를 구현한 클래스를 인터페이스 타입으로 형 변환 하는 경우, 형변환하는 인터페이스에 선언된 메서드만 사용가능하다.
Buy me a coffeeBuy me a coffee
Written by

@Seongwon

기술공유를 통해 새로운 가치 창조을 추구하는 백엔드 개발자 오성원입니다.
©SeongwonOh