✍️ 학습할 것
- 인터페이스 정의
- 인터페이스 구현 및 사용하기
- 인터페이스 상속
- 인터페이스의 기본 메서드 (Default Method), 자바 8
- 인터페이스의 static 메서드, 자바 8
- 인터페이스의 private 메소드, 자바 9
📌 인터페이스
인터페이스란? 일종의 추상 클래스이다.
추상 메서드와 상수만 멤버로 가질 수 있으며 다중 상속을 지원한다.
많은 블로그에서 인터페이스에 대해서 말하는 바는 대부분 다음과 같다.
'인터페이스는 추상 클래스보다 추상화가 높고 상수와 추상 메서드만을 가진다.'
전~혀 와닿지 않는다. 추상 클래스가 있는데 왜 인터페이스가 필요한 것일까?
✔️ 추상 클래스 vs 인터페이스
추상 클래스는 abstract 키워드로 정의되거나 클래스 내 '추상 메서드'가 하나 이상 포함된 클래스를 말한다.
추상 메서드가 포함되어있다는 점을 제외하곤 일반 클래스가 가지는 모든 것(생성자, 멤버 변수 등)을 가질 수 있다.
반면에 인터페이스는 상수와 추상 메서드만 가질 수 있다. 여기까지는 단순한 구현의 차이다.
둘의 진정한 차이는 상속에서, 특히 상속 키워드에서 엿볼 수 있다.
1️⃣ 추상 클래스 : extends
- extend의 사전적 정의는 '확장'이다. 정의와 같이 슈퍼 클래스인 자신의 기능을 확장하는 것이 목적이다.
- 자바는 모호성 때문에 다중 상속을 지원하지 않는다. 따라서 클래스를 구분하는 용도로 사용하는 게 좋다.
2️⃣ 인터페이스 : implements
- implement의 사전적 정의는 '구현'이다. 추상 메소드를 각 클래스에 맞게 구현하는 것이 목적이다.
- 인터페이스는 다중 상속을 지원한다. 다른 클래스를 상속받더라도 같은 기능이 필요할 때 사용하는 게 좋다.
정리하자면 둘의 차이는 '확장'과 '구현'에서 발생한다.
추상 클래스는 다중 상속이 불가능하기 때문에 자식 클래스에게 많은 속성들을 물려주고 그 기능들을 확장하는 목적으로 사용된다. 반면에 인터페이스는 다중 상속이 가능하기 때문에 공통된 기능들을 구현하는 목적으로 사용된다.
물론 둘 다 특정 메소드를 꼭 구현하게 한다는 점을 기억해야한다😋😋
📌 인터페이스 작성
클래스와 비슷하다. (추상 클래스의 일종이라 그런가?)
상수와 추상 메서드만 가질 수 있다는 차이가 있고 각 제어자들은 생략 가능하다.
생략된 제어자들은 컴파일러가 자동으로 추가해준다.
// Example
접근제어자 interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메소드이름(매개변수목록);
}
📌 인터페이스 구현 및 사용하기
추상 클래스와 비슷하다. 직접 인스턴스를 생성할 수 없고 상속을 통해서 추상 메서드를 완성한다.
클래스의 extends 키워드 대신 implements 키워드를 통해서 구현한다.
// Example
interface Part {
String putTogether();
}
class Engine implements Part {
public String putTogether() {
return "Engine" + "을 조립했다!!";
}
}
class Mechanic {
public void action(Part part) {
System.out.println(part.putTogether());
}
}
public class Interface {
public static void main(String[] args) {
Mechanic mechanic = new Mechanic();
Engine engine = new Engine();
mechanic.action(engine); // Engine을 조립했다!!
}
}
📌 인터페이스의 상속
추상 클래스의 일종이지만 클래스의 상속과 조금 다르다.
- 클래스는 인터페이스와 클래스 모두 상속이 가능하다.
- 인터페이스는 인터페이스만 상속 가능하다. 또한, 다중 상속을 지원한다.
- 클래스와 달리 Object클래스와 같은 최고 조상이 없다.
📌 인터페이스의 기본 메서드 (Default Method)
Java8부터 default 키워드를 사용해서 추상 메서드가 아닌 일반 메서드를 구현할 수 있게 되었다.
메서드 구현에 초점을 맞춘 인터페이스에 기본 메서드가 등장한 이유는 '하위 호환성' 때문이다.
인터페이스에 추가적으로 추상 메서드를 구현했을 때 모든 구현체에 해당 메서드를 꼭 구현해야 한다.
이렇게 되는 상황이 '하위 호환성'을 보장받지 못하는 상황이고 이것을 막기 위해서 등장하게 되었다.
즉, 기본 메서드가 등장함으로 하위 호환성을 보장해 객체지향 설계의 '개방 폐쇄 원칙'을 지킬 수 있다.
// Example
interface Part {
default void print() { System.out.println("이것은 인터페이스의 기본 메소드입니다!!"); }
}
class Engine implements Part {
@Override
void print() {
// 구현할 필요가 없다..!!
}
}
public class Interface {
public static void main(String[] args) {
Engine engine = new Engine();
engine.print(); // 이것은 인터페이스의 기본 메소드입니다!!
}
}
📌 인터페이스의 static 메서드
기본 메서드와 동일하게 Java 8 버전부터 등장했다. 기본 메소드와의 차이점은 다음과 같다.
- 인스턴스를 구현하지 않고도 사용할 수 있다.
- 오버라이딩을 할 수 없다.
// Example
interface Msg {
static void Hello() { System.out.println("Hello World!"); }
default void Hi() { System.out.println("Hi World!"); }
}
class MsgImpl implements Msg {}
public class Interface {
public static void main(String[] args) {
MsgImpl msgImpl = new MsgImpl();
Msg.Hello(); // Hello World!
msgImpl.Hi(); // Hi World!
}
}
📌 인터페이스의 private 메서드
Java 9 버전부터 인터페이스 내 private 메서드를 지원하게 되었다.
인터페이스에서 어떤 공통의 기능을 구현해서 사용할 때가 있다.
이 기능들은 인터페이스 내부의 기능이라 외부에 알리고 싶지 않지만 public으로 선언하게 되면 공개가 된다.
이런 점을 보완하기 위해서 등장했고 궁극적으로 정보 은닉을 만족하게 된다.
'언어 공부 > Java' 카테고리의 다른 글
[Java] 멀티쓰레드 프로그래밍 (22.12.05 updated) (0) | 2022.12.05 |
---|---|
[Java] Java 예외 처리 (2) | 2022.09.20 |
[Java] Java의 패키지 (0) | 2022.09.05 |
[Java] Java의 상속 (2) | 2022.08.25 |
[Java] Java의 클래스 (0) | 2022.08.17 |
댓글