개발/Java

Java] Do it 자바 프로그래밍 입문 요약 (둘째마당 - 10)

펭귀니 :) 2019. 6. 18. 13:33

목차

    10) 인터페이스란?

    인터페이스란?

    구현 코드가 없는 인터페이스! 인터페이스는 추상 메서드와 상수로만 이루어져 있다. 때문에 인스턴스를 생성할 수도 없다.

    public interface Calc {
    	double PI = 3.14;
    	int ERROR = -99999999;
    
    	int add(int num1, int num2);
        int substract(int num1, int num2);
        int times(int num1, int num2);
    	int divide(int num1, int num2);
    }

    위 예제 코드에서 변수는 상수로 자동 변환되고, 선언한 메서드는 추상 메서드로 변환된다.

     

    클래스에서 인터페이스 구현하기

    인터페이스를 클래스가 사용하는 것을 implements예약어로 사용한다.

    ex) public class Calculator implements Calc 

    이 때, Calculator클래스는 추상 메서드 4개를 구현하거나, 추상 클래스로 만들어야 한다.

     

    인터페이스의 역할

    인터페이스를 구현한 클래스가 어떤 기능의 메서드를 제공하는지 명시하는 것.

    인터페이스를 사용하면 다형성을 구현하여 확장성 있는 프로그램을 만들 수 있습니다.

     

    인터페이스 디폴트 메서드와 정적 메서드

    자바 8부터는 디폴트 메서드와 정적 메서드 기능을 제공

    디폴트 메서드 : 인터페이스에서 구현 코드까지 작성한 메서드 (여러 클래스에서 사용할 메서드가 기능이 같을 경우 활용)

    public interface Calc{
    	....
    	default void description() {
       	 ...
        }
    }

    디폴트 메서드를 선언할 땐 default 예약어를 사용. 최종 하위 클래스에서 재정의(Override)도 가능

    정적 메서드 : 인스턴스 생성과 상관없이 사용할 수 있는 메서드

    public interface Calc{
    	...
        
        static int total(int[] arr){
        	...
        }
    }

    정적 메서드는 static 예약어를 사용. 사용시에는 인터페이스 이름으로 직접 참조하며 사용.

     

    private 메서드

    자바 9부터 인터페이스에 private 메서드를 구현할 수 있다. private 메서드는 인터페이스를 구현한 클래스에서 사용하거나 재정의할 수 없다. private 메서드는 코드를 구현해야하므로 추상 메서드에 private 예약어를 사용할 수는 없지만, static예약어는 함께 사용할 수 있다.

     

    한 클래스가 여러 인터페이스를 구현하는 경우

    public class Customer implements Buy, Sell {

    다만 Buy와 Sell의 두 인터페이스에 이름이 같은 디폴트 메서드가 있으면 문제가 됨. 구현하는 클래스에서 다시 재정의 해줘야 한다. 그리고 가상 메서드 원리에 의해 재정의한 메서드가 호출된다.

     

    인터페이스 상속하기

    인터페이스 간에도 상속이 가능. 인터페이스 간 상속은 구현 코드를 통해 기능을 상속하는 것이 아니므로 형 상속이라고 부른다. 

    public interface MyInterface extends X, Y {

    상속할 때 extends 예약어를 그대로 사용한다. 

    public class MyClass implements MyInterface {

    위의 MyClass는 MyInterface안의 추상 클래스와 더불어 X, Y의 추상 클래스까지 구현해야 한다.