
인터페이스 정의하는 방법
인터페이스 구현하는 방법
인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
인터페이스 상속
인터페이스의 기본 메소드 (Default Method), 자바 8
인터페이스의 static 메소드, 자바 8
인터페이스의 private 메소드, 자바 9
자바의 인터페이스(interface)?
객체의 사용방법을 정의해둔 타입객체의 교환성을 높여 다형성을 구현하는데 중요한 역할//interface 정의 방법
//interface 키워드
[public] interface 인터페이스명 { }
//ex
public interface TV { }
인터페이스의 구성 멤버 : 상수, 메소드 (인터페이스는 객체 생성이 안되므로 생성자를 가질 수 없음)
클래스의 구성 멤버 : 필드, 생성자, 메소드
자바 7 이전까지는 인터페이스의 메소드는 실행 블록이 없는 추상 메소드르로만 선언이 가능했지만, 자바 8부터 메소드 실행 블록 작성이 가능한 디폴트 메소드(default method)와 정적 메소드(static method) 선언이 가능해졌다.
interface 인터페이스명 {
//상수
타입 상수명 = 값;
//추상 메소드
타입 메소드명(매개변수, ,,,);
//디폴트 메소드
default 타입 메소드명(매개변수, ,,,) {}
//정적 메소드
static 타입 메소드명(매개변수, ,,,) {}
}
생략하더라도 자동적으로 컴파일 과정에서 붙음.
[public static fianl] 타입 상수명 = 값;
상수명은 대문자로 작성하되, 서로 다른 단어는 언더바( _ )로 연결하는 것이 관례
public interface TV {
public static fianl int MAX_CHANNEL = 100;
int MIN_CHANNEL = 0; //public static final 생략 가능
}
상속은 확장하는 의미로 사용하였다면 인터페이스는 구현하는 의미이기 때문에 implements를 사용한다.
구현 클래스를 만들어 사용하는 것이 일반적이지만 일회성의 구현 객체를 만들기 위해서 클래스를 생성하는 것 또한 비효율적이기 때문에 구현 객체를 만들 수 있는 방법 또한 제공하고 있다.
이것은 "익명 구현 객체"라고 한다.
다형성을 이용해서 자식 클래스 인스턴스가 부모 클래스 타입으로 참조가 가능하듯이 인터페이스에서도 해당 클래스 타입을 참조할 수 있다.
public class Cat implements Animal {
@Override
public String getName(){
String name = "고양이";
return name;
}
}
public class AnimalMain {
public static void main(String[] args){
Cat cat = new Cat();
Dog dog = new Dog();
printName(cat);
printName(dog);
}
public static void printName(Animal animal){
System.out.println(animal.getName());
}
}
다형성을 이용해서 printName 메소드에 Animal 타입으로 파라미터를 받음으로서 Cat, Dog 객체의 이름을 출력할 수 있다.
인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행.
인터페이스의 메소드는 실행 블록이 없는 추상 메소드로 선언.
인터페이스에 선언된 추상 메소드는 모두 public abstract의 특성을 갖기 때문에
이를 생략해도 자동적으로 컴파일 과정에서 붙는다.
추상 메소드 : 리턴 타입, 메소드명, 매개변수만 기술하며 중괄호{} 를 붙이지 않는 메소드
public interface TV {
//상수
int MAX_CHANNEL = 1000;
int MIN_CHANNEL = 0;
//추상 메소드
public abstract void turnOn();
public abstract void turnOff();
void sethannel(int channelNum); //public abstract 생략가능
}
인터페이스를 쉽게 바꾸어서 미래에 프로그램이 쉽게 변화할 수 있는 환경을 제공하기 위함
default 키워드를 return 타입 앞에 표시.
public 특성을 갖기 때문에 이를 생략해도 자동적으로 컴파일 과정에 붙게 됨
[public] default 리턴타입 메소드명(매개변수, ..) {}
public interface TV {
//상수
int MAX_CHANNEL = 1000;
int MIN_CHANNEL = 0;
//추상 메소드
void turnOn();
void turnOff();
void setChannel(int channelNum);
//디폴트 메소드
default void setMute(boolean mute){
if(mute){
System.out.println('무음 처리');
}else{
System.out.println('무음 해제');
}
}
}
형태는 클래스의 정적 메소드와 동일 하지만 public 특성을 갖기 때문에
public 을 생략하더라도 자동으로 컴파일 과정에 붙음
[public] static 리턴타입 메소드명(매개변수, ...) {...}
public interface TV {
//상수
int MAX_CHANNEL = 1000;
int MIN_CHANNEL = 0;
//추상 메소드
void turnOn();
void turnOff();
void setChannel(int channelNum);
//디폴트 메소드
default void setMute(boolean mute){
if(mute){
System.out.println("무음 처리");
}else{
System.out.println("무음 해제");
}
}
//정적 메소드
static void printMaxChannel(){
System.out.println("채녈은 "+MAX_CHANNEL+"번까지 존재합니다.");
}
}
자바 8에서 인터페이스 메소드는 특정 기능을 처리하는 내부 메소드도 외부에 공개되는 public method로 만들어야 하는 단점이 있었다.
하지만 인터페이스를 구현하는 다른 인터페이스 또는 클래스가 해당 메소드에 액세스하거나 상속 하는 것을 원하지 않는 경우가 있음.
이를 위해 자바 9에서는 인터페이스에 메소드에 private를 사용할 수 있도록 함
public interface TV {
/* ~ 생략 ~ */
//private 메소드
private int getMaxChannel(){
return MAX_CHANNEL;
}
private static int getMinChannel(){
return MIN_CHANNEL;
}
}
참고사이트