기존 인터페이스와 자바8의 인터페이스에는 큰 차이가 있다.
default method 와 static method 의 허용이 대표적인데 라이브러리들을 크게 변화시킨 default method에 대해 알아보자.
기존의 인터페이스
인터페이스
public interface OldInterface {
void printHi();
void printHello();
}
구현체
public class OldClass implements OldInterface{
@Override
public void printHi() {
System.out.println("Hi");
}
@Override
public void printHello() {
System.out.println("Hello");
}
}
인터페이스의 구현체들은 해당 인터페이스의 메서드를 모두 @Override 해야하였다.
따라서 인터페이스를 확장하게 된다면 해당 구현체들이 전부 깨지는 현상이 발생하게 된다.
그렇다면 과거의 라이브러리들은 어떻게 구현되었을까?
과거의 라이브러리
인터페이스
public interface OldInterface {
void printHi();
void printHello();
}
추상 클래스가 인터페이스를 받음
public abstract class OldLibrary implements OldInterface {
@Override
public void printHi() {
}
@Override
public void printHello() {
}
}
추상 클래스를 상속받아서 사용
public class OldClass extends OldLibrary{
@Override
public void printHello() {
System.out.println("Hello");
}
}
추상 클래스로 인터페이스를 받고 구현체는 해당 추상 클래스를 상속받아서 사용한다.
이러한 방법으로 인터페이스의 '모든' 메서드를 전부 @Override 하지 않아도 사용이 가능해졌다.
하지만 어디까지나 추상 클래스를 상속받았기 때문에 '추가로' 추상 클래스를 상속받을 수 없게 되었다.
실제로 과거 스프링이 이러한 방식으로 구현되었다.
Java 8 인터페이스
Java 8 인터페이스는 이러한 문제점을 default method 를 제공함으로써 해결하였다.
default method 로 인터페이스에 구현체도 제공할 수 있게 되었다
인터페이스에 default method 를 사용하여 구현체에서 편리하게 default method 를 구현하지 않을수도, 구현없이 사용할수도 있게 되었다.
기존에는 인터페이스 확장 시 해당 인터페이스를 구현한 클래스가 깨지지만 Java 8 의 인터페이스는 default method 로 구현체를 살리면서 기능을 확장 가능하다.
그리고 Object 가 제공하는 기능(equals, hashCode) 는 default 메서드로 제공불가능하다.
본인이 수정 가능한 인터페이스에만 default method 제공 가능하다.
해당 인터페이스를 상속받는 인터페이스에서 다시 추상메서드로 변경가능하며 구현체에서 재정의 또한 가능하다.
Java 8 인터페이스
public interface NewInterface {
default void printHi() {
System.out.println("Hi");
}
default void printHello() {
System.out.println("Hello");
}
}
하지만 해당 구현체가 직접 default 메서드를 구현하지 않고 사용가능하기 때문에 잘못된 방법으로 사용 가능하다.
파라미터 타입이 안맞는다던지 하는 방법 등등..
그래서 보통 라이브러리들을 보면 주석으로 다 설명을 해야한다.
public interface NewInterface {
/**
* 설명설명설명
*/
default void printHello() {
System.out.println("Hello");
}
/**
* 설명설명설명
*/
default void printNumber(String number) {
System.out.println(number);
}
}
'Java > Java 8' 카테고리의 다른 글
Stream (0) | 2024.07.29 |
---|---|
Optional 의 등장 배경과 주의 사항 (0) | 2024.07.24 |
함수형 프로그래밍 (0) | 2024.07.18 |
기존 인터페이스와 자바8의 인터페이스에는 큰 차이가 있다.
default method 와 static method 의 허용이 대표적인데 라이브러리들을 크게 변화시킨 default method에 대해 알아보자.
기존의 인터페이스
인터페이스
public interface OldInterface {
void printHi();
void printHello();
}
구현체
public class OldClass implements OldInterface{
@Override
public void printHi() {
System.out.println("Hi");
}
@Override
public void printHello() {
System.out.println("Hello");
}
}
인터페이스의 구현체들은 해당 인터페이스의 메서드를 모두 @Override 해야하였다.
따라서 인터페이스를 확장하게 된다면 해당 구현체들이 전부 깨지는 현상이 발생하게 된다.
그렇다면 과거의 라이브러리들은 어떻게 구현되었을까?
과거의 라이브러리
인터페이스
public interface OldInterface {
void printHi();
void printHello();
}
추상 클래스가 인터페이스를 받음
public abstract class OldLibrary implements OldInterface {
@Override
public void printHi() {
}
@Override
public void printHello() {
}
}
추상 클래스를 상속받아서 사용
public class OldClass extends OldLibrary{
@Override
public void printHello() {
System.out.println("Hello");
}
}
추상 클래스로 인터페이스를 받고 구현체는 해당 추상 클래스를 상속받아서 사용한다.
이러한 방법으로 인터페이스의 '모든' 메서드를 전부 @Override 하지 않아도 사용이 가능해졌다.
하지만 어디까지나 추상 클래스를 상속받았기 때문에 '추가로' 추상 클래스를 상속받을 수 없게 되었다.
실제로 과거 스프링이 이러한 방식으로 구현되었다.
Java 8 인터페이스
Java 8 인터페이스는 이러한 문제점을 default method 를 제공함으로써 해결하였다.
default method 로 인터페이스에 구현체도 제공할 수 있게 되었다
인터페이스에 default method 를 사용하여 구현체에서 편리하게 default method 를 구현하지 않을수도, 구현없이 사용할수도 있게 되었다.
기존에는 인터페이스 확장 시 해당 인터페이스를 구현한 클래스가 깨지지만 Java 8 의 인터페이스는 default method 로 구현체를 살리면서 기능을 확장 가능하다.
그리고 Object 가 제공하는 기능(equals, hashCode) 는 default 메서드로 제공불가능하다.
본인이 수정 가능한 인터페이스에만 default method 제공 가능하다.
해당 인터페이스를 상속받는 인터페이스에서 다시 추상메서드로 변경가능하며 구현체에서 재정의 또한 가능하다.
Java 8 인터페이스
public interface NewInterface {
default void printHi() {
System.out.println("Hi");
}
default void printHello() {
System.out.println("Hello");
}
}
하지만 해당 구현체가 직접 default 메서드를 구현하지 않고 사용가능하기 때문에 잘못된 방법으로 사용 가능하다.
파라미터 타입이 안맞는다던지 하는 방법 등등..
그래서 보통 라이브러리들을 보면 주석으로 다 설명을 해야한다.
public interface NewInterface {
/**
* 설명설명설명
*/
default void printHello() {
System.out.println("Hello");
}
/**
* 설명설명설명
*/
default void printNumber(String number) {
System.out.println(number);
}
}
'Java > Java 8' 카테고리의 다른 글
Stream (0) | 2024.07.29 |
---|---|
Optional 의 등장 배경과 주의 사항 (0) | 2024.07.24 |
함수형 프로그래밍 (0) | 2024.07.18 |