목차
- 인터페이스 정의하는 방법
- 인터페이스 구현하는 방법
- 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
- 인터페이스 상속
- 인터페이스의 기본 메소드 (Default Method), 자바 8
- 인터페이스의 static 메소드, 자바 8
- 인터페이스의 private 메소드, 자바 9
1. 인터페이스 정의하는 방법
public interface 인터페이스명 {
자료형 상수명 = 값; // 인터페이스에서 변수는 기본적으로 상수이다. (public static final 생략 가능)
반환형 메소드명(); // 인터페이스의 abstract 메소드는 기본적으로 public 접근지시자를 갖는다.(public abstract 키워드 생략 가능)
// 자바 8부터 추가된 default 메소드는 인터페이스에서 구현할 수 있다. 자세한 내용은 하단에서 설명하겠습니다.
default 반환형 메소드명() {
}
// 자바 8부터 추가된 static 메소드는 인터페이스에서 구현할 수 있다.
static 반환형 메소드명() {
}
}
인터페이스를 정의하는 방법은 상기와 같다. 인터페이스는 기본적으로 상수 필드와 추상메소드를 가질 수 있다.
일반 인스턴스 변수는 가질 수 없다. 즉 public static final로 시작해야하며, 해당 키워드는 인터페이스에서 너무나 당연한 것이므로 생략이 가능하다. 또한 인터페이스에서는 구현된 메소드를 가질 수 없다.(단, 자바 8 부터 default 메소드가 추가되어 default 키워드를 추가하면 가능하다.)
public interface Bear {
int LEG = 4; // 인터페이스에서 변수는 기본적으로 상수이다. (public static final 생략 가능)
void print(); // 인터페이스의 abstract 메소드는 기본적으로 public 접근지시자를 갖는다.(public abstract 키워드 생략 가능)
}
2. 인터페이스 구현하는 방법
인터페이스를 클래스에서 구현하는 방법은 다음과 같다.
public class Panda implements Bear {
private String name;
public Panda() {}
public Panda(String name) {
this.name = name;
}
// 추상메소드의 구현
@Override
public void print() {
System.out.println(name);
}
// 해당 메소드 정보는 클래스에만 존재하므로 Bear 인터페이스를 통하여 Panda 구현체를 사용할 때 해당 메소드를 접근할 수 없다.
public String getName() {
return name;
}
// 해당 메소드 정보는 클래스에만 존재하므로 Bear 인터페이스를 통하여 Panda 구현체를 사용할 때 해당 메소드를 접근할 수 없다.
public void setName(String name) {
this.name = name;
}
}
3. 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
본격적으로 구현체를 사용해보자. 인터페이스에 선언 및 정의된 메소드에 대해서는 구현체에서 사용이 가능하다. 하지만, 클래스만 가지고 있는 메소드의 경우는 인터페이스 타입의 변수에서 사용이 불가능하다.
public class Main {
public static void main(String[] args) {
Bear bear = new Panda("팬더");
System.out.println(Bear.LEG); // 4
bear.print(); // 팬더 출력
//bear.getName(); // 인터페이스에는 getName() 이라는 메소드 정보가 없으므로 사용 불가
}
}
4. 인터페이스 상속
인터페이스도 상속이 가능하다. 인터페이스에서 인터페이스를 상속할 때는 extends 키워드를 사용한다.
public interface 인터페이스명 extends 상위인터페이스명 [... 복수 가능] {
// 구현할 상수 및 메소드 정의
}
간단한 샘플은 다음과 같다.
public interface WeBear extends Bear {
void walk(); // 위베어베어스는 직립보행이 가능하다.
}
5. 인터페이스의 기본 메소드 (Default Method), 자바 8
자바 8부터 default 메소드가 추가되었다. 기존에 자바에서는 다중 상속을 허용하지 않았는데, 하위 호환성을 유지하면서 다중 상속과 비슷한 효과를 내기 위해서 인터페이스에 이미 구현된 기본 메소드를 추가할 수 있게끔 자바 8부터 가능해졌다.
public interface Bear {
default void print() {
System.out.println("자바 8부터 default 키워드 사용시 인터페이스에서 메소드 구현이 가능하다.");
}
}
6. 인터페이스의 static 메소드, 자바 8
자바 8부터 추가된 메소드로 인터페이스에서 정적으로 구현된 메소드를 참조하여 사용할 수 있다.
public interface Bear {
static void print() {
System.out.println("자바 8부터 static 메소드 구현이 가능하다.");
}
}
public class Main {
public static void main(String[] args) {
Bear.print(); // static 메소드 호출
}
}
7. 인터페이스의 private 메소드, 자바 9
자바 9부터 추가된 메소드로 default 메소드에서 중복되는 기능을 모아서 공통적으로 처리할 때 주로 사용한다.
구현하는 클래스에서는 private 메소드에 직접적으로 접근할 수 없다.(당연히 접근지시자가 private이므로 불가하다.)
public interface Bear {
// 특정 프로세스를 시작하기전에 전처리 과정이 필요하다고 가정한다.
default void preProcess() {
log();
// 이하 생략
}
// 특정 프로세스를 시작하기전에 후처리 과정이 필요하다고 가정한다.
default void postProcess() {
log();
// 이하 생략
}
// 전처리, 후처리가 진행될 때 공통적으로 호출해야하는 메소드가 있다고 가정한다.
private void log() {
System.out.println("프로세스 수행전 호출");
}
}
'Programming > Java' 카테고리의 다른 글
[기본-6] 상속 (0) | 2021.03.03 |
---|---|
[기본-5] 클래스 (0) | 2021.03.03 |
[기본-4] 제어문 (0) | 2021.03.02 |
[기본-3]자바 연산자 (0) | 2021.03.01 |
[기본-2]자바 데이터 타입, 변수 그리고 배열 (0) | 2021.02.28 |