반응형
Notice
Recent Posts
Recent Comments
관리 메뉴

간단한 개발관련 내용

[JAVA] Interface 정리. 본문

Programming/Java

[JAVA] Interface 정리.

vincenzo.dev.82 2016. 10. 18. 01:09
반응형


Interface


 자바에서 간단했던 인터페이스가 JAVA8 의 등장으로 추가된 내용들이 생겼습니다. 항상 쉽게 생각할 수 있지만, 이런 것들이 막상 설명하려면 어렵게 느껴질 때가 있는데요.


 기존의 인터페이스를 간단히 요약하면 다음과 같습니다.


모든 멤버변수는 public static final 이어야 하며 이를 생략할 수 있으며,

모든 메소드는 public abstract 이어야하고 이를 생략 수 있습니다.


이처럼 간단하게만 알고 있었으며 사용하고 있었는데요. 조금 더 자세하게 이야기 해 보도록 하겠습니다.


 자바에서의 인터페이스는 클래스의 bluprint 입니다. 인터페이스는 앞서 이야기 했듯이 static constants 와 abstract methods 로만 이루어져 있습니다. 자바에서의 인터페이스는 완전한 추상화를 만들기 위한 메커니즘입니다. 메소드의 몸체가 없는 자바의 인터페이스는 추상메소드로만 되어 있습니다. 이것이 완전한 추상화를 달성할 수 있게하며 자바에서 다중상속이 이루어지도록 합니다.


 자바의 인터페이스는 또한 IS-A 관계를 표현합니다. 인터페이스는 추상클래스처럼 초기화 될 수 없습니다.


왜 자바의 인터페이스를 사용할까요?


인터페이스를 사용하는 주요한 4가지 이유가 있습니다.

  • 완벽한 추상화를 달성하기 위함입니다.
  • 인터페이스를 사용함으로써, 다중상속의 기능을 지원할 수 있습니다.
  • 인터페이스의 사용은 약한 결합을 이룰 수 있게 합니다.
  • 다형성을 사용할 수 있습니다.

자바 컴파일러는 인터페이스의 메소드 앞에 public 과 abstract 키워드들을 붙이고 멤버변수 앞에 public, static, final 키워드들을 붙입니다.


다른말로, 자연스럽게 인터페이스의 필드들은 public, static 그리고 final 이며 메소드들은 public absctract 입니다.




클래스와 인터페이스 사이의 관계 이해하기.


 아래의 이미지에서 보는 것과 같이, 클래스는 다른 클래스를 extends 하고 인터페이스는 다른 인터페이스를 extends 하지만 클래스는 인터페이스를 implements 합니다.



자바의 인터페이스에 대한 간단한 예제


이 간단한 예제는, 오직 하나의 메소드만을 가지는 Printable 인터페이스이고, 이 구현은 A4 클래스에서 제공되어 집니다.


package com.joochang.test3;


interface Printable {

    void print();

}


public class A4 implements Printable {


    @Override

    public void print() {

        System.out.println("Hello");

    }

    public static void main(String[] args) {

        A4 a4 = new A4();

       a4.print();

    }

} 



인터페이스에 의한 자바에서의 다중 상속.


 만약 한 클래스가 여러 인터페이스들을 implements 한다면, 또는 한 인터페이스가 여러 인터페이스들을 extends 한다면 알려진 것과 같이 다중상속 입니다.



package com.joochang.test3;


interface Printable {

    void print();  

}  

  

interface Showable {

    void show();  

} 


public class A8 implements Printable, Showable {

    public void print() {

        System.out.println("Hello");

    }

    public void show() {

        System.out.println("Welcome");

    }

    public static void main(String args[]){

        A8 obj = new A8();  

        obj.print();

        obj.show();

    }

} 



질문) 다중 상속은 자바에서 클래스를 통해 지원되지 않으나 인터페이스는 가능하다, 왜 그런가?

 여기서 인터페이스를 설명했던 것처럼, 다중상속은 클래스의 경우에 지원되지 않습니다. 그러나 인터페이스는 지원되는데 왜냐하면 구현 클래스에 의한 구현을 할 때 애매모호함이 없습니다.


package com.joochang.test3;


interface MultiInheritance1 {

    void print();  

}  

  

interface MultiInheritance2 {

    void print();  

} 



public class MultiPleInheritance1 implements MultiInheritance1, MultiInheritance2 {


    @Override

    public void print() {

        System.out.println("Hello World!");

    }

    public static void main(String[] args) {

        MultiPleInheritance1 test = new MultiPleInheritance1();

        test.print();

    }

} 


 위에 있는 예제처럼, MultiInheritance1 과 MultiInheritance2 인터페이스는 같은 메소드를 가지고 있지만 그 구현은 MultiPleInheritance1 클래스에 의해서 제공되어 지는데, 그래서 이러한 점에 애매모호함이 없습니다.



인터페이스 상속


클래스는 인터페이스를 implements 하지만 인터페이스는 다른 인터페이스를 extends 합니다.


package com.joochang.test3;


interface MultiInheritance3 {

    void print();  

}  

 

interface MultiInheritance4 extends MultiInheritance3 {

    void show();  

}


public class MultiPleInheritance2 implements MultiInheritance4 {


    @Override

    public void print() {

        System.out.println("Hello World 1 !");

    }

    @Override

    public void show() {

        System.out.println("Hello World 2 !");

    }

    public static void main(String[] args) {

        MultiPleInheritance2 test = new MultiPleInheritance2();

        test.print();

        test.show();

    }

} 


질문) marker 또는 tagged 인터페이스는 무엇인가?


 어떠한 멤버도 없는 인터페이스가 marker 또는 tagged 인터페이스라고 알려져 있습니다. 예를 들면, Serializable, Cloneable, Remote etc. 이것들은 JVM 에게 몇가지 특별한 정보를 제공하기 위해서 사용되어 지는데 그래서 JVM 이 유용한 동작을 수행할 것 입니다.


//How Serializable interface is written?

public interface Serializable{



자바에서의 중첩 인터페이스


Note : 중첩 인터페이스라고 알려진 것과 같이, 인터페이스는 다른 인터페이스를 가질 수 있습니다. 


interface printable{

    void print();

    interface MessagePrintable{

        void msg();

   }



since jdk 1.8  default method in java interface ... 


since jdk 1.8  static method in java interface ...



참고) http://www.javatpoint.com/interface-in-java




반응형