[Java] 인터페이스 ①

kiteB·2022년 1월 6일
0

Java

목록 보기
17/35
post-thumbnail
post-custom-banner

[ 인터페이스의 역할 ]

인터페이스(interface)는 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스이다.

  • 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다.
    그렇기 때문에 개발 코드는 객체의 내부 구조를 알 필요가 없고, 인터페이스의 메소드만 알고 있으면 된다.
  • 인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴값이 다를 수 있다.
    따라서 개발 코드 측면에서는 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있다는 장점을 가지게 된다.

[ 인터페이스 선언 ]

1. 인터페이스 선언

인터페이스 선언 시 interface 키워드를 사용한다.

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

인터페이스 이름은 클래스 이름을 작성하는 방법과 동일하다.

🔗 클래스 이름 규칙 보러가기

필드, 생성자, 메소드를 구성 멤버로 가지는 클래스에 비해, 인터페이스는 상수와 메소드만을 구성 멤버로 가진다.
인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.

interface 인터페이스명 {

    //상수
    타입 상수명 =;
    
    //추상 메소드
    타입 메소드명(매개변수, ...);
    
    //디폴트 메소드
    default 타입 메소드명(매개변수, ...) { ... }
    
    //정적 메소드
    static 타입 메소드명(매개변수) { ... }

}

1) 상수 필드 ( Constant Field )

  • 상수는 인터페이스에 고정된 값으로 런타임 시에 데이터를 바꿀 수 없다.
  • 상수를 선언할 때에는 반드시 초기값을 대입해야 한다.

2) 추상 메소드 ( Abstract Method )

  • 추상 메소드는 객체가 가지고 있는 메소드를 설명한 것으로 호출할 때 어떤 매개값이 필요하고, 리턴 타입이 무엇인지만 알려준다.
  • 실제 실행부는 객체(구현 객체)가 가지고 있다.

3) 디폴트 메소드 ( Default Method )

  • 디폴트 메소드는 인터페이스에 선언되지만 사실은 객체(구현 객체)가 가지고 있는 인스턴스 메소드라고 생각하면 된다.
  • 자바 8에서 디폴트 메소드를 허용한 이유는 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위해서이다.

4) 정적 메소드 ( Static Method )

  • 정적 메소드도 자바 8부터 작성할 수 있다.
  • 디폴트 메소드와 달리 객체가 없어도 인터페이스만으로 호출할 수 있다.

2. 상수 필드 선언

public, static, final을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.

[ public static final ] 타입 상수명 =;

상수명은 대문자로 작성하되, 서로 다른 단어로 구성되어 있을 경우에는 언더바_로 연결하는 것이 관례이다.
Ex) MODEL, MAX_VALUE

인터페이스 상수는 static {} 블록으로 초기화할 수 없기 때문에 반드시 선언과 동시에 초기값을 지정해야 한다.

예제

public interface RemoteControl {
    public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
}

3. 추상 메소드 선언

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

  • 인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행되기 때문에 인터페이스의 메소드는 실행 블록이 없는 추상 메소드로 선언한다.
  • 인터페이스에 선언된 추상 메소드는 모두 public abstract의 특성을 갖기 때문에 public abstract을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.

예제

public interface RemoteControl {
    //상수
    public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
    
    //추상 메소드 (메소드 선언부만 작성)
    public void turnOn();
    public void turnOff();
    public void setVolume(int volume);
}

4. 디폴트 메소드 선언

  • 디폴트 메소드는 자바 8에서 추가된 인터페이스의 새로운 멤버이다.
  • 형태는 클래스의 인스턴스 메소드와 동일한데, default 키워드가 리턴 타입 앞에 붙는다.
  • 디폴트 메소드는 public 특성을 갖기 때문에 public을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
[public] default 리턴타입 메소드명(매개변수, ...) { ... }

예제

public interface RemoteControl {
    //상수
    public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
    
    //추상 메소드 (메소드 선언부만 작성)
    public void turnOn();
    public void turnOff();
    public void setVolume(int volume);
    
    //디폴트 메소드
    default void setMute(boolean mute) {
        if (mute) {
            System.out.println("무음 처리합니다.");
        } else {
            System.out.println("무음 해제합니다.");
        }
    }
}

5. 정적 메소드 선언

정적 메소드는 디폴트 메소드와 마찬가지로 자바 8에서 추가된 인터페이스의 새로운 멤버이다. 형태는 클래스의 정적 메소드와 완전 동일하다.

정적 메소드는 public 특성을 갖기 때문에 public을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.

[public] static 리턴타입 메소드명(매개변수, ...) { ... }

예제

public interface RemoteControl {
    //상수
    public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
    
    //추상 메소드 (메소드 선언부만 작성)
    public void turnOn();
    public void turnOff();
    public void setVolume(int volume);
    
    //디폴트 메소드
    default void setMute(boolean mute) {
        if (mute) {
            System.out.println("무음 처리합니다.");
        } else {
            System.out.println("무음 해제합니다.");
        }
    }
    
    //정적 메소드
    static void changeBattery() {
         System.out.println("건전지를 교체합니다.");
    } 
}

[ 참고자료 ]

이것이 자바다 책
http://tcpschool.com/java/java_polymorphism_interface

profile
🚧 https://coji.tistory.com/ 🏠
post-custom-banner

0개의 댓글