자바8 - 인터페이스의 기본 메소드와 스태틱 메소드

728x90

public interface Human{
	void hName();
    	void hAge();
}

hName()과 hAge()라는 추상메소드를 두개를 가지고 있는 Human 인터페이스가 있습니다.

 

public class TestHuman implements Human {
    @Override
    public void hName(){
    	System.out.println("Kim");
    };
}

 

그 interface를 상속하는 class TestHuman이 있습니다.

여기서 이 class는 에러가 납니다. 그 이유는 추상메소드 두개를 모두 override 하지 않았기 때문입니다.

 

여기서 override를 하지않아도 에러가 나지않으며 interface를 상속받은 클래스들이 모두 기본적으로 사용할 수 있도록 하는 것을 기본 메소드 라고합니다.

 

기본 메소드는 interface에서 만듭니다.

public interface Human{
	void hName();
    	default void hAge(){
        	System.out.println("34");
        }
}

기본 메소드로 만들고 싶은 메소드 앞에 default를 추가해줍니다. 그리고 여기서 메소드의 기능을 만들어줍니다.

 

public class TestHuman implements Human {
    @Override
    public void hName(){
    	System.out.println("Kim");
    };
}

이 클래스에서의 오류가 사라집니다. 

public class TestHuman implements Human {
    @Override
    public void hName(){
    	System.out.println("Kim");
    };
    @Override
    public void hAge(){
    	System.out.println("22");
    };
}

물론 재정의도 가능합니다.

public class Main{
	public static void main(String[] args){
			Human human = new TestHuman();
			human.hAge();
	}
}
//실행 결과
34

 

 

기본 메소드이기 때문에 바로 사용이 가능합니다.

 

public interface Human{
	void hName();
    	default void hAge(){
        	System.out.println(Integer.toString(getAge()));
        }
    int getAge();
}

인테페이스 기본 메소드에는 생성자를 이용할 수도 있고, 메소드를 사용할 수도 있습니다.

 

 

 

스태틱 메소드도 있습니다. 

public interface Human{
	void hName();
    	default void hAge(){
        	System.out.println(Integer.toString(getAge()));
        }
    int getAge();
    
    static void hState(){
    	System.out.println("휴식중");
    }
}
public class Main{
	public static void main(String[] args){
			Human human = new TestHuman();
			Human.hState();
	}
}
//실행 결과
휴식중

일반 메소드와 다르게 interface의 타입을 가지고 호출해서 사용이 가능합니다.

728x90