본문 바로가기

Programming/JAVA

인터페이스(3) - 인터페이스 구성멤버의 개념과 특성

java logo image

 

 

○ 상수 필드(constant field)의 선언

 

이전에도 설명했듯이, JAVA의 인터페이스 자체는 데이터를 직접 저장할 수 없는 구조입니다. 그래서 인스턴스 객체의 생성도 불가능합니다. 또한, 인스턴스 필드와 더불어 정적(static) 필드 역시 가질 수 없죠. 인터페이스는 오로지 상수(static final) 필드 만을 가질 수 있습니다. 

 

- 상수는 우리가 static 챕터에서 배웠듯이 [public static final] 타입으로 선언됩니다. 
- 상수의 이름은 모두 대문자로 작성하고, 단어별 구분은 언더바(_)로 합니다.
- 인터페이스에서 상수는 static { } 블록도 이용할 수 없습니다. 반드시 선언과 동시에 초기값이 필요합니다.
- 인터페이스에서 상수 선언 시, [public / static / final]을 생략하더라도 컴파일 과정에서 자동으로 부여됩니다.

 

아래는 인터페이스에서 상수 선언의 예시입니다. 

 

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

 

 

 


 

 

 

○ 추상 메서드(abstract method)의 선언

 

추상 메서드는 상속 아티클에서 배운 것과 속성이 크게 다르지 않습니다. 인터페이스를 통해서 호출되는 메서드는 코드에서 호출하더라도 결과적으로는 인터페이스를 중개해 구현 객체에서 실행됩니다. 그래서 기본적으로 인터페이스에서는 실행 블록이 없는 추상 메서드를 선언하게 됩니다. 타입은 당연히 [public abstract] 메서드가 됩니다. 

 

- 인터페이스에서의 추상 메서드는 [public abstract] 타입으로 선언됩니다.
- 리턴 타입, 메서드 이름, 파라미터를 기재하지만 중괄호( { } )는 붙이지 않습니다. 
- 인터페이스에서 추상 메서드 선언 시, [public abstract]를 생략해도 컴파일 과정에서 자동으로 부여됩니다. 

 

역시 인터페이스에서의 추상 메서드 선언 예시를 보겠습니다.

 

public interface RemoteConrtrol {
    public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
    
    public void turnOn();
    public void turnOff();
    public void setVolume(int volume);
}

 

 

 


 

 

○ 디폴트 메서드(default method)의 선언

 

이제부터는 자파 8에서 추가된 새로운 확장 멤버들의 개념입니다. 다소 헷갈릴 수 있으니 잘 읽어보시기 바랍니다. 우선, 디폴트 메서드는 일반적인 클래스의 인스턴스 메서드와 형태가 똑같습니다. 단, public default 키워드가 리턴 타입 앞에 명시되어야 합니다. 물론 인터페이스의 디폴트 메서드의 경우 기본적 public 속성을 갖기에 생략이 가능합니다. 

 

개요에서 설명했다시피, 디폴트 메서드는 인터페이스의 속성과 다르게 실행코드를 함께 작성한다는 특성을 갖습니다. 이는, 인터페이스가 해당 실행까지 통제한다는 의미가 아닙니다. 선언은 인터페이스에서 해두지만, 실제로 이 실행 코드가 실행되는 것은 이를 구현한 객체에서 이루어진다는 점을 주의해야 합니다.

 

그럼 인터페이스에서 디폴트 메서드의 선언 예제도 살펴보겠습니다. 

 

public interface RemoteConrtrol {
    public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
    
    public void turnOn();
    public void turnOff();
    public void setVolume(int volume);
    
    default void setMuete(boolean mute) {
        if(mute) {
            System.out.println("무음");
        } else {
            System.out.println("무음 해제");
        }
    }
}

 

 

 


 

 

○ 정적 메서드(statict method)의 선언

 

정적 메서드 역시 자바 8에서 확장 개념으로 추가되었습니다. public static 키워드가 리턴 타입 앞에 명시되어야 하고, 물론 인터페이스의 정적 메서드의 경우 기본적 public 속성을 갖기에 생략이 가능합니다. 또한 클래스의 정적 메서드와도 형태가 동일합니다. 

 

public interface RemoteConrtrol {
    public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
    
    public void turnOn();
    public void turnOff();
    public void setVolume(int volume);
    
    default void setMuete(boolean mute) {
        if(mute) {
            System.out.println("무음");
        } else {
            System.out.println("무음 해제");
        }
    }
    
    static void changeBattery() {
        System.out.println("배터리 교환");
    }
}