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 동시에 작업이 가능하다! 협업에도 유리
👉🏻 표준화: 프로젝트의 기본 틀을 인터페이스를 사용하고, 개발자들은 인터페이스를 구현하면 되니까 일관되고 정형화된 프로그램 개발 가능
'Java' 카테고리의 다른 글
Java 내부 클래스(inner class) (0) | 2022.12.29 |
---|---|
Java default 메서드와 static 메서드 (0) | 2022.12.29 |
Java 추상 클래스(abstract class), 추상 메서드(abstract method) (0) | 2022.12.27 |
Java 매개변수의 다형성 (0) | 2022.12.27 |
Java 참조변수의 형변환과 instanceof (0) | 2022.12.27 |