JAVA 입문 - 인터페이스 요소
지난 글: [프로그래밍 언어/JAVA] - JAVA 입문 - 인터페이스와 다형성
인터페이스 상수
인터페이스는 추상 메서들 이루어지므로 인스턴스를 생성할 수 없으며 멤버 변수도 사용할 수 없다. 하지만 인터페이에 일반 변수처럼 변수를 선언해도 오류가 나지 않는다. 그 이유는 인터페이스에 선언한 변수를 컴파일하면 상수로 변환되기 때문이다.
디폴트 메서드와 정적 메서드
자바 8부터 제공한 디폴트 메서드와 정적 메서드 기능. 디폴트 메서드는 인터페이스에서 구현 코드까지 작성한 메서드이다. 인터페이스를 구현한 클래스에 기본적으로 제공할 메서드인 것이다. 정적 메서드는 인스턴스 생성과 상관없이 사용할 수 있는 메서드이다. 하지만 디폴트 메서드나 정적 메서드를 추가했다 해서 인터페이스로 인스턴스를 생성할 수는 없다. 디폴트 메서드와 정적 메서드의 사용법을 알아보자.
디폴트 메서드
디폴트 메서드는 기본으로 제공되는 메서드이며 인터페이스에서 구현하지만 이후 인터페이스를 구현한 클래스가 생성되면 그 클래스에서 사용할 기본 기능이다. 디폴트 메서드는 default 예약어를 사용한다. 디폴트 메서드는 일반 메서드와 똑같이 구현하고, 메서드 자료형 앞에 default만 써주면 된다. 예로 지난 글에서 만든 Calc 인터페이스에 디폴트 메서드를 구현해보자.

새로 구현한 description( ) 디폴트 메서드를 사용하려면 아래 코드와 같이 Calculator 클래스를 생성해야한다.


디폴트 메서드는 인터페이스에 이미 구현되어 있으므로 인터페이스를 구현한 Calculator 클래스에서 코드를 구현할 필요가 없다.
디폴트 메서드 재정의하기
만약 이미 인터페이스에 구현되어 있는 디폴트 메서드가 새로 생성한 클래스에서 원하는 기능과 맞지 않는다면, 하위 클래스에서 디폴트 메서드를 재정의할 수 있다.

사진처럼 클래스 파일의 소스 코드에서 마우스 우클릭을 하고 [source - Override/implement Methods ...]을 클릭하면

이런 창이 뜨는데, description( ) 상자에 체크를 하고 OK를 누르면 메서드를 재정의할 수 있는 코드가 자동으로 추가된다.
정적 메서드
정적 메서드는 static 예약어를 사용하여 선언하며 클래스 생성과 무관하게 사용 가능하다. 정적 메서드를 사용할 때는 인터페이스 이름으로 직접 참조하여 사용한다. 예로 Calc 인터페이스에 매개변수로 전달된 배열의 모든 요소 값을 더하는 정적 메서드 total( ) 을 추가해보자.

메서드 자료형 앞에 static을 사용했다. 정적 메서드를 사용하는 테스트 프로그램을 다음과 같이 작성한다.


18행을 보면 Calc.total(arr)처럼 인터페이스 이름으로 직접 참조하여 정적 메서드를 호출했다.
private 메서드
자바 9부터 인터페이스에 private 메서드를 구현할 수 있다고 한다. private 메서드는 인터페이스를 구현한 클래스에서 사용하거나 재정의할 수 없다. 따라서 기존에 구현된 코드를 변경하지 않고 인터페이스를 구현한 클래스에서 공통으로 사용하는 경우에 private 메서드로 구현하면 코드 재사용성을 높일 수 있다고 한다. 또한 클라이언트 프로그램에 제공할 기본 기능을 private 메서드로 구현하기도 한다고 한다. private 메서드는 코드를 모두 구현해야 하므로 추상 메서드에 private을 사용할 수는 없지만 static 예약어와 함께 사용할 수 있다고 한다.
참고 서적: 자바 프로그래밍 입문 - 박은종