인터페이스는 추상메서드의 집합
아무것도 없는 기본 설계도 이며 다른클래스를 작성하는데 도움 줄 목적으로 작성됩니다.
추상 클래스 와 인터페이스의 차이는
인터페이스 (추상메서드)
추상클래스(일반클래스인대 추상메서드를 가지고있다.)
- 추상 클래스는 클래스인데 추상 메서드를 포함하는 클래스, 멤버 변수를 가질 수 있음.
- 인터페이스는 추상 메서드’만’ 포함하는 클래스, 멤버 변수(iv, cv)를 가질 수 없음
- 정확히 말하자면 추상 메서드외에도 상수, static메서드, default메서드를 가질 수 있으나, 핵심은 인터페이스가 추상 메서드의 집합이라는 것임
추상 클래스 | 인터페이스 | |
사용 키워드 | abstract | interface |
사용 가능 변수 | 제한 없음 | static final (상수) |
사용 가능 접근 제어자 | 제한 없음 (public, private, protected, default) | public |
사용 가능 메소드 | 제한 없음 | abstract method, default method, static method, private method |
상속 키워드 | extends | implements |
다중 상속 가능 여부 | 불가능 | 가능 (클래스에 다중 구현, 인터페이스 끼리 다중 상속) |
공통점 | 1. 추상 메소드를 가지고 있어야 한다. 2. 인스턴스화 할 수 없다 (new 생성자 사용 X) 3. 인터페이스 혹은 추상 클래스를 상속받아 구현한 구현체의 인스턴스를 사용해야 한다. 4. 인터페이스와 추상클래스를 구현, 상속한 클래스는 추상 메소드를 반드시 구현하여야 한다. |
인터페이스의 작성
interface 인터페이스 이름 {
public static final 타입 상수이름 =값
public abstract 메서드이름(매개변수목록);
}
interface PlayingCard {
public static final int SPADE = 4;
final int DIAMOND = 3; // public static final int DIAMOND = 3;
static int HEART = 2; // public static fianl int HEART = 2;
int CLOVER = 1; // public static final int CLOVER = 1;
}
인터페이스의 상속
다중 상속 가능하고
인터페이스는 클래스와 달리 Object클래스와 같은 최고 조상이 없습니다
인터페이스의 구현
- 인터페이스의 정의된 추상 메서드를 완성하는 것(=구현)
- 인터페이스에 정의된 추상 메서드를 모두 구현해야합니다.
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서드를 모두 구현
}
interface Fightable {
void move(int x, int y); // public abstract
void attack(Unit u);
}
class Fighter implements Fightable {
public void move(int x, int y) { /* 내용 생략 */ }
public void attack(Unit u) { /* 내용 생략 */ }
}
- 구현하는 인터페이스의 메서드 중 일부만 구현한다면, abstract 를 붙여 추상 클래스로 선언합니다.
abstract class Fighter implements Fightable {
public void move(int x, int y) { /* 내용 생략 */ }
// 멤버로 'public abstract vboid attack(Unit u);' 를 가짐
}
인터페이스를 이용한 다중 상속
- 자바는 다중 상속을 허용하지 않는 언어이나, 인터페이스를 통해 다중 상속이 가능 하기야 합니다.(실제로 인터페이스로 다중 상속을 하는 경우는 거의 없습니다)
- 두 개의 클래스로부터 상속을 받아야하는 상황이라면
- 두 조상클래스 중에서 비중이 높은 쪽을 선택하고 다른 한쪽을 클래스 내부에 멤버로 포함시키는 방식으로 처리하거나
- 어느 한쪽의 필요한 부분만 뽑아서 인터페이스로 만든 다음 구현하도록 합니다.
인터페이스를 이용한 다형성
인터페이스 여깃 이를 구현한 클래스의 조상이라 할수 있으므로 참조 할수 있으며 형변환도 가능합니다.
메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야합니다.
인터페이스의 장점
1.개발시간 단축
2.표준화가 가능합니다 (jdbc)
3.서로 관계없는 클래스들에게 관계를 맺어 줄 수 있습니다.
4.독립적인 프로그래밍이 가능합니다
디폴트 메서드와 static메서드
자바 8 부터 추가 되었습니다
디폴트 메서드 (예외상황)
인터페이스에 메서드를 추가한다는 것은 추상메서드를 추가한다는 것이고 이 인터페이스를 구현한 기존의 모든 클래스들이 새로 추가된 메소드를 구현해야 하기 때문입니다 새로 추가되어도/해당 인터페이스를 구현한 클래스를 변경하지 않아도 됩니다. 디폴트 메서드가 기존의 메서드와 이름이 중복되어 충돌 될수 있습니다
1여러 인터페이스의 디롶트 메서드 간의 충돌
-인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야 합니다.
2. 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시됩니다.
그냥 직접 오버라이딩 합시다.