자바 인터페이스(interface)는 추상 클래스와 비슷한 점이 있지만 한 단계 더 추상화된 클래스이다. 기본적으로 다음과 같이 정의한다.


interface 인터페이스명 {
   public static final 자료형 변수명 = 변수값;
   public abstract 반환자료형 함수명(입력인자들);
}


인터페이스의 멤버 변수는 public static final 로만 지정 가능하고 이것은 생략할 수 있다. 인터페이스 변수는 final 이므로 반드시 변수값을 선언부에 지정해 주어야한다.  멤버는 public abstract 가 기본형으로서 이것도 생략할 수 있다. 예를 들면 다음과 같다.


interface IA {
   int ia = 11; // 앞에 public static final 이 생략됨
   void fun();  // 앞에 public abstract 가 생략됨
}


인터페이스도 추상 클래스와 마찬가지로 직접 객체를 생성할 수 없으며 이것을 구현하는 클래스는 객체화 할 수 있다.


class CA implements IA {
   public void fun() {
       int ib = ia + 11; // ia는 인터페이스에서 정의된 정적 변수이다.
       System.out.println(“fun() redefined.”);
   }
}


추상클래스와 다르게 인터페이스는 이를 구체화하기 위해 implements 라는 키워드를 사용하고 그 뒤에 구현할 인터페이스 명을 써야한다. IA를 구체화하기 위해서는 반드시 추상 메소드인 fun()의 본체를 위와 같이 정의하여야 한다. 그리고 fun()의 접근 지정자는 반드시 public이어야 한다. 그 이유는 인터페이스에서 (생략되었다 할 지라도) public abstract 으로 정의되었기 때문이다.


 실행 가능한 예를 들면 다음과 같다.


package tut03;

public class Tut03 {
   public static void main(String[] args) {
       Violin v1 = new Violin();
       v1.ready();
       v1.play();

       Guitar g1 = new Guitar();
       g1.ready();
       g1.play();
   }
}

interface Playable {
   String player = "살레시오";
   void ready();
   void play();   
}

class Violin implements Playable {
   public void ready() {
       System.out.println(player+"의 바이올린이 준비되었다.");
   }
   public void play() {
       System.out.println("낑~깡~낑~깡~");
   }
}

class Guitar implements Playable {
   public void ready() {
       System.out.println(player+"의 기타가 준비되었다.");
   }
   public void play() {
       System.out.println("디리링~디리링~");
   }    
}


이 예에서는 Playable 이라는 인터페이스를 구현한 Violin과 Guitar 클래스를 작성하였다. 인터페이스의 이름은 관례적으로 ~able 로 끝나는 것들이 많다.


 이와 같이 인터페이스는 구현하고자하는 여러 클래스의 공통적인 부분(정적 변수와 public 함수)만 기술해 놓은 기초 설계도와 같고 인터페이스를 구현하는 클래스에서 추상 메소드의 몸체를 모두 정의하도록 강요한다. 만약 인터페이스 구현하는 어떤 클래스가 모든 추상 메소드를 구현하지 않는다면 그 클래스는 추상 클래스가 되어야 한다는 점도 알아두어야 한다. JAVA8에서는 인터페이스에 대한 규약이 좀 더 확장되었는데 이것은 다른 포스트에서 다루도록 하겠다.



Posted by 살레시오