JAVA/BASIC

자바(JAVA) 인터페이스 디폴트메소드와 정적메소드

유혁스쿨 2023. 4. 12. 01:01
728x90
반응형

인터페이스

인터페이스란 객체의 사용 방법을 정의한 타입이다.

인터페이스는 객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다.

특히 자바 8에서는 함수적 인터페이스의 구현 객체를 생성하기 때문에 인터페이스의 중요성이 더욱 커졌다.

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

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

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

 

개발 코드가 직접 객체의 메소드를 호출하면 간단한데, 왜 중간에 인터페이스를 두는지 의문점이 생긴다.

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

인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴값이 다를 수 있다.

따라서 개발 코드 측면에서는 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있다는 장점을 가지게 된다.

 

클래스는 필드, 생성자, 메소드를 구성 멤버로 가지는데 비해, 인터페이스는 상수와 메소드만을 구성 멤버로 가진다.

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

자바 7 이전까지는 인터페이스의 메소드는 실행 블록이 없는 추상 메소드로만 선언이 가능했으나, 자바 8 부터는 디폴트 메소드와 정적 메소드도 선언이 가능하다.

 

 

디폴트 메소드

자바 8에서 추가된 인터페이스의 새로운 멤버이다.

형태는 클래스의 인스턴스 메소드와 동일하며, default키워드가 리턴 타입 앞에 붙는다.

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

public interface defaultIf{
    public default void defaultMethod() {
		//코드 작성
    }
}

위에서 말하는 default는 클래스의 접근지정자와 햇갈릴 수 있으나 전혀 다른 의미를 갖는다.

클래스의 default 접근지정자는 클래스의 접근을 제한하는 기능을 가지고 있으며, 생략이 가능하지만 메소드에 사용되는 키워드로서의 의미는 다르다.

 

디폴트 메소드는 일반적인 클래스에 선언되는 메소드의 형태로서 인터페이스에 선언되지만, 인터페이스에서 바로 사용할 수 없다.

디폴트 메소드는 추상 메소드가 아닌 인스턴스 메소드이므로 구현 객체가 있어야 사용할 수 있다.

인터페이스의 모든 구현 객체가 가지고 있는 기본 메소드라고 생각하면 된다.

그러나 어떤 구현 객체는 디폴트 메소드의 내용이 맞지 않아 수정이 필요할 수도 있다.

구현 클래스를 작성할 때 디폴트 메소드를 재정의(오버라이딩)해서 자신에게 맞게 수정하면 디폴트 메소드가 호출될 때 자신을 재정의 한 메소드가 호출된다.

 

 

디폴트 메소드의 필요성 - 인터페이스 확장

디폴트 메소드의 경우 선언은 인터페이스에서 하고, 사용은 구현 객체를 통해 한다는 것이 어색해 보인다.

디폴트 메소드는 모든 구현 객체에서 공유하는 기본 메소드 처럼 보이지만 사실으 인터페이스에서 디폴트 메소드를 허용한 다른 이유가 있다.

그 이유로는 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위해서이다.

기존 인터페이스의 이름과 추상 메소드의 변경 없이 디폴트 메소드만 추가할 수 있기 때문에 이전에 개발한 구현 클래스를 그대로 사용할 수 있으면서 새롭게 개발하는 클래스는 디폴트 메소드를 활용할 수 있다.

 

정리해 보자면 디폴트 메소드는 인터페이스를 구현하는 구현체들에서 공통적으로 사용되는 필수 기능이며, 구현체에서 디폴트 메소드를 오버라이딩 하지 않는 전제하에 모두 동일한 기능을 기본적으로 사용할수 있게끔 미리 정의하는 메소드이다. 구현체의 객체를 통해서만 접근이 가능하며 이러한 특징을 통해 인터페이스의 메소드 하나만 수정해서 여러 구현 객체들의 동일한 기능을 한번에 수정할수 있다는 유용함과 공통적인 기능이라는 점에서 코드 반복을 축소키는 장점이 있다.

 

정적 메소드

디폴트 메소드와 마찬가지로 자바 8에서 추가된 인터페이스의 새로운 멤버이다.

형태는 클래스의 정적 메소드와 완전히 동일하며, 디폴트 메소드처럼 실행 블록을 가지며, public 특성을 갖기 때문에 public을 생략하더라도 자동으로 컴파일 과정에서 붙게 된다.

public class Example {
    public static void main(String[] args) {
        ExmInterface.staticMethod();
    }
}

interface ExamInteface() {
    public static void staticMethod(){
        //실행내용
    }
}

디폴트 메소드와의 차이점으로는 인터페이스로 바로 호출이 가능하기 때문에 조금 더 유연하게 사용할 수 있다.

 

public class Example {
    public static void main(String[] args) {
        ExamClass ec = new ExamClass();
        ec.defaultMethod("가 호출되었습니다"); // "helper Static Method가 호출되었습니다" 출력
    }
}

class ExamClass implements ExamInteface {}

interface ExamInteface {
    static String staticMethod() {
        return "helper Static Method"
    }
    
    default String defaultMethod(String param) {
        return staticMethod() + param;
    }
}

static 특성중 하나인 인터페이스 내에서 바로 호출 또한 가능하므로 디폴트메소드의 helper메소드로서 사용된다.

다시말해 인터페이스 내부적으로 필요한 것을 정의해 두고 사용하는데 목적이 있다고 추측할 수 있다.

728x90
반응형