Media Log


1. 인터페이스(Interface)


오늘은 인터페이스에 대해 배워보도록 하겠습니다. 이제 배울 인터페이스는 우리가 전에 배운 추상 클래스와 매우 흡사합니다. 추상 클래스처럼 추상 메소드를 가집니다. 다만 아래와 같은 차이점이 있습니다.


추상 클래스는 일반 메소드와 추상 메소드를 둘다 가질 수 있는 반면에, 인터페이스는 오로지 추상 메소드와 상수만을 가집니다. 즉 로직을 작성할 수 없습니다.

인터페이스 내에 존재하는 메소드는 무조건 public abstract로 선언됩니다.

인터페이스 내에 존재하는 변수는 무조건 public static final로 선언됩니다.

● 인터페이스는 다중 상속과 비슷한 기능을 제공합니다.


이런 특징을 가진 인터페이스는, 알고보면 상당히 편리한 기능을 지니고 있습니다. 우리가 만약 프로젝트를 진행하고 있는데, 인터페이스를 사용하면 다른 구성원들이 각각의 부분을 완성할때 까지 기다리지 않고 서로간의 규약만 정해두어 내 부분만 따로 나눠서 작성된 코드를 컴파일 할 수 있습니다. 즉, 인터페이스는 외부를 서로 이어주는 다리 역할을 하는 것입니다.


이제, 인터페이스를 구현해봅시다. 아래의 예제는 인터페이스 구현 예제입니다.


interface 인터페이스명 [extends 상속받을 인터페이스명, ..., ...] {

void 추상메소드명(); // = public abstract void 추상메소드명

...

}

(인터페이스 정의 시 클래스처럼 상속받아올 인터페이스명을 작성할 수 있습니다.)


그리고 만약 클래스가 인터페이스를 참조하게 된다면 아래와 같이 작성해야 합니다.


class 클래스명 [extends 상속받을 클래스명, ..., ...] implements 인터페이스명 {

...

}

(인터페이스를 사용하기 위해서는 implements 예약어를 사용하여야 합니다. 다중상속과 흡사)


아래의 예제는 인터페이스를 사용하여 작성한 코드의 예제입니다.


interface IntExample {

  public void sayHello();

}

 

public class JavaInterfaceExample implements IntExample{

  public void sayHello(){

    System.out.println("안녕!");

  }

 

  public static void main(String args[]) {

    JavaInterfaceExample javaInterfaceExample = new JavaInterfaceExample();


    javaInterfaceExample.sayHello();

  }

}


결과:

안녕!


설명하자면, 1행에서 인터페이스가 정의되었습니다. 안에는 sayHello라는 추상 메소드가 존재합니다. 그리고 5행을 보시면 JavaInterfaceExample 클래스는 IntExample 인터페이스를 상속받습니다. 6~8행은 sayHello의 구현 부분이고, 11행에서 객체를 생성하고, 13행에서 sayHello 메소드를 호출합니다. 간단하죠?


한가지 더, 인터페이스를 사용하시면서 주의하실 점이 있습니다.


클래스에 인터페이스 상속 시 인터페이스 내에 정의된 모든 추상 메소드를 구현하여야만 정상적인 컴파일이 가능합니다.


인터페이스는 위에서 말했듯이 단일 상속만 가능한 클래스와는 달리 다중 상속이 가능합니다. 아래는 인터페이스의 다중 상속 예제입니다. (자세히 말하면 다중 상속이 아닌, 다중 상속을 해주는 것처럼 하는 것입니다. 말하자면 다중 구현에 가깝습니다.)


interface aExample {

  public void sayHello();

}


interface bExample {

  public void sayBye();

}


class JavaInterfaceExample implements aExample, bExample {

  public void sayHello(){

    System.out.println("안녕!");

  }

  public void sayBye(){

    System.out.println("잘가!");

  }


  public static void main(String args[]) {

    JavaInterfaceExample javaInterfaceExample = new JavaInterfaceExample();


    javaInterfaceExample.sayHello();

    javaInterfaceExample.sayBye();

  }

}


결과:

안녕!

잘가!


아까의 예제와 코드가 비슷합니다. 달라진게 있다면 하나의 인터페이스가 정의되고 그 인터페이스 내에 sayBye 라는 추상 메소드가 정의된 점, 인터페이스 다중 상속부분, sayBye 구현 부분이 추가 된점밖에 없습니다. 유심히 보셔야 할건 implements 예약어 뒤의 상속받을 인터페이스가 이번엔 1개가 아닌 2개로 늘어났다는 점입니다. 또하나 아셔야 할게 있다면, 일반 클래스에 한 개 이상의 인터페이스를 정의할 수도 있지만 인터페이스 간 상속이 가능하다는 점도 알아두셨으면 좋겠습니다.


인터페이스 강좌는 여기서 마치도록 하겠습니다. 수고하셨습니다.


다음 강좌는 콘솔 입출력(Console Input/Output)에 대해 알아보도록 하겠습니다. 

저작자 표시
신고
  1. 김승현 at 2012.10.08 19:53 신고 [edit/del]

    감사합니다~

    Reply
  2. 역시이맛이야 at 2014.07.24 19:25 신고 [edit/del]

    질문이 있는데요 이게 왜 필요한건지 와닿지가 않습니다..

    JavaInterfaceExample 클래스 안에

    sayHello()
    sayBye()

    가 모두 정의되어 있는데


    9행에서 aExample 과 bExample 은 왜 다중상속 시키고 있는건가요?

    Reply
    • BlogIcon EXYNOA at 2014.07.26 03:01 신고 [edit/del]

      단순히 저 예제에서는 인터페이스는 단일 상속을 할 수 있는 클래스와는 다르게 다중 상속이 가능하다는 점을 보여주는 예입니다. 여기서 클래스가 할 수 없는 것을 인터페이스가 가능하게 해준다는 것에 의미를 두고 있습니다.

  3. 역시 이맛이야 at 2014.07.24 19:27 신고 [edit/del]

    1행 부터 7행까지는 그냥 없어도 되는 부분 아닌가요?

    Reply
    • BlogIcon EXYNOA at 2014.07.26 02:59 신고 [edit/del]

      여기서 중요한 것은 '다른 구성원들이 각각의 부분을 완성할때 까지 기다리지 않고 서로간의 규약만 정해두어 내 부분만 따로 나눠서 작성된 코드를 컴파일 할 수 있다'라는 것입니다. 인터페이스의 사용 목적을 이해하고 계셨으면 좋겠습니다.

  4. 모범 at 2014.09.22 03:23 신고 [edit/del]

    override 뜨는데 어떡하죠?

    Reply
  5. 여행매니아 at 2015.01.23 20:55 신고 [edit/del]

    좋은 글 감사 ^^
    제가 올린 링크를 보면 자바 인터페이스를 이해하는 데 도움되는 내용이 있어요~

    http://www.slideshare.net/JinhyunSim/java-interface-43455338

    Reply

submit

티스토리 툴바