본 게시물은 스스로의 공부를 위한 글입니다.
틀린 내용이 있을 수 있습니다.
public interface Foo{
void printName();
default void printNameUpper(){
System.out.println(getName().toUpperCase());
}
String getName();
}
class MyClass implements Foo{
}
public class Main {
public static void main(String[] args) {
MyClass my=new MyClass();
my.printNameUpper("hiE"); //구현하지 않아도 사용이 가능하다.
}
}
Q) 왜 기본 메소드 기능이 필요할까?
A) 인터페이스에 기능을 추가하면, 모든 구현체에서 오버라이딩해야 하는 문제 발생. 즉, 해당 인터페이스를 구현한 클래스를 깨트리지 않고 새 기능을 추가할 수 있다.
@implSpec
자바독 태그 사용)/**
* @implSpec
* 이 구현체는 문자열을 대문자로 바꿔 출력해준다.
*/
default void printNameUpper(){
System.out.println(getName().toUpperCase());
}
public interface Foo{
default void printNameUpper(String name){
System.out.println(name.toUpperCase());
}
}
public interface Bar extends Foo{
void printNameUpper(String name); //다시 추상 메소드로 변경 가능.
}
public class MyClass implements Foo{
@Override
public void printNameUpper(String name){
System.out.println(name.toLowerCase()); //재정의 가능
}
}
//Foo, Bar 둘다 default void printNameUpper()이 선언되어 있는 경우
//두 인터페이스 중 누구것을 사용해야하는지 모르기 때문에 오류가 발생한다.
public class Default implements Foo, Bar{..}
인터페이스이름.메소드이름()
public interface Foo{
static void printAnything(){
System.out.println("Foo");
}
}
public class App{
public static void main(String[] args){
Foo.printAnything(); //인터페이스를 바로 사용 가능
}
}
자바9에서 추가된 기능이다.
인터페이스 내부 메소드를 외부에서 접근하지 않게 하고 싶을 수 있다.
예를 들면 default 메소드 내에서 사용되는 메소드에는 외부에서 접근하지 못하게 할 수 있다.
public interface Boo {
//interface 내부 메소드
//외부에선 사용, 오버라이딩 등의 접근 자체가 불가능.
private String printHello(){
return "Hello";
}
default void Hello(){
System.out.println(printHello()+" user!");
}
}