public
만 가능하다.public static final
과 public abstract
는 생략할 수 있다.Comparable
, Serializble
확장에는 열려있고 변경에는 닫혀있다.
객체지향 프로그래밍의 원칙 중 하나.
어떤 인터페이스 InterfaceA
를 클래스 ClassA
, ClassB
, ClassC
, ClassD
, ClassE
가 구현하고 있다고 하자.
InterfaceA
에서 methodA
가 필수적으로 존재해야 하는 경우, methodA
를 사용하지 않는 ClassB
, ClassC
, ClassD
도 methodA
를 구현해야 한다.
이런 경우 OCP를 위반했다고 볼 수 있다. 오히려 확장에 닫혀 있고 변경에 열려 있는 것이다.
InterfaceA
에서 methodA
를 default method로 선언한다면 methodA
를 사용하는 ClassA
에서만 methodA
를 그냥 사용하거나 override할 수 있게 되고, 이는 확장에 해당한다.
public interface InterfaceA {
void abstractMethodA();
void abstractMethodB();
//...
default int defaultMethodA() {
//Implemetation
}
}
마음에 안 들면 구현 객체에서 override해서 쓰면 된다.
ClassA
가 InterfaceA
와 InterfaceB
의 구현 클래스다InterfaceA
에는 default void methodA()
가 선언 및 정의되어 있다.InterfaceB
에는 void methodA()
가 선언되어 있다.이런 충돌이 발생할 경우 methodA()
에 대한 override가 강제된다.
그렇긴 한데... 그렇게 됐습니다....
public interface InterfaceA {
void abstractMethodA();
void abstractMethodB();
//...
static int static MethodA() {
//Implemetation
}
}
stdio.h
를 include하고 printf()
를 호출하면 stdio.c
에 정의된 내용이 실행된다.stdio.c
내용이 변경되어도 printf()
를 사용하는 데에는 별 문제가 없다.