본문 바로가기

Programming/Java

[기본-8] 인터페이스

목차

  • 인터페이스 정의하는 방법
  • 인터페이스 구현하는 방법
  • 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
  • 인터페이스 상속
  • 인터페이스의 기본 메소드 (Default Method), 자바 8
  • 인터페이스의 static 메소드, 자바 8
  • 인터페이스의 private 메소드, 자바 9

1. 인터페이스 정의하는 방법

public interface 인터페이스명 {

    자료형 상수명 = 값; // 인터페이스에서 변수는 기본적으로 상수이다. (public static final 생략 가능)

    반환형 메소드명(); // 인터페이스의 abstract 메소드는 기본적으로 public 접근지시자를 갖는다.(public abstract 키워드 생략 가능)

    // 자바 8부터 추가된 default 메소드는 인터페이스에서 구현할 수 있다. 자세한 내용은 하단에서 설명하겠습니다.
    default 반환형 메소드명() {
    
    }

    // 자바 8부터 추가된 static 메소드는 인터페이스에서 구현할 수 있다.
    static 반환형 메소드명() {
        
    }

}

 

인터페이스를 정의하는 방법은 상기와 같다. 인터페이스는 기본적으로 상수 필드와 추상메소드를 가질 수 있다.

일반 인스턴스 변수는 가질 수 없다. 즉 public static final로 시작해야하며, 해당 키워드는 인터페이스에서 너무나 당연한 것이므로 생략이 가능하다. 또한 인터페이스에서는 구현된 메소드를 가질 수 없다.(단, 자바 8 부터 default 메소드가 추가되어 default 키워드를 추가하면 가능하다.)

 

public interface Bear {

    int LEG = 4; // 인터페이스에서 변수는 기본적으로 상수이다. (public static final 생략 가능)

    void print(); // 인터페이스의 abstract 메소드는 기본적으로 public 접근지시자를 갖는다.(public abstract 키워드 생략 가능)


}

 

 

 

2. 인터페이스 구현하는 방법

인터페이스를 클래스에서 구현하는 방법은 다음과 같다.

 

public class Panda implements Bear {

    private String name;

    public Panda() {}

    public Panda(String name) {
        this.name = name;
    }

    // 추상메소드의 구현
    @Override
    public void print() {
        System.out.println(name);
    }

    // 해당 메소드 정보는 클래스에만 존재하므로 Bear 인터페이스를 통하여 Panda 구현체를 사용할 때 해당 메소드를 접근할 수 없다.
    public String getName() {
        return name;
    }

    // 해당 메소드 정보는 클래스에만 존재하므로 Bear 인터페이스를 통하여 Panda 구현체를 사용할 때 해당 메소드를 접근할 수 없다.
    public void setName(String name) {
        this.name = name;
    }
}

 

 

3. 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

 

본격적으로 구현체를 사용해보자. 인터페이스에 선언 및 정의된 메소드에 대해서는 구현체에서 사용이 가능하다. 하지만, 클래스만 가지고 있는 메소드의 경우는 인터페이스 타입의 변수에서 사용이 불가능하다.

 

public class Main {

    public static void main(String[] args) {

        Bear bear = new Panda("팬더");
        System.out.println(Bear.LEG); // 4
        bear.print(); // 팬더 출력
        //bear.getName(); // 인터페이스에는 getName() 이라는 메소드 정보가 없으므로 사용 불가

    }
}

 

 

 

4. 인터페이스 상속

인터페이스도 상속이 가능하다. 인터페이스에서 인터페이스를 상속할 때는 extends 키워드를 사용한다.

public interface 인터페이스명 extends 상위인터페이스명 [... 복수 가능] {

    // 구현할 상수 및 메소드 정의

}

 

간단한 샘플은 다음과 같다.

public interface WeBear extends Bear {

    void walk(); // 위베어베어스는 직립보행이 가능하다.

}

 

 

5. 인터페이스의 기본 메소드 (Default Method), 자바 8

자바 8부터 default 메소드가 추가되었다. 기존에 자바에서는 다중 상속을 허용하지 않았는데, 하위 호환성을 유지하면서 다중 상속과 비슷한 효과를 내기 위해서 인터페이스에 이미 구현된 기본 메소드를 추가할 수 있게끔 자바 8부터 가능해졌다.

 

public interface Bear {

    default void print() {
        System.out.println("자바 8부터 default 키워드 사용시 인터페이스에서 메소드 구현이 가능하다.");
    }

}

 

 

 

6. 인터페이스의 static 메소드, 자바 8

자바 8부터 추가된 메소드로 인터페이스에서 정적으로 구현된 메소드를 참조하여 사용할 수 있다.

 

public interface Bear {

    static void print() {
        System.out.println("자바 8부터 static 메소드 구현이 가능하다.");
    }

}
public class Main {

    public static void main(String[] args) {
        
        Bear.print(); // static 메소드 호출
    }
}

 

7. 인터페이스의 private 메소드, 자바 9

자바 9부터 추가된 메소드로 default 메소드에서 중복되는 기능을 모아서 공통적으로 처리할 때 주로 사용한다.

구현하는 클래스에서는 private 메소드에 직접적으로 접근할 수 없다.(당연히 접근지시자가 private이므로 불가하다.)

 

public interface Bear {

    // 특정 프로세스를 시작하기전에 전처리 과정이 필요하다고 가정한다.
    default void preProcess() {
        log();
        // 이하 생략
    }

    // 특정 프로세스를 시작하기전에 후처리 과정이 필요하다고 가정한다.
    default void postProcess() {
        log();
        // 이하 생략
    }

    // 전처리, 후처리가 진행될 때 공통적으로 호출해야하는 메소드가 있다고 가정한다.
    private void log() {
        System.out.println("프로세스 수행전 호출");
    }
}

 

 

 

 

'Programming > Java' 카테고리의 다른 글

[기본-6] 상속  (0) 2021.03.03
[기본-5] 클래스  (0) 2021.03.03
[기본-4] 제어문  (0) 2021.03.02
[기본-3]자바 연산자  (0) 2021.03.01
[기본-2]자바 데이터 타입, 변수 그리고 배열  (0) 2021.02.28