-
[Java] interfaceIT/개발(자바, 서블릿, 스프링 등) 2019. 12. 10. 01:42
인터페이스란 여러 프로그램에서 사용할 멤버를 일관되게 하기 위한 기술 명세이다. 이렇게 기준을 정하면 사용자는 일관된 방법으로 프로그램을 사용할 수 있다.
필드 선언
실제 존재하는 객체가 아니므로 인터페이스로 객체를 생성할 수 없다. 객체를 생성할 수 없는 인터페이스에서 필드를 선언한다는 것은 객체 생성과 상관없이 사용할 수 있는 static으로 선언해야 한다는 의미이다. 인터페이스는 특이한 객체라서 별도의 선언이 없어도 컴파일할 때 필드 선언부에 다음에 세가지 제어자가 자동으로 추가된다. public static final
메서드 선언
인터페이스에서 선언하는 메서드는 실제 내용을 구현할 목적이 아니라 인터페이스 통일을 목적으로 선언하는 것이므로 본문을 구현하지 않는다. 그래서 인터페이스에서 선언하는 메서드는 컴파일할 때 public abstract 제어자가 자동으로 추가된다.
default 메서드 선언
자바7까지는 인터페이스에서는 public static final 필드와 public abstract 메서드 선언만 가능했다. 따라서 인터페이스에서 본문을 갖는 메서드는 존재할 수 없었다. 그러나 자바8부터는 default, static 메서드를 선언할 수 있게 됨으로써 본문을 갖는 메서드가 인터페이스에 존재할 수 있게 되었다.
default 메서드는 인터페이스를 사용하는 모든 클래스에서 공통으로 갖는 기능을 구현할 목적으로 사용한다. public 접근 제한자는 생략하면 컴파일할 때 자동으로 추가된다.
여러 객체 간의 통일된 인터페이스가 필요할 때 공통적인 기능을 구현한 메서드가 포함된 경우는 abstract 클래스로 선언해서 사용해야 했다. 그런데 이 방법에는 문제가 있었다. 자바는 단일 상속만 되기 때문에 기존에 다른 클래스를 상속받고 있다면 추가로 상속할 수 없다. 이런 점을 보완하기 위해 자바8부터 default 메서드를 지원한다. 인터페이스는 여러 개 구현이 가능하기 때문이다.
static 메서드 선언
static 메서드는 프로그램 시작 시 메모리에 사용 준비가 완료되므로 인스턴스 생성과 상관없이 바로 사용할 수 있다. static 메서드 선언 시 public 접근 제한자를 생략하면 컴파일 시 자동으로 추가된다. 인터페이스에 스태틱 메서드를 선언하는 목적은 해당 인터페이스를 구현하고 있는 모든 객체에서 자주 사용하는 유용한 기능을 제공하는 데 있다.
private 메서드 선언
인터페이스에 본문을 갖는 private 메서드를 선언하는 기능은 자바 9에서 추가되었다. 자바 8부터 default 메서드 선언이 가능하여 인터페이스도 메서드 본문을 구현할 수 있는데 private 메서드는 동일한 인터페이스에 선언된 default 메서드에서만 사용할 목적으로 본문을 구현하는 메서드이다.
Messenger interface public interface Messenger { public static final int MIN_SIZE = 1; public static final int MAX_SIZE = 104857600; public abstract String getMessage(); public abstract void setMessage(String msg); public default void setLogin(boolean login){ log(); if(login) { System.out.println("로그인 처리합니다."); } else { System.out.println("로그아웃 처리합니다."); } } public static void getConnection() { System.out.println("network에 연결합니다."); } private void log(){ System.out.println("start job!"); } }
'IT > 개발(자바, 서블릿, 스프링 등)' 카테고리의 다른 글
[Java] 자바 기본 API(Object 클래스) (0) 2020.01.18 [Java] 자바 API 문서 (0) 2020.01.18 [Java] 추상 메서드와 추상 클래스 개념(abstract) (0) 2019.12.10 [Java] final 키워드 개념 정리 (0) 2019.12.09 [Java] 상속 개념과 사용법 그리고 super() 문으로 부모 인스턴스 초기화하는 방법 (0) 2019.12.09