[Java] 인터페이스 - 메소드

Bam·2024년 3월 5일
0

Java

목록 보기
41/98
post-thumbnail

지난 포스트에서 인터페이스의 개념을 소개하고 다루면서 인터페이스에는 상수와 추상 메소드가 올 수 있다고 했는데요. 저 둘은 인터페이스의 기본 개념에 포함되는 내용이라서 먼저 소개했습니다. 그래서 이번에는 상수와 추상 메소드 외에 인터페이스에서 사용할 수 있는 메소드들을 소개해보려고 합니다.


디폴트 메소드

인터페이스는 디폴트 메소드를 가질 수 있습니다. 디폴트 메소드는 실행부분이 있는 메소드이며 추상 메소드나 클래스 메소드와 구분하기 위해 맨 앞에 default 키워드를 붙입니다.

default 리턴타입 메소드명 (매개변수, ...) {}

디폴트 메소드는 반드시 실행 부분을 작성해야하며, 실행부분에서 상수나 추상 메소드를 호출할 수도 있습니다.

public interface InterfaceStudy {
    int NUMBER = 0;	//상수
    
    void printCurrentNumber();	//추상메소드
    
    public default void defaultMethod() {	//디폴트 메소드
        System.out.println(NUMBER);
        
        printCurrentNumber();
    };
}

디폴트 메소드는 구현된 클래스에서 오버라이딩해서 사용할 수 있습니다. 이때 접근 제한자를 반드시 public으로 설정하고 default 제어자를 제거해줍니다.

public class InterfaceStudyImpl implements InterfaceStudy {
    (...)
    
    @Override	//구현 클래스에서 오버라이딩한 디폴트 메소드
    public void defaultMethod() {
        System.out.println(NUMBER);
        printCurrentNumber();
        System.out.println("오버라이딩된 메소드");
    };
}

클래스메소드

인터페이스는 클래스메소드(정적 메소드, static 메소드)도 멤버로 가질 수 있습니다. 클래스메소드는 구현 클래스 없이 인터페이스만을 가지고 사용할 수 있습니다.

static 리턴타입 메소드명(매개변수, ...) {}
public interface InterfaceStudy {
    public static void callMe() {	//클래스 메소드 선언
        System.out.println("인터페이스의 클래스메소드 호출");
    }
}
public class Main {
    public static void main(String[] args) {
        InterfaceStudy.callMe();	//인터페이스만으로 클래스메소드 호출
    }
}


private 메소드

지금까지 본 인터페이스의 멤버들인 상수는 public static final, 추상 메소드는 public abstract, 디폴트 메소드는 public default, 클래스 메소드는 public static으로 모두 접근 제어자로 public이 붙었습니다.

위에서 디폴트 메소드와 클래스메소드를 다룰 때 이야기를 하진 않았지만 접근 제어자는 모두 public으로 사용했습니다. 만약 접근 제어자를 생략하는 경우 컴파일 과정에서 자동으로 public이 붙어서 컴파일 됩니다.

이러한 public 접근 제어자 메소드들 외에도 인터페이스에선 private 메소드의 선언 및 사용도 가능합니다.

private로 메소드를 선언하면 해당 인터페이스 내부의 디폴트 메소드와 클래스메소드에서도 호출이 가능한 메소드가 됩니다. 이를 이용해서 디폴트 메소드와 클래스메소드에 중복되는 코드가 있다면 해당 부분은 private 메소드를 선언해서 외부에는 비공개하고 내부에서만 사용하는 방식으로 사용하게 됩니다.

0개의 댓글