객체의 추상화.
구현체는 없지만 객체를 정의한다.
클래스간 결합도를 낮출수있다. 구현체가 아닌 인터페이스를 사용하면 클래스의 내부 사항을 자세히 알지 못해도 되기 때문이다.
표준화가 가능하다. 인터페이스를 보면 어떤 역할을 하는지 알 수 있기 때문이다.
다형성을 통해 유지보수를 쉽게 만든다. 인터페이스의 레퍼런스를 통해 사용하면 클래스를 변경하거나 수정하기 쉽기 때문이다.
interface
예약어를 이용해서 작성한다.
변수는 선언할 수 없다. public static final
이 기본 값이며 생략해도 가능하다.
public abstract
(추상 메소드)가 기본값이며 생략 가능하다.
interface MyInterface{
int MY_NUMBER = 777;//public static final이 생략되어있음
void myMethod();//public abstract가 생략되어있음
}
implemants
키워드를 통해서 구현한다.
인터페이스에 정의된 상수, 메소드를 사용할 수 있다.
추상클래스를 오버라이드 해야한다.
인터페이스를 상속받은 객체가 있다면 인터페이스 레퍼런스를 통해 구현체를 사용할 수 있다.
interface MyInterface{
void hello();
}
class MyClass implements MyInterface{
@Override
void hello(){
System.out.println("Im class");
}
}
class MyAnotherClass implements MyInterface{
@Override
void hello(){
System.out.println("Im anthoer class");
}
}
이런 클래스가 있는 경우
MyInterface myInstance = new MyClass();
MyInterface myAnotherInstance = new MyAnotherClass();
myInstance.hello();// Im class 출력
myAnotherInstance .hello();//Im another class 출력
인터페이스 레퍼런스로 각 구현체에 접근이 가능하다.
인터페이스는 다른 인터페이스를 상속 받을수 있다.
인터페이스간의 상속은 extends
키워드를 사용하며 클래스와 다르게 여러 인터페이스를 extends
할 수 있다.
클래스는 인터페이스를 상속 받을수 있다.
클래스는 implements
키워드를 사용하여 인터페이스를 상속받고 여러개의 인터페이스를 implements
할 수 있다.
interface Pen(){
void Draw();
}
interface Eraser(){
void Erase();
}
interface PencilCase extends Pen, Eraser{
}
class MyPencilCase implements PencilCase{
@Override
public void draw() {
}
@Override
public void Erase() {
}
}
Java 8 부터 도입되었다. 인터페이스에 기본 구현을 가진 메소드를 정의할 수 있다.
@Override
를 통해 재정의 할 수 있다. 하지 않는 경우 인터페이스의 구현을 사용하게 된다.
기본 메소드가 생겨서 인터페이스에 새로운 기능을 추가 할 때 마다 상속받은 모든 클래스에서 새로운 기능을 구현하지 않아도 된다.
interface Game{
public default void play(){
System.out.println("play game");
}
}
class StarCraft implements Game{
}
StarCraft star = new StarCraft();
star.play();//play game 출력
하지만 다른 인터페이스에서 같은 메소드 시그니처가 정의되어있다면 필수로 구현 해줘야한다.
interface Shirt{
public default void wear(){
System.out.println("wear shirt");
}
}
interface Glasses{
public default void wear(){
System.out.println("wear glasses");
}
}
class Mannequin implements Shirt, Glasses{
@Override
public void wear(){
//구현 해줘야한다.
}
}
Java 8 부터 도입되었다. 인터페이스에서 함수를 구현할 수 있지만 상속이 불가능하다.
Java 9 부터 도입되었다. 인터페이스에서 함수를 구현할 수 있지만 상속이 불가능하다.
static 메소드와 달리 외부에서 메소드를 호출할 수 없다.