ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA | 인터페이스(Interface)
    programming/JAVA 2020. 5. 26. 00:54

     

     

    인터페이스(interface) 란?


    인터페이스는 모든 기능을 추상화로 정의한 상태이다.

    즉 몸체가 없는 메서드들의 모임이다. 클래스를 구현하기 전에 메서드를 먼저 정해놓는 것이라고 생각!

     

     

     

     

    인터페이스의 역할


    개발코드와 객체가 서로 통신하는 접점 역할을 한다.

    개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다.

    때문에 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 된다.

     

    여기서 드는 의문점!?

    바로 객체의 메소드를 호출하지 않고 귀찮게 중간에 인터페이스를 두는지?

    개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 하기 위해서이다.

    인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴값이 다를 수 있다. 즉, 개발 코드 측면에서는 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있다는 장점을 가지게 된다.

     

     

     

     

    인터페이스의 선언


    [public] interface 인터페이스명 { ... }

    물리적인 형태는 클래스와 동일하지만 클래스는 필드,생성자,메소드를 구성 멤버로 가지는데 비해,

    인터페이스는 상수와 메소드만을 구성 멤버로 가진다.

    인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.

    * 자바7 이전까지는 인터페이스의 메소드는 실행 블록이 없는 추상 메소드로만 선언이 가능했지만,

    자바8부터는 디폴트 메소드와 정적 메소드도 선언이 가능

     

     

     

    추상 메소드 (Abstract Method) / 디폴트 메소드 (Default Method)

    / 정적 메소드 (Static Method)


    인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언한다.

    추상 메소드란? 리턴 타입, 메소드명, 매개변수만 기술되고 중괄호 {} 를 붙이지 않는 메소드를 말한다.

    인터페이스에서 선언된 추상 메소드는 모두 public abstract의 특성을 갖기 때문에 public abstract를 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.

     

    인터페이스 예시)

    public interface interControl{
    
      //상수
      int MAX = 10;
      int MIN = 0;
      
      //추상 메소드
      void turnOn();
      void turnOff();
      void setVol(int vol);
       
      //디폴트 메소드
      default void setMute(boolean mute){
    	if(mute){
        	System.out.println("무음");
        } else{
        	System.out.println("무음 해제");
          }    
        }
        
       //정적 메소드
       static void changeB(){
       	System.out.println("건전지 교환");
       }
     }

     

     

     

     

    구현 클래스


    개발 코드가 인터페이스를 호출하면 인터페이스는 객체의 메소드를 호출한다.

    객체는 인터페이스에서 정의된 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메소드를 가지고 있어야 한다.  이러한 객체를 인터페이스의 구현객체라고 하고, 구현 객체를 생성하는 클래스를 구현 클래스라고 한다.

    public class 구현클래스명 implements 인터페이스명{
    
    	//인터페이스에 선언된 추상 메소드의 실체 메소드 선언
    
    }

     

    * 만약 인터페이스에 선언된 추상 메소드에 대응하는 실체 메소드를 구현 클래스가 작성하지 않으면 구현 클래스는 자동적으로 추상 클래스가 된다. 그렇기 때문에 클래스 선언부에 abstract 키워드를 추가해야 한다.

     

     

     

     

    다중 인터페이스


     

    인터페이스 A 와 인터페이스 B가 객체의 메소드를 호출할 수 있으려면 이 객체는 이 두개의 인터페이스를 모두 구현해야 한다.

    public class 구현클래스명 implements 인터페이스A, 인터페이스B {
    
    	//인터페이스A에 선언된 추상 메소드의 실체 메소드 선언
        
        //인터페이스B에 선언된 추상 메소드의 실체 메소드 선언
        
    }

    다중 인터페이스를 구현할 경우, 모든 인터페이스의 추상 메소드에 대해 실체 메소드를 작성해야 한다.

    만약 하나라도 없으면 추상 클래스로 선언해야함!

     

     

     

     

    인터페이스 사용


    개발코드에서의 인터페이스 사용법은 인터페이스 변수를 선언하고 구현 객체를 대입해야 한다.

    /*
    인터페이스 변수;
    변수 = 구현객체;
    
    //또는
    
    인터페이스 변수 = 구현객체;
    
    */
    
    
    RemoteControl rc;   // RemoteControl는 인터페이스
    rc = new Television();
    rc = new Audio();   // Television과 Audio 는 구현 객체

     

    * 디폴트 메소드는 추상 메소드가 아닌 인스턴스 메소드이므로 구현 객체가 있어야 사용 가능하다. (추상 메소드 사용과 같음)

    * 정적 메소드는 인터페이스로 바로 호출이 가능하다. 

     

     

     

     

    인터페이스의 상속


    인터페이스도 다른 인터페이스를 상속할 수 있다.

    인터페이스는 클래스와는 달리 다중 상속을 허용한다. 다음과 같이 extends 키워드 뒤에 상속할 인터페이스들을 나열할 수 있다.

    public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 {....}

    하위인터페이스를 구현하는 클래스는 하위인터페이스의 메소드 뿐만 아니라 상위인터페이스의

    모든 추상메소드에 대한 실체메소드를 가지고 있어야 한다.

     

    그렇기 때문에 구현클래스로부터 객체를 생성하고 나서! 다음과 같이 하위 및 상위 인터페이스 타입으로 변환이 가능하다.

    하위인터페이스 변수 =  new 구현클래스 (...);
    상위인터페이스1 변수  = new 구현클래스(...);
    상위인터페이스2 변수  = new 구현클래스(...);

     

     

     

    인터페이스 사용 이유


    1) 완벽한 추상화를 달성하기 위함이다.

     

    2) 인터페이스를 사용하여 다중상속의 기능을 지원할 수 있다. 

     

    3) 다형성을 사용할 수 있다.

     

    4) 클래스간 결합도를 낮출 수 있다.

    : 객체지향 설계 원칙의 하나로 클래스간의 영향도는 낮출수록 좋다.

    사용자에서 제공자를 직접 사용하지 않고 인터페이스로 사용하게 되면 제공자쪽에서 코드 변경이 있어도 사용자쪽에 직접적인 영향이 없어 사용자쪽에서 변경하지 않아도 된다.

     

    5) 표준화가 가능하다.

    : 클래스가 기본틀을 제공하여 개발자들이 정형화를 할 수 있다.

     

    6) 개발 시간을 단축 시킬수 있다.

     

     

     

     

     

     

     

    참고 : 이것이 자바다, https://sungwoon.tistory.com/59 ,https://joochang.tistory.com/76

Designed by Tistory.