클래스와 달리 객체를 생성할 수 없으며, 클래스에서 구현해야 하는
상세 작업 명세서이다.
클래스는 new 키워드를 이용해 객체를 메모리에 생성해서 레퍼런스를 이용해 접근하는 방식이었다.
인터페이스가 가지고 있는 기능들은 상세한 내용이 없고 선언만 되어 있다.
이 내용을 클래스에서 더 명확하게 하고, 정의 부분을 만들어 준다.
즉, 클래스는 인터페이스를 구현하고, 그리고나서 이 클래스로부터 객체를 구현하는 형태이다.
인터페이스는 아래와 같이 구현한다.
// 인터페이스
/*
이 인터페이스를 구현해내는 클래스는 funA 메소드를
만들어야하고, 클래스에서 구체적으로 구현할 때 funA 는
public 이고, 반환형은 void 이며, 파라미터는 없는 등의 초안을 지켜야 한다. */
public interface InterfaceA {
public void funA(); // 매소드 funA 를 선언
}
인터페이스 InterfaceA 를 구체적으로 구현해내는 클래스를 정의해보자.
// 인터페이스인 InterfaceA 를 상세하게 구현해낸 클래스 ImplementClass
public class ImplementClass implements InterfaceA{
public void funA() {
System.out.println("funA START");
}
}
인터페이스 InterfaceA 정의
public interface InterfaceA{
public void funA();
}
인터페이스 InterfaceB 정의
public interface InterfaceB{
public void funB();
}
클래스 정의
// Interface 클래스
public class Interfaceclass implements InterfaceA, InterfaceB{
public Interfaceclass(){
System.out.printlb("클래스 생성자");
}
@Override
public void funA(){
System.out.printlb("==funA()==");
}
@Override
public void funB(){
System.out.printlb("==funB()==");
}
}
main 함수
마찬가지로 객체 ib 의 데이터 타입이 InterfaceB 이므로 funB() 만 사용 가능하다.
// main 함수
public static void main(String[] args){
InterfaceA ia = new Interfaceclass();
InterfaceB ib = new Interfaceclass();
ia.funA();
ib.funB();
}
다양한 클래스가 동일한 인터페이스 데이터 타입을 가질 수 있다.
// ToyRobot 클래스와 TopAirplane 클래스가 동일한 인터페이스 Toy 를 가지는 경우
Toy robot = new ToyRobot();
Toy airplane = new ToyAirplane();
Toy toys[] = {robot, airplane}; // 서로 다른 클래스이지만,
// 데이터 타입이 인터페이스 Toy 로 동일하므로 배열에 두 객체를 할당할 수 있다.
// 데이터 타입은 인터페이스 Toy 타입으로 동일해도, 두 객체는 각자
// 다른 클래스에서 메소드가 구현되었으로 반복문 실행시 서로
// 각자의 클래스에서 정의된 다른 내용을 수행한다.
for (int i =0, i <toys.length; i++){
toys[i].walk();
toys[i].run();
toys[i].alarm();
toys[i].light();
System.out.println();
}