Java 인터페이스에서 정적 메서드 정의

Mehvish Ashiq 2023년10월12일
  1. Java 인터페이스정적 메소드
  2. 인터페이스에서 정적 메소드 사용의 중요성
  3. 인터페이스정적 메소드에 대한 규칙
  4. Java 8 이전 인터페이스에 정적 메서드가 없는 이유
  5. 정적 메서드를 재정의할 수 없는 이유
Java 인터페이스에서 정적 메서드 정의

이 자습서는 Java 인터페이스에서 정적 메서드를 갖는 규칙을 나열하고 이를 정의하는 방법과 이를 재정의할 수 없는 이유를 보여줍니다. 또한 Java 8 이전의 인터페이스에 정적 메서드가 없는 이유도 살펴보겠습니다.

Java 인터페이스정적 메소드

Java 인터페이스의 정적 메소드로 이동하기 전에 이 인터페이스구현하는 클래스에 정의된 하나 이상의 추상 메소드(본문이 없는 메소드)를 포함하는 인터페이스에 대해 아는 것이 중요합니다. .

이러한 abstract 메소드는 public 수정자를 작성하는지 여부에 관계없이 public 메소드입니다.

예제 코드:

public interface Messages {
  // public & abstract
  public void display();
}

public class Test implements Messages {
  // implementation of abstract method
  public void display() {
    System.out.println("Hi! Welcome to the DelftStack");
  }

  public static void main(String[] args) {
    Test test = new Test();
    test.display();
  }
}

출력:

Hi! Welcome to the DelftStack

display()라는 추상 메서드는 공용 메서드이므로 display() 메서드를 실행하려면 Test 클래스를 인스턴스화해야 합니다.

반면에 정적 메서드는 정의된 클래스 자체와 연결되며 이러한 정적 메서드를 사용하기 위해 클래스를 인스턴스화할 필요가 없습니다. Java 8부터는 정적 인터페이스 메서드를 사용할 수 있습니다.

이제 인터페이스에 특정 정적 메소드에 필요한 모든 지침과 완전한 본문이 있습니다. 정적 메서드는 인스턴스 수준이 아닌 클래스 수준에서만 액세스할 수 있음을 기억하십시오.

따라서 다음과 같이 정적 메서드에 액세스할 수 있습니다.

예제 코드:

public interface Messages {
  // static method
  static void display() {
    System.out.println("Hello! Nice to meet you");
  }
}

public class Test {
  public static void main(String[] args) {
    Messages.display();
  }
}

출력:

Hello! Nice to meet you

문제는 정적 메서드를 재정의할 수 있습니까?입니다. 아니요, 정적 메서드를 재정의할 수 없습니다. 그렇지 않으면 컴파일 오류가 발생합니다.

또한 정적 메서드가 숨겨져 있기 때문에 구현 클래스의 인스턴스를 통해 호출할 수 없습니다. 컴파일 오류를 생성하는 다음 예를 참조하십시오.

예제 코드:

public interface Messages {
  static void display() {
    System.out.println("Hello! Nice to meet you");
  }
}

public class Test implements Messages {
  @Override
  public void display() {
    System.out.println("Override");
  }
  public static void main(String[] args) {
    Test test = new Test();
    test.display();
  }
}

다음은 위의 코드 펜스에서 생성된 오류 설명입니다.

출력:

Test.java:25: error: method does not override or implement a method from a supertype
  @Override
  ^
1 error

인터페이스에서 정적 메소드 사용의 중요성

Java 인터페이스에서 정적 메소드를 사용하면 다음과 같은 이점을 얻을 수 있습니다.

  1. 인터페이스정적 메서드는 하위 클래스 또는 하위 인터페이스가 상속하거나 재정의하지 않기를 원하는 동작을 캡슐화합니다.
  2. Java 인터페이스의 이러한 정적 메서드는 클래스의 특정 구현 유형에 제한되지 않는 재사용 가능한 유틸리티를 개발하는 데 유용합니다.

인터페이스정적 메소드에 대한 규칙

다음 섹션에서는 정적 방법을 사용할 때 위의 이점에 대한 규칙을 보여줍니다.

