인터페이스 이해하기
인터페이스란?
아주 간단히 설명한다면 추상 메서드의 집합입니다. 추상 클래스와의 차이점은 인터페이스는 선언 시 class가 아닌 interface를 사용하고 상속 시 extends가 아닌 implements를 사용하며 하나만 상속할 수 있는 것이 아닌 여러 개를 상속할 수 있습니다. 또한 추상 클래스와 마찬가지로 인터페이스는 인스턴스화 할 수 없습니다.
public interface TestInterface{
int PI = 3.14; // final을 사용하지 않았지만 상수가 됩니다.
}
작성방법은 위와 같이 작성을 하며 interface 내에 선언되는 상수는 전부 정수로 선언됩니다. final을 붙이지 않아도 컴파일 시 자동으로 상수로 변합니다.
인터페이스 구현하기
추상 클래스는 extends를 사용하여 상속 후 구현을 하지만 interface는 implements를 이용하여 상속을 하여 구현합니다.
public interface Move{
void walk();
void run();
void jump();
}
위에 Move라는 인터페이스를 만들었습니다. 기본적으로 걷고 달리고 뛰는 메서드를 추상 메서드로 만들어 두었고 이제 implements를 통하여 구현하도록 하겠습니다.
public class Ninja implements Move{
public void walk(){
System.out.println("3의 속도로 걷습니다.");
}
public void run(){
System.out.println("12의 속도로 달립니다.");
}
public void jump(){
System.out.println("5의 높이로 뜁니다.");
}
}
public class Warrior implements Move{
public void walk(){
System.out.println("1의 속도로 걷습니다.");
}
public void run(){
System.out.println("6의 속도로 달립니다.");
}
public void jump(){
System.out.println("2의 높이로 뜁니다.");
}
}
같은 Move 인터페이스를 implements 하였지만 직업에 따라 속도와 높이가 다를 수 있습니다. 따라서 구현은 각자 다릅니다. 추상 클래스와 비슷한 형식을 가지고 있으며 업 캐스팅과 다운 캐스팅 또한 가능합니다. 대신 여러 개의 인터페이스를 implements 가능합니다.
interface DefenceSkill{
void defenceSkill();
}
위와 같이 DefenceSkill이라는 인터페이스를 만들고 캐릭터가 방어를 하기 위해서 이 인터페이스를 구현하여야 합니다.
public class Warrior implements Move, DefenceSkill{//두개의 인터페이스 implements
public void walk(){
System.out.println("1의 속도로 걷습니다.");
}
public void run(){
System.out.println("6의 속도로 달립니다.");
}
public void jump(){
System.out.println("2의 높이로 뜁니다.");
}
public void defenceSkill(){
System.out.println("방패를 듭니다.");
}
}
추상 클래스의 경우 상속을 하나밖에 못하였지만 implements의 경우는 다중으로 implements가 가능합니다.
디폴트 메서드
인터페이스는 추상 메서드의 집합이라고 하였지만 implements 하는 클래스에서 모두 동일하게 사용되는 메서드의 경우 따로 구현을 하지 않고 인터페이스에 default 메서드를 만들어서 사용할 수 있습니다.
public interface Move{
void walk();
void run();
void jump();
default void rolling(){
System.out.println("구릅니다.");
}
}
모든 캐릭터가 구르는 기술을 가지고 있을 때 이와 같이 default메서드를 이용하면 implements 한 클래스에서 동일하게 사용됩니다. 따로 구현하지 않고 사용이 가능하지만 여러 인터페이스를 implements를 한 경우 인터페이스에 동일한 default 메서드가 존재한다면 추상 메서드처럼 implements 받은 클래스에서 재정의 하여야 합니다.
상속과 추상 이해하기