Java

인터페이스

매료매료 2019. 6. 7. 14:52

interface : '결합부', '서로 다른 두 시스템이나 장치, 사람 등을 이어주는 부분'

 

자바에서 인터페이스는 클래스와 외부세계(ex. 개발자, 다른 클래스)를 이어주는 역할을 함.

인터페이스는 내부에 추상 메소드를 가지고 있으며, 인터페이스를 받은 클래스에서는 해당 메소드를 오버라이딩으로 다시 정의하여 사용함.

인터페이스를 이용하면 메소드의 선언과 구현을 분리할수 있어서 인터페이스를 상속받아 메소드를 구현하는 클래스와 그 메소드를 호출하는 클래스를 서로 독립적으로 개발하거나 관리할 수 있는 장점이 있음.

 

<예시>

interface Money{         공통 기능을 추출한 Money라는 인터페이스를 선언한다.

  abstract void give(int money, String date);

}

자바의 클래스는 여러개의 인터페이스로부터 메소드를 받아 올 수 있다.(다중상속)

 

어떤 객체가 있고 그 객체가 특정한 인터페이스를 사용한다면 그 객체는 반드시 인터페이스의 메소드들을 구현해야 한다. 만약 인터페이스에서 강제하고 있는 메소드를 구현하지 않으면 이 에플리케이션은 컴파일 조차 되지 않는다.

 

인터페이스와 상속은 다르다. 상속이 상위 클래스의 기능을 하위 클래스가 물려 받는 것이라고 한다면, 인터페이스는 하위 클래스에 특정한 메소드가 반드시 존재하도록 강제한다.

 

인터페이스는 다형성에 의한 클래스제어 역할을 한다고 볼 수 있다.

 

클래스를 선언 할 때는 class를 사용하지만 인터페이스는 interface를 사용한다.

 

상속은 extends를 사용하지만 인터페이스는 implements를 사용한다. 이를 바탕으로 위의 예제를 해설해보면 아래와 같다.

 

"클래스 A는 인터페이스 I를 '구현' 한다."

 

################## 실질적인 쓰임 ##################

인터페이스를 이용해서 서로가 동일한 메소드를 만들도록 규약을 만들어서 공유한 결과

각자가 상대의 일정이나 구현하는 방식에 덜 영향을 받으면서 에플리케이션을 구축 할 수 있음.

 

################## 인터페이스의 규칙 ##################

하나의 클래스가 여러개의 인터페이스를 구현 할 수 있다.

여러 개의 인터페이스를 상속하는 경우 콤마(,)를 이용해 인터페이스 명을 구분함.
인터페이스도 상속이 된다. extends와 함께 쓰일때는 항상 extends가 implements보다 먼저 오게 됨.
인터페이스의 맴버는 반드시 public이다.

 

<예시>

class Citizen extends Person implements Money{

  // Person이라는 클래스를 확장(상속)하여, 공통기능을 추출한 Money라는 인터페이스를 담는 객체를 정의/생성하는 툴인 Citizen이라는 클래스를 만든다

  public void give(int Money, String date){

  // 모든 패키지와 클래스에서 접근이 가능하고, 리턴값이 없는 give라는 함수를 선언하고, 정수 값을 담는 money와 문자열 값을 담는 date 파라미터 변수를 인자로 받는다.

 

################## abstract vs. interface ##################

인터페이스와 추상 클래스는 서로 비슷한 듯 다른 기능이다.

인터페이스는 클래스가 아닌 인터페이스라는 고유한 형태를 가지고 있는 반면 추상 클래스는 일반적인 클래스다.

또 인터페이스는 구체적인 로직이나 상태를 가지고 있을 수 없고, 추상 클래스는 구체적인 로직이나 상태를 가지고 있을 수 있다.