인터페이스의 기본 메서드는 기본 동작에 대한 지침을 보유하고 있으며 구현 클래스는 이를 재정의하거나 그대로 상속하여 보다 구체적인 지침을 제공하도록 선택할 수 있습니다. 기본 메서드와 유사하게 정적 메서드에는 동작에 대한 본문(명령 집합)이 포함되어 있지만 구현 클래스는 이전에 배운 인터페이스정적 메서드를 상속하거나 재정의할 수 없습니다.

Java 인터페이스에서 정적 메소드를 사용하는 사람은 다음 규칙을 기억해야 합니다.

  1. 이러한 메서드에는 본문이 있어야 합니다.
  2. 인터페이스 이름을 사용하여 이러한 정적 메소드만 실행할 수 있습니다.
  3. 이러한 메서드는 메서드 선언에 정적 한정자가 있어야 합니다. 지정하지 않으면 기본적으로 public이 됩니다. 원할 경우 “비공개"로 만들 수도 있습니다.
  4. 다른 추상 또는 기본 메소드를 호출할 수 없습니다.
  5. 하위 클래스 또는 하위 인터페이스는 이러한 정적 메서드를 재정의하거나 상속할 수 없습니다.

이제 이 시점에서 두 가지 질문이 떠오를 수 있습니다.

  1. 옛날(Java 8이 출시되기 전)에는 왜 정적 메서드를 사용할 수 없었습니까?
  2. 정적 메서드를 재정의할 수 없습니까?

이 두 질문에 대한 답을 찾아봅시다.

Java 8 이전 인터페이스에 정적 메서드가 없는 이유

Java 8이 출시되기 전에 Java 인터페이스에 “정적” 메서드가 없었던 강력한 주요 기술적 원인은 없었습니다. 이러한 “정적” 메서드는 작은 언어 업데이트 또는 변경으로 간주되었으며 Java에 추가하라는 공식 제안이 있었습니다. 7, 그러나 나중에 몇 가지 합병증으로 인해 삭제되었습니다.

마지막으로 Java 8에서는 인터페이스의 정적 메서드를 소개했습니다. Java 8부터는 기본 구현으로 재정의 가능한 인스턴스 함수/메서드에 대해서도 배웠습니다.

그들은 여전히 인스턴스 필드를 포함하지 않았다는 것을 기억하십시오. 이러한 기능은 [여기](JSR 335 Part H)에서 읽을 수 있는 lambda 표현 지원의 일부입니다.

정적 메서드를 재정의할 수 없는 이유

정적 메서드는 컴파일 시간에 해결됩니다. 동적 디스패치는 컴파일러가 객체의 구체적인 유형을 결정할 수 없는 인스턴스 메서드에 대해 의미가 있습니다. 따라서 호출할 메서드를 확인할 수 없습니다.

그러나 정적 메서드를 실행하려면 클래스가 필요합니다. 특정 클래스는 “정적으로”(컴파일 타임에) 알려지기 때문에 동적 디스패치가 필요하지 않습니다.

모든 클래스에 메서드의 서명(이름 및 매개 변수 유형)을 메서드를 구현하기 위한 실제 코드 조각에 매핑하는 HashTable이 있다고 가정합니다. VM이 인스턴스에서 메서드를 실행하려고 하면 해당 클래스에 대한 개체를 쿼리하고 클래스 테이블에서 요청된 서명을 찾습니다.

메서드 본문이 발견되면 호출됩니다. 그렇지 않으면 조회가 반복되는 클래스의 상위 클래스를 얻습니다. 이 프로세스는 메서드를 찾거나 상위 클래스가 더 이상 남지 않을 때까지 계속됩니다(NoSuchMethodError 생성).

각 테이블에 하위 클래스에 대한 항목과 동일한 메서드 서명에 대한 수퍼 클래스가 있는 경우 하위 클래스의 버전이 먼저 발견되고 수퍼 클래스의 버전은 사용되지 않습니다. 이것이 재정의입니다.

개체 인스턴스를 건너뛰고 하위 클래스부터 시작한다고 가정하면 위와 같이 해결이 진행되어 일종의 재정의 가능한 정적 메서드를 제공할 수 있습니다. 이 해결 방법은 컴파일 시간에만 발생할 수 있습니다.

그러나 우리는 컴파일러가 해당 클래스에 대해 지정되지 않은 유형의 개체를 쿼리하기 위해 런타임까지 기다리는 대신 알려진 클래스에서 시작한다는 것을 알고 있습니다. 따라서 정적 메서드를 재정의할 필요가 없습니다.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook