[Java] 자바 인터페이스 Interface
★ 인터페이스 Interface
자바의 인터페이스는 클래스들이 필수로 구현해야 하는 추상 클래스입니다. 다시 말해 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할을 합니다.
자바의 일반 클래스는 다중 상속을 지원하지 않는데, 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 문제가 발생할 수 있기 때문에 단 하나의 부모 클래스를 가질 수 있습니다.
하지만 인터페이스는 기능에 대한 선언만 하기 때문에 다중 상속을 지원합니다. 자바의 다형성을 극대화하면서 개발코드 수정을 줄이고 유지보수를 위해 인터페이스를 사용합니다.
★ 인터페이스 특징
- 다중 상속 지원
- extends 키워드로 인터페이스를 상속 받을 수 있음
- 다중 상속 시 , 로 구분
- 추상 메서드와 상수만을 포함
- public static final 필드, public abstract 메소드
- 모든 인터페이스에 공통으로 적용되는 부분으로, public, static, final, abstract 을 생략하더라도 컴파일 시 자바 컴파일러가 자동으로 추가해 줌
- 자바 8 버전 이후부터 인터페이스 내부에 default 메서드와 static 메서드를 정의할 수 있음
- 생성자 사용 불가
- 인터페이스로 인스턴스 사용 불가
- 메서드 오버라이딩 필수
- 자식클래스는 부모 인터페이스의 추상 메서드를 모두 오버라이딩 해야함
★ 인터페이스 Interface 선언
접근 제어자와 함께 interface 키워드를 사용하여 선언합니다.
접근제어자 interface 인터페이스이름 {
...
// 상수
// 추상메서드
...
}
★ 인터페이스 Interface 구현
인터페이스는 인스턴스를 생성할 수 없으므로, 인터페이스에 포함된 추상 메서드를 구현하기 위한 클래스를 작성해야합니다.
인터페이스를 구현할 클래스에 implements 키워드와 함께 인터페이스 이름을 명시합니다.
인터페이스는 '메서드 오버라이딩 필수' 라는 특징을 가지고 있기 때문에, 인터페이스를 implements 하는 클래스에서 추상 메서드를 구현하지 않는다면 에러가 발생합니다.
인터페이스의 추상 메서드 리턴 타입은 모두 동일해야 하며, 구현부에서 추상메서드를 구현할 때 public 접근 제어자를 명시해야합니다.
public class 클래스 이름 implements 인터페이스이름 {
...
public 추상메서드 { ... }
...
}
★ 인터페이스 Interface 예제
Animal 인터페이스를 선언합니다.
인터페이스에는 public static final 상수와 public abstract 추상메서드만 포함이 가능하지만, 이를 생략하더라도 자바 컴파일러가 컴파일 시 public static final, public abstract 를 자동으로 추가해줍니다.
// Animal.java
public interface Animal {
// 상수
public static final String name = "동물";
String name_en = "animal";
// 추상 메서드
public abstract void bark();
void eat();
}
Dog 와 Cat 클래스에서 인터페이스를 구현합니다.
// Dog.java
public class Dog implements Animal {
// 인터페이스 상수 사용
public void printName() {
System.out.println(Animal.name + ": 강아지");
}
// 인터페이스 구현
public void bark() {
System.out.println("멍멍");
}
public void eat() {
System.out.println("강아지 사료");
}
}
// Cat.java
public class Cat implements Animal {
// 인터페이스 상수 사용
public void printName() {
System.out.println(Animal.name + ": 고양이");
}
// 메서드 구현
public void bark() {
System.out.println("야옹");
}
public void eat() {
System.out.println("고양이 사료");
}
}
// Main.java
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.printName();
dog.bark();
dog.eat();
System.out.println();
cat.printName();
cat.bark();
cat.eat();
}
}
★ 디폴트 메서드 default method 와 정적 메서드 static method
JAVA8 버전 이후부터는 인터페이스 내부에 상수와 추상 메서드 이외에, 디폴트 메서드와 정적 메서드를 정의할 수 있습니다.
디폴트 메서드와 정적 메서드는 인터페이스 내부에서 구현이 가능합니다.
디폴트 메서드 default method 는 인터페이스를 구현하는 클래스에서 재정의가 가능합니다.
정적 메서드 static method 는 인터페이스에서 제공해주는 메서드를 그대로 사용만 가능할 뿐, 재정의는 불가합니다.
public interface Animal {
// default method => 재정의 가능
default void printHello() {
System.out.println("Hello");
}
// static method => 재정의 불가능
static void printStatic() {
System.out.println("Hello World");
}
}