Interface
는 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 바로 Interface
의 역할이자 개념이다.
Interface
는 interface
키워드를 통해 선언할 수 있으며 implements
키워드를 통해 일반 Class에서 Interface를 구현할 수 있다.
Interface
는 Java의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 사용한다.
JAVA8 이전까지는 Interface
에서 constant(상수), abstract method(추상 메소드)만 선언이 가능하지만,
상수, 추상메소드만 가능케했다는 것을 통해 그만큼 강제성이 강했다는 것을 유추할 수 있다.
JAVA8부터 default method, static method도 선언할 수 있게 추가되었다.
default method, static method를 통해, 구현 강제성 안에 유연함을 심었다.
Interface
에서 default
키워드로 method가 선언되면 해당 method가 구현될 수 있다.
또한 이를 구현하는 Class는 default method
를 그대로 사용할 수도, Overriding 할 수도 있다.
이를 통해 Interface가 변경이 되면, Interface를 구현하는 모든 Class들이 해당 method를 구현해야 하는 문제를 default method
를 통해 Interface에 method를 구현함으로써 해결 하였다.
또한 Interface
에 static method
를 선언함으로써, Interface를 이용하여 간단한 기능을 가지는 유틸리티성 Interface를 만들 수 있게 되었다.
interface에서도 메소드 구현이 가능하다.
참조 변수로 함수를 호출할 수 있다.
EX : gil.defaultmethod();
implements한 Class에서 재정의가 가능하다.
interface에서 메소드 구현이 가능하다.
반드시 클래스 명으로 메소드를 호출해야 한다.
EX : Gillog.staticmethod();
재정의가 불가능하다.
따라서 Java8 이후 부터는 Interface에서 아래와 같이 4가지 요소를 정의하거나 구현할 수 있다.
public interface GillogInterface {
// constant
// initialized 되야 한다.
// 자동으로 public static final이 붙는다.
int level = 1;
// abstract method
// abstract는 생략 가능하다.
// body를 통해 구현할 수 없다.
public abstract int develop(boolean choice);
// default method
// body를 통해 구현되야 한다.
// Overriding 가능.
default void gillog(Date date) {
System.out.println(date + " 날짜의 글 생성");
}
// static method
// body를 통해 구현되야 한다.
// 재정의 불가능.
static int levelup(int level) {
int levelup = level + 1;
return levelup;
}
}
이때 Interface에서 정의하거나 구현한 4가지 요소들의 의미는 아래와 같다.
constant(상수) : Interface에서 상수 값을 정해줄테니 함부로 바꾸지 말고 제공해주는 값만 참조해야 한다.
절대적
abstract method(추상 메소드) : 메소드에 대한 기본 가이드만 제공하니 추상 메소드를 Overriding해서 구현해야 한다.
강제적
default method(디폴트 메소드) : Interface에서 기본적으로 제공해주지만, custom해서 각자 구현해서 사용할 수도 있다.
선택적
static method(정적 메소드) : Interface에서 제공해주는 것으로 무조건 사용해야 한다.
절대적
Constant Interface
란 오직 Constant(상수)만 정의한 Interface이다.
Interface의 경우, 변수를 선언할 때 자동으로 public static final
이 붙는다.
상수처럼 어디에서나 접근할 수 있다.
하나의 Class에서 여러 개의 Interface를 Implement 할 수 있는데, Constant Interface
를 Implement 할 경우, Interface의 Class 명을 네임스페이스로 붙이지 않고 바로 사용할 수 있다.
아래와 같은 편리성 때문에 Constant Interface를 사용한다.
public interface GilLevelConstants {
double LEVEL = 1;
double GROWPOINT = 1.01;
}
public class GilLevelClassImpl implements GilLevelConstants {
public double growUp() {
return LEVEL * GROWPOINT;
}
}
Constant Interface를 써도 컴파일이 안 되는 것도 아니고 그렇게 잘못된 것 같지는 않아 보인다. 하지만 위키와 Effective Java (규칙19) 책을 보면 다음과 같은 이유로 Anti 패턴으로 간주한다.
public interface GilLevelConstants {
public static final int LEVEL = 1;
}
public class GilLevel implements GilLevelConstants {
public static final int LEVEL = 2;
public static void main(String args[]) throws Exception {
// 2가 출력.
System.out.println(LEVEL);
}
}
자바 공식 문서에서도 Constant Interface를 Anti 패턴으로 명시하였고 이 대체 방안으로 import static
구문 사용을 권장한다.
Constant Interface와 동일한 기능과 편리성을 제공한다.
아래는 간단한 예제이다.
public final class GilLevelFinalConstants {
// 인스턴스화 방지
private GilLevelFinalConstants() {
}
public static final double LEVEL = 1;
public static final double GROWPOINT = 1.01;
}
import static GilLevelFinalConstants.LEVEL;
import static GilLevelFinalConstants.GROWPOINT;
public class GillogLevelClass {
public double growUp() {
return LEVEL * GROWPOINT;
}
}
[JAVA] 자바 인터페이스란?(Interface)_이 글 하나로 박살내자[Limky 삽질블로그]
인터페이스의 default method[Programmers]
[JAVA] interface (default, static메소드)[dahye_e]
Constant Interface : 상수를 인터페이스에?
자바의 추상 클래스와 인터페이스 - 추상 클래스와 인터페이스의 차이[by강관우]
[JAVA] 추상클래스 VS 인터페이스 왜 사용할까? 차이점, 예제로 확인 [마이자몽 myJamong]