IT/Java

[Java] interface method

Huitopia 2024. 3. 12. 00:32
728x90

abstract method

[public abstract] 리턴타입 메소드명(매개변수, ...);
  • 추상 메소드는 리턴 타입, 메소드명, 매개변수만 기술되고 중괄호를 붙이지 않는 메소드이다.
  • public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙는다.
  • 내부의 모든 메서드는 추상 메소드로 정의한다.
  • 구현 클래스에서 추상 메소드 재정의 시 public보다 더 낮은 접근 제한으로 재정의할 수 없다.

 

default method

[public] default 리턴타입 메소드명(매개변수, ...) {...}
  • default 메소드를 추가하면 구현 클래스에서 필수로 메소드를 재정의 하지 않아도 된다.
  • 추상 메소드는 실행부(중괄호 {})가 없지만, 디폴트 메소드는 실행부가 있다.
  • 실행부에서는 상수 필드를 읽거나, 추상 메소드를 호출하는 코드를 작성할 수 있다.
  • 재정의시 public 접근 제한자를 붙이고, default 키워드를 생략한다.
  • 인터페이스 구현 후, 수정 과정에서 인터페이스 모든 구현체에게 수정 없이 광역으로 함수를 만들어주고 싶을 때 사용한다.

 

static method

[public | private] static 리턴타입 메소드명(매개변수, ...) {...}
  • 정적 메소드는 구현 객체가 없어도 인터페이스만으로 호출 가능하다.
  • 정적 메소드의 실행부를 작성할 때 상수 필드를 제외한 구현 객체가 필요한 인스턴스 메소드인 추상 메소드, 디폴트 메소드, private 메소드 등을 호출할 수 없다.

 

private method

구분 설명
private method 구현 객체가 필요한 메소드
private static method 구현 객체가 필요 없는 메소드
  • 로직을 공통화하고 재사용하기 위해 자바9 버전에서 추가된 메소드이다.
  • 인터페이스 내부에서만 돌아가는 코드로 구현한 클래스에서 사용하거나 재정의할 수 없다.
  • private 메소드는 default 메소드 안에서만 호출이 가능하며, private static 메소드는 staitc 메소드 안에서도 호출이 가능하다.
  • private 메소드는 디폴트와 정적 메소드들의 중복 코드를 줄여준다.

예제 코드

더보기
package ch08.sec07;

public interface Service {
    // 디폴트 메소드
    default void defaultMethod1() {
        System.out.println("Service.defaultMethod1");
        defaultCommon();
    }

    default void defaultMethod2() {
        System.out.println("Service.defaultMethod2");
        defaultCommon();
    }

    // private 메소드
    private void defaultCommon() {
        System.out.println("defaultMethod 중복 A");
        System.out.println("defaultMethod 중복 B");
    }

    // 정적 메소드
    static void staticMethod01() {
        System.out.println("Service.staticMethod01");
        staticCommon();
    }

    static void staticMethod02() {
        System.out.println("Service.staticMethod02");
        staticCommon();
    }

    // private 메소드
    private static void staticCommon() {
        System.out.println("staticMethod 중복 C");
        System.out.println("staticMethod 중복 D");
    }
}
package ch08.sec07;

public class ServiceExample {
    public static void main(String[] args) {
        // 인터페이스 변수 선언과 구현 객체 대입
        Service service = new ServiceImpl();
        // 디폴트 메소드
        service.defaultMethod1();
        System.out.println();
        service.defaultMethod2();
        System.out.println();
        // 정적 메소드
        Service.staticMethod01();
        System.out.println();
        Service.staticMethod02();
    }
}
package ch08.sec07;

public class ServiceImpl implements Service {
}

 

728x90