인터페이스란 추상클래스를 고도화시킨 문법이며, 반드시 추상메서드와 상수만 선언해야 한다.
다른 클래스에서 인터페이스를 지정받을 때는 implements 키워드를 사용하며, 지정받은 클래스는 인터페이스가 갖고 있는 추상 메서드들을 반드시 재정의 해야 한다.
인터페이스의 구조
interface 인터페이스명 {
상수, 추상메서드 선언
}
인터페이스의 작성
interface InterfaceEx{
int a = 3; // public static final int a = 3;
int b = 5; // public static final int b = 5;
String method1(); // public abstract String method1();
String method2(); // public abstract String method2();
}
인터페이스의 상속
interface InterfaceEx{
int a = 3;
int b = 5;
String method1();
String method2();
}
interface InterfaceEx2{
int c = 3;
String method3();
}
interface InterfaceEx3 extends InterfaceEx, InterfaceEx2{ }
인터페이스의 구현
implements 키워드를 이용해 자신의 정의된 추상 메서드의 몸통을 만들어주는 클래스를 작성한다.public class Main{
public static void main(String[] args) {
A a = new A();
System.out.println(a.up(4)); // 5
System.out.println(a.down(4)); // 3
}
}
interface InterfaceEx{
int up(int x);
int down(int x);
}
class A implements InterfaceEx{
public int up(int x) {
return x+1;
}
public int down(int x) {
return x-1;
}
}
위의 코드를 보자. InterfaceEx 인터페이스에서 미완성된 up과 down 메서드가 있다. 그리고 A 클래스는 InterfaceEx 인터페이스로부터 지정받아 up과 down 메서드를 각각 구현한다.
main 메서드에서 클래스 A 타입의 객체 a를 생성한 후, 매개변수로 둘 다 4를 넘겨주고 up과 down 메서드를 출력하면 각각 5와 3이 잘 출력되는것을 볼 수 있다.
인터페이스를 이용한 다형성
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
System.out.print("1과 2중 하나를 입력하세요. (1. 개 2. 고양이)");
Scanner sc = new Scanner(System.in);
int input = sc.nextInt();
Animal animal = null;
switch(input) {
case 1:
animal = new Dog();
animal.getName();
animal.cry();
break;
case 2:
animal = new Cat();
animal.getName();
animal.cry();
break;
default:
System.out.println("1과 2중 하나의 숫자만을 입력하세요.");
}
}
}
interface Animal {
public void getName();
public void cry();
}
class Dog implements Animal{
@Override
public void getName() {
System.out.println("이 동물은 개 입니다.");
}
@Override
public void cry() {
System.out.println("멍멍");
}
}
class Cat implements Animal{
@Override
public void getName() {
System.out.println("이 동물은 고양이 입니다.");
}
@Override
public void cry() {
System.out.println("야옹");
}
}
위의 코드를 보자. Dog 클래스와 Cat 클래스가 각각 Animal 인터페이스를 구현하고 있으므로 각 클래스에서는 getName과 cry 메서드를 오버라이딩 했다.
그리고 main메서드에서 1과 2중 하나의 값을 입력을 받아 1일때는 Animal타입의 객체에 Dog 클래스의 생성자를 선언해 Dog 클래스에서 오버라이딩된 메서드를 사용해 출력하고, 2일때는 Animal타입의 객체에 Cat 클래스의 생성자를 선언해 Cat 클래스에서 오버라이딩된 메서드를 사용해 출력하는 것이다.
인터페이스의 특징
개발 시간을 단축시킬 수 있다.
표준화가 가능하다.
프로젝트에서의 기본 틀을 인터페이스로 작성하면, 여러 개발자가 참여해도 일관되고 정형화된 프로그램의 개발이 가능하다.
서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
상속관계도 아니고 같은 부모 클래스를 가지고 있지 않은 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.
독립적인 프로그래밍이 가능하다.
인터페이스는 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제 구현에 독립적인 프로그램을 작성하는 것이 가능하다.