백기선 님의 <>를 보고 공부한 내용을 기록합니다.
java8부터 발생한 인터페이스의 변화 덕분에 자바 라이브러리도 많은 변화가 있었다.
public interface Foo {
String getName();
default String getUpperCaseName() {
return getName().toUpperCase(Locale.ROOT);
}
}
//DefaultFoo 에서 getUpperCaseName() 구현하지 않아도 기본으로 제공된다.
public class DefaultFoo implements Foo {
private String name;
private DefaultFoo() {
}
public DefaultFoo(String name) {
this.name = name;
}
@Override
public String getName() {
return this.name;
}
}
/**
* @implSpec
* getName() 을 호출하여 대문자로 바꿔주는 기능을 한다.
* */
default String getUpperCaseName() {
return getName().toUpperCase(Locale.ROOT);
}
public interface Foo {
String getName();
String greeting();
}
public interface Boo extends Foo {
@Override
default String greeting() {
return "hello from Boo!";
}
}
public class DefaultBoo implements Boo {
private String name;
private DefaultBoo() {
}
public DefaultBoo(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
}
@Test
void 인터페이스를_상속받은_인터페이스에서_다시추상메소드로_변경가능() {
DefaultBoo defaultBoo = new DefaultBoo("kildong");
assertThat(defaultBoo.greeting()).isEqualTo("hello from Boo!");
}
public class DefaultBoo implements Boo {
private String name;
private DefaultBoo() {
}
public DefaultBoo(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public String getUpperCaseName() {
return getName().toUpperCase(Locale.ROOT) + "!!";
}
}
@Test
void 인터페이스_구현체가_재정의할수도있다() {
DefaultBoo defaultBoo = new DefaultBoo("kildong");
assertThat(defaultBoo.getUpperCaseName()).isEqualTo("KILDONG!!");
}
public interface Foo {
...
static String koreanGreeting() {
return "안녕하세요!";
}
}
@Test
void 스태틱메소드를_제공할수있다() {
assertThat(Foo.koreanGreeting()).isEqualTo("안녕하세요!");
}