인터페이스(interface) 란?
- 현업에서 소스코드 작성 시 클래스를 처음부터 구현하게 된다면 코드의 가독성도 떨어지고 시간도 오래걸릴 것입니다. 또 한 팀별로 각각 다른 모듈을 만들 시 팀마다 방법이 다르기 때문에 서로 호환성이 없고 일관성이 떨어지게 된다.
- 인터페이스를 통해 기본적으로 구현해야 할 메소드에 대한 규격들을 알려준다면 훨씬 효율적일 것이다.
- 즉, 인터페이스란 특정 기능을 개발하는데 있어 공통적인 기능을 명시하고 강제적으로 구현하게끔 하는 역할입니다.
- 인터페이스를 사용하게 된다면 자바의 다형성을 이용할 수 있고 이를 통해 유지보수성을 높일 수 있습니다.
인터페이스 정의
public interface Phone {
int version = 13;
String getManufacture();
String getOS();
}
- 인터페이스는 interface라는 키워드를 사용해서 정의할 수 있습니다.
- 접근제어자로 public 또는 default가 명시될 수 있습니다.
- 인터페이스의 변수의 값은 "public static final" 키워드가 생략된 상수이므로 주어진 값으로만 사용가능 합니다.
- getManufacture와 getOS는 "public abstract" 키워드가 생략된 메소드로 인터페이스를 구현하는 곳에서 오버라이딩을 강제시킵니다.
인터페이스 구현
public class IPhone implements Phone {
@Override
public String getManufacture() {
return "Apple";
}
@Override
public String getOS(){
return "MacOS";
}
}
public class Galaxy implements Phone {
@Override
public String getManufacture() {
return "Samsung";
}
@Override
public String getOS(){
return "Android";
}
}
- 인터페이스 구현은 implements 키워드를 통해 일반 클래스에서 인터페이스를 구현.
- IPhone 클래스와 Galaxy 클래스는 Phone 인터페이스의 규격에 맞게 재정의하고 있음.
인터페이스 레퍼런스를 통해 구현체 사용하는 방법
public class Main {
public static void main(String[] args) {
Phone galaxy = new Galaxy();
Phone iphone = new IPhone();
System.out.println(galaxy.getManufacture());
System.out.println(galaxy.getOS());
System.out.println(iphone.getManufacture());
System.out.println(iphone.getOS());
}
}
- 자바의 다형성을 이용하여 인터페이스 참조변수로 다양한 클래스를 표현할 수 있다.
- 예시에서 보는 것 처럼 Phone 인터페이스 참조변수에 Galaxy 클래스와 IPhone 클래스로 여러 타입의 객체로 참조할 수 있다.
인터페이스 상속
- 인터페이스는 다중 상속이 가능하여 여러 인터페이스를 상속받아 하나의 인터페이스를 만들 수 있다.
- 이럴경우 모든 인터페이스에 존재하는 메소드를 재정의 해야 한다.
public interface Phone {
int version = 13;
String getManufacture();
String getOS();
}
public interface Watch {
String getAppearance();
}
public interface Device extends Phone,Watch { }
public class Machine implements Device{
@Override
public String getManufacture() {
return null;
}
@Override
public String getOS() {
return null;
}
@Override
public String getAppearance() {
return null;
}
}
- Phone과 Watch 인터페이스를 상속받은 Device 인터페이스를 생성하였다.
- Device 인터페이스를 구현하는 일반 클래스에서는 Phone 인터페이스와 Watch 인터페이스에 있는 메소드들을 모두 구현해야만 한다.
추상클래스와 인터페이스 비교
- 인터페이스는 특정 기능을 구현하기 위한 필수 규격을 주는 것으로 추상클래스는 미완성 설계도, 인터페이스는 기본 설계도로 보면 된다.
- 모든 클래스를 인터페이스를 사용한다면 공통된 기능을 모두 구현해야 하기 때문에 번거로운 작업이다. 이럴경우 추상 클래스를 이용해야 한다.
- 하지만, 추상클래스만 사용하기에는 다중상속이 불가하기 때문에 각각 다른 추상 클래스를 구현하는데 공통된 기능이 존재 할 경우는 인터페이스가 필요하다.