Java 인터페이스에서 정적 메서드 정의
-
Java
인터페이스
의정적
메소드 -
인터페이스
에서정적
메소드 사용의 중요성 -
인터페이스
의정적
메소드에 대한 규칙 -
Java 8 이전 인터페이스에
정적
메서드가 없는 이유 -
정적
메서드를 재정의할 수 없는 이유
이 자습서는 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 인터페이스에서 정적
메소드를 사용하면 다음과 같은 이점을 얻을 수 있습니다.
인터페이스
의정적
메서드는 하위 클래스 또는 하위 인터페이스가 상속하거나 재정의하지 않기를 원하는 동작을 캡슐화합니다.- Java
인터페이스
의 이러한정적
메서드는 클래스의 특정 구현 유형에 제한되지 않는 재사용 가능한 유틸리티를 개발하는 데 유용합니다.
인터페이스
의 정적
메소드에 대한 규칙
다음 섹션에서는 정적
방법을 사용할 때 위의 이점에 대한 규칙을 보여줍니다.
인터페이스의 기본 메서드는 기본 동작에 대한 지침을 보유하고 있으며 구현 클래스는 이를 재정의하거나 그대로 상속하여 보다 구체적인 지침을 제공하도록 선택할 수 있습니다. 기본 메서드와 유사하게 정적
메서드에는 동작에 대한 본문(명령 집합)이 포함되어 있지만 구현 클래스는 이전에 배운 인터페이스
의 정적
메서드를 상속하거나 재정의할 수 없습니다.
Java 인터페이스
에서 정적
메소드를 사용하는 사람은 다음 규칙을 기억해야 합니다.
- 이러한 메서드에는 본문이 있어야 합니다.
인터페이스
이름을 사용하여 이러한정적
메소드만 실행할 수 있습니다.- 이러한 메서드는 메서드 선언에
정적
한정자가 있어야 합니다. 지정하지 않으면 기본적으로public
이 됩니다. 원할 경우 “비공개"로 만들 수도 있습니다. - 다른
추상
또는 기본 메소드를 호출할 수 없습니다. - 하위 클래스 또는 하위 인터페이스는 이러한
정적
메서드를 재정의하거나 상속할 수 없습니다.
이제 이 시점에서 두 가지 질문이 떠오를 수 있습니다.
- 옛날(Java 8이 출시되기 전)에는 왜
정적
메서드를 사용할 수 없었습니까? - 왜
정적
메서드를 재정의할 수 없습니까?
이 두 질문에 대한 답을 찾아봅시다.
Java 8 이전 인터페이스에 정적
메서드가 없는 이유
Java 8이 출시되기 전에 Java 인터페이스에 “정적” 메서드가 없었던 강력한 주요 기술적 원인은 없었습니다. 이러한 “정적” 메서드는 작은 언어 업데이트 또는 변경으로 간주되었으며 Java에 추가하라는 공식 제안이 있었습니다. 7, 그러나 나중에 몇 가지 합병증으로 인해 삭제되었습니다.
마지막으로 Java 8에서는 인터페이스의 정적
메서드를 소개했습니다. Java 8부터는 기본 구현으로 재정의 가능한 인스턴스 함수/메서드에 대해서도 배웠습니다.
그들은 여전히 인스턴스 필드를 포함하지 않았다는 것을 기억하십시오. 이러한 기능은 [여기](JSR 335 Part H)에서 읽을 수 있는 lambda
표현 지원의 일부입니다.
정적
메서드를 재정의할 수 없는 이유
정적
메서드는 컴파일 시간에 해결됩니다. 동적 디스패치는 컴파일러가 객체의 구체적인 유형을 결정할 수 없는 인스턴스 메서드에 대해 의미가 있습니다. 따라서 호출할 메서드를 확인할 수 없습니다.
그러나 정적
메서드를 실행하려면 클래스가 필요합니다. 특정 클래스는 “정적으로”(컴파일 타임에) 알려지기 때문에 동적 디스패치가 필요하지 않습니다.
모든 클래스에 메서드의 서명(이름 및 매개 변수 유형)을 메서드를 구현하기 위한 실제 코드 조각에 매핑하는 HashTable
이 있다고 가정합니다. VM이 인스턴스에서 메서드를 실행하려고 하면 해당 클래스에 대한 개체를 쿼리하고 클래스 테이블에서 요청된 서명을 찾습니다.
메서드 본문이 발견되면 호출됩니다. 그렇지 않으면 조회가 반복되는 클래스의 상위 클래스를 얻습니다. 이 프로세스는 메서드를 찾거나 상위 클래스가 더 이상 남지 않을 때까지 계속됩니다(NoSuchMethodError
생성).
각 테이블에 하위 클래스에 대한 항목과 동일한 메서드 서명에 대한 수퍼 클래스가 있는 경우 하위 클래스의 버전이 먼저 발견되고 수퍼 클래스의 버전은 사용되지 않습니다. 이것이 재정의
입니다.
개체 인스턴스를 건너뛰고 하위 클래스부터 시작한다고 가정하면 위와 같이 해결이 진행되어 일종의 재정의 가능한
정적
메서드를 제공할 수 있습니다. 이 해결 방법은 컴파일 시간에만 발생할 수 있습니다.
그러나 우리는 컴파일러가 해당 클래스에 대해 지정되지 않은 유형의 개체를 쿼리하기 위해 런타임까지 기다리는 대신 알려진 클래스에서 시작한다는 것을 알고 있습니다. 따라서 정적
메서드를 재정의할 필요가 없습니다.