[Java] 객체지향개념15_인터페이스(1)
이 게시글은 남궁성의 정석코딩 - 자바의 정석 기초편(2020최신)을 보고 공부한 내용을 정리한 게시글입니다.
틀린 내용이 있을 수 있습니다.
✔ 인터페이스
- 추상메서드의 집합이다.
- 구현된 것이 전혀 없는 설계도, 껍데기이다.
- 인터페이스를 구성하는 모든 것이 public 이다.
인터페이스와 추상클래스의 차이
인터페이스 | 추상클래스 |
- 추상메서드 외에는 아무것도 없고, 아무것도 가질 수 없다. - 멤버변수도 가질 수 없다. ※ 상수는 가질 수 있다. |
- 일반 클래스인데 추상메서드를 가지고 있는 것이다. - 전체 또는 일부만 미완성일 수 있다. |
interface PlayingCard{
public static final int SPADE = 4; // 상수
int DIAMOND = 3; // public static final 생략 가능
public abstract String getCardNumber(); // 추상메서드
String getCardKind(); // public abstract 생략 가능
}
- 상수도 인터페이스의 멤버가 될 수 있다.
- 인터페이스에서 상수는 항상 public static final이기 때문에 public, static, final은 생략할 수 있다.
- 인터페이스에서 메서드는 항상 public이고 abstract이기 때문에 public, abstract는 생략할 수 있다.
◾ 인터페이스의 상속
- 인터페이스의 조상은 인터페이스만 가능하다.
- 인터페이스는 인터페이스만 상속받을 수 있다.
- 클래스의 최고 조상은 Object 이지만, 인터페이스의 최고 조상은 Object가 아니다.
- 인터페이스는 다중 상속이 가능하다. 추상메서드의 집합이기 때문이다.
interface Fightable extends Movable, Attackable{} // 2명의 부모 인터페이스를 상속받음
다중 상속, 인터페이스에서는 되고 클래스에서는 안되는 이유 💬
클래스
만약 클래스에서 다중 상속이 가능하다고 가정하자.
A와 B클래스에 method() 라는 이름의, 이름은 같지만 하는 일은 다른 메서드가 있다.
여기서 C클래스는 A와 B클래스를 상속받고 method()를 호출하려고 한다.
에러가 발생한다.
A클래스와 B클래스 중 어떤 클래스의 method()를 가져와야 할지 모르기 때문이다.
⇒ 에러가 발생할 수 있으므로 클래스에서는 다중 상속이 안된다.
인터페이스
인터페이스는 구현부가 없는 추상메서드들의 집합이다.
그렇기 때문에 다중 상속을 한다해도 메서드의 구현부가 없기 때문에 부모 인터페이스끼리의 충돌이 발생하지 않는다.
⇒ 인터페이스는 다중 상속이 가능하다.
◾ 인터페이스 구현
- 인터페이스에 정의된 추상 메서드를 완성하는 것을 인터페이스 구현이라 한다.
- 인터페이스는 클래스를 통해 구현할 수 있는데, implements 키워드를 사용한다.
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
// 일부만 구현할 경우 이 클래스는 추상클래스가 되어 abstract를 붙여줘야 한다.
}
예를 들어 Fightable 이라는 인터페이스가 있을 때, Fighter 클래스로 Fightable 인터페이스를 구현할 수 있다.
interface Fightable{
void move(int x, int y);
void attack(Fightable f);
}
class Fighter implements Fightable{
public void move(int x, int y){
// 구현~
}
public void attack(Fightable f){
// 구현~
}
}
만약 인터페이스의 일부만 구현하게 되면 추상클래스가 되므로 class 앞에 abstract를 붙여줘야 한다.
abstract class Fighter implements Fightable{
public void move(int x, int y){
// 구현~
}
}