ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인터페이스 (interface)
    백엔드/자바 2020. 8. 7. 03:38

    인터페이스란?

    인터페이스는 일종의 추상 클래스로서 일반적인 추상 클래스보다 추상화가 심하다.

     

    추상 클래스는 추상 메서드 뿐 아니라 일반 메서드, 일반 멤버 변수를 가질 수 있다.

     

    하지만 인터페이스는 추상 메서드와 상수만을 가질 수 있고 그 외 어떤 요소도 허용치 않는다.

     

    사람의 얼굴로 치면 인터페이스는 뼈대, 추상 클래스는 피부, 일반 클래스는 눈코입이라고 할 수 있다.

     

    그만큼 추상 클래스와 더불어 다른 클래스에 도움을 주는 목적으로 만들어진다.

     

    인터페이스의 사용 이유

    인터페이스의 사용 이유는 추상 클래스를 이용하는 이유와 동일하다.

     

    추상클래스나 인터페이스나 모두 그 자체로는 특별한 기능을 하지 않는다.

     

    하지만 한 가지 프로그램을 여러명이 짤 때 참고하고 쓸 수 있는 가이드의 역할을 한다.

     

    그리고 인터페이스는 추상 클래스보다 더욱 높은 추상화 정도를 가진다.

     

    인터페이스와 추상 클래스와 일반 클래스의 차이

    인터페이스는 아래 표와 같은 성향을 가진다.

     

    인터페이스는 클래스 내에 추상 메서드와 상수만을 가질 수 있다.

     

    아주 극단적인 추상 클래스라고 할 수 있다.

     

     

    인터페이스

    추상 클래스

    일반 클래스

    추상 메서드 보유 가능 여부

    O

    O

    X

    상수

    O

    O

    O

    일반 멤버 변수 보유 여부

    X

    O

    O

    일반 메서드 소유 여부

    X

    O

    O

    객체 생성 가능 여부

    X

    X

    O

    생성자 보유 가능 여부

    X

    O

    O

     

    인터페이스의 사용법과 형태

    인터페이스를 선언하는 것은 추상 클래스와 크게 다르지 않다.

     

    클래스 앞에 'abstract' 대신 'interface'를 붙여서 만들면 된다.

     

    interface test1{  // interface를 붙여서 'test'를 인터페이스로 선언
    
      int A = 10;
      // 인터페이스는 멤버변수로서 상수만 가질 수 있다.
      // public static final은 생략이 가능하다.
      
      int test_method(int a);
      // 인터페이스가 가진 추상 메서드는 접근제어자, public abstract는 생략이 가능하다.
    
    }

     

    사용할 때는 상속을 해서 사용하면 된다.

     

    다만 여기선 추상 클래스를 상속하는 것처럼 extends를 쓰는 것이 아니다.

     

    'implemnets'라고 쓰고 구현한다라고 표현한다.

     

    class test2 implements test{  // 인터페이스 'test'를 implements한 일반 test2 자손 클래스
    
      int test_method(int a);  // 추상 메서드 구현은 기존 추상 클래스와 방식이 같다.
    
    }

     

    인터페이스를 다룰 때 요점은 다음과 같다.

     

    ◎ 인터페이스는 이름 앞에 'interface'를 붙이면 선언할 수 있다.

    ◎ 인터페이스의 추상 메서드는 'public abstract'를 생략할 수 있다.(왜냐면 모든 메서드가 추상뿐이니까)

    ◎ 인터페이스의 모든 멤버변수는 'public static final'(상수)여야 한다.

        이는 생략 가능하다.(모든 멤버변수가 상수니까)

     

    인터페이스의 예외 사항들

    앞서 말한 이야기는 JDK 1.8이전까지의 이야기이다. 개발상의 어려움으로 2 가지 예외가 생겼다.

     

    2가지는 다음과 같다.

     

    ◎ 메서드에 'default' 키워드를 붙여 'default method'를 만들 수 있다. (접근 제어자 default와는 다르다.)

        'default method'일때도 접근제어자는 public이며 이는 생략 가능하다.

     

    ◎ 추상 메서드에 제어자로 'static'을 쓸 수 있다. (접근 제어자는 public 이어야 하며 이는 생략 가능)

     

    다음은 'static'메서드와 'default'메서드를 인터페이스에서 선언하는 코드다.

     

    일반 추상 메서드와 달리 인터페이스 내에서도 구현부(body)부분을 채워줘야 비로서 선언을 할 수 있다.

     

    즉 선언부터 '완벽한 형태 선언부+구현부'가 갖춰줘야 한다.

     

    interface test{  //인터페이스 'test' 선언
    
      public static int test_method2(int a){ return a; }
      // static 메서드, 메서드의 바디 즉 구현부까지 표현 가능하다.
      
      public default int test_method3(int a){ return a; }
      // // default 메서드, 해당 부분은 인터페이스 상속시 꼭 오버라이딩으로 구현할 필요 없음
    
    }

     

    하지만 주의할 것이 있다.

     

    'default'메서드를 오버라이딩 할때는 'default' 키워드를 삭제하고 오버라이딩 해야한다.

     

    왜냐하면 인터페이스의 'default'메서드의 'default'는 접근 제어자를 나타내는 것이 아니기 때문이다.

     

    인터페이스의 모든 메서드는 'pubilc'을 접근제어자로 가지고 있다.

     

    그래서 실제 구현을 위해 오버라이딩 할때는 'default'를 지우고 오버라이딩을 실시해야 한다.

     

    class test2 implements test{  // 인터페이스 'test'를 상속한 'test2' 자손 클래스
    
      public static int test_method2(int a, int b){  // static 메서드를 오버라이딩한 메서드
        return a+b;
        }
    
      public int test_method3(int a, int b){ // default 메서드를 오버라이딩한 메서드
      // 단, 이 경우 default 키워드를 삭제하고 오버라이딩을 해야함
      // 왜냐면 default 메서드의 default는 접근 제어자가 아니기 때문
      // 인터페이스의 모든 메서드는 public을 접근 제어자로 갖는다.
        return a+b;
        }
        
    }

     

     

    '백엔드 > 자바' 카테고리의 다른 글

    익명 클래스(anonymous class)  (0) 2020.08.11
    추상클래스, 인터페이스와 다형성  (0) 2020.08.07
    추상 클래스 (abstract class)  (0) 2020.08.06
    추상 메서드 (abstract method)  (0) 2020.08.06
    상속과 다형성(polymorphism)  (0) 2020.08.05
Designed by Tistory.