본문 바로가기

Java

Java 인터페이스(interface)

 

1. 인터페이스(interface)

- 추상 메서드의 집합

인터페이스와 추상 클래스의 공통점?
추상 메서드를 가지고 있다는 것
추상 클래스는 추상 메서드를! 가진 클래스, 인터페이스는 추상 메서드 만! 가진 것
(JDK 1.8부터는 상수, static 메서드, default 메서드 추가) 

그렇다면 인터페이스와 추상 클래스의 차이점?
인터페이스는 iv(인스턴스 변수)를 가질 수 없음
추상 클래스는 iv, 생성자, 인스턴스 메서드를 가질 수 있음

 

- 구현된 것이 없는 설계도

- 모든 멤버가 public, 모든 상수는 static final, 모든 메서드는 abstract 이기 때문에 생략 가능

interface 인터페이스명 {
    public static final 타입 상수명 = 값;
    public abstract 메서드명(매개변수);
}

 

 

2. 인터페이스의 상속

- 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상 아님)

- 다중 상속 가능(추상메서드는 충돌해도 문제 없음)

 

 

3. 인터페이스의 구현(implements)

- 인터페이스에 정의된 추상 메서드를 완성하는 것

class 클래스명 implements 인터페이스명 {
    // 인터페이스에 정의된 추상 메서드를 모두!!!! 구현해야 함
}

- 일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 함

 

 

4. 인터페이스를 이용한 다형성

- 인터페이스도 구현 클래스의 부모라고 볼 수 있음(정확히 말하자면 클래스만 부모가 될 수 있어서 부모는 아니지만.. )

- 상속과 구현이 동시에 가능 👉🏻 다중 상속은 안되지만 다중 상속이 되는 것과 같은 형태

// Fighter 클래스는 부모(조상)는 Unit이고, 인터페이스 Fightable 구현한 것
class Fighter extends Unit implements Fightable {
    public void move(int x, int y) {
    }
    public void attack(Unit u) {
    }
    
    // 부모(조상)클래스 Unit 타입의 참조변수 u
    Unit u = new Fighter();
    
    // 인터페이스 Fightable 타입의 참조변수 f, Fightable에서 선언된 메서드만 사용가능
    Fightable f = new Fighter();
}

 

- 메서드의 매개변수로 인터페이스 타입으로 사용될 수 있음 👉🏻 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공

interface Fightable {
    void move(int x, int y);
    void attack(Fightable f); // Fightable 인터페이스를 구현한 클래스의 인스턴스만 가능
}

 

- 인터페이스를 메서드의 리턴타입으로 지정할 수 있음

// Fightable 인터페이스를 구현한 클래스의 인스턴스 반환
Fightable method() { // Fightable타입의 메서드
    Fighter f = new Fighter(); 
    retrun f; // Fighter 객체 반환
}

 

 

5. 인터페이스의 장점

- 두 대상(객체) 간 연결을 돕는 중간 역할

👉🏻 관계없는 클래스들에게 관계를 맺어 줄 수 있음

 

- 선언(설계, 껍데기)와 구현(알맹이)의 분리

👉🏻 구현 변경이 유연함, 구현이 변경되어도 인터페이스(껍데기)는 변경되지 않음!! 만약 구현 코드가 변경된 경우 코드 변경에 따라 추가로 코드 변경할 것이 많아질 수 있는데, 인터페이스를 사용한 경우 코드 변경이 없음! (느슨한 결합, 의존성이 낮아짐)

👉🏻 개발 시간 단축: 인터페이스의 추상메서드를 호출하여 코드 작성하는 A, 인터페이스 구현에 대한 코드를 작성하는 B 동시에 작업이 가능하다! 협업에도 유리

👉🏻 표준화: 프로젝트의 기본 틀을 인터페이스를 사용하고, 개발자들은 인터페이스를 구현하면 되니까 일관되고 정형화된 프로그램 개발 가능