인터페이스란 ?
- *핵심! 추상 메서드의 집합 - 프로그래밍 관점
구현된 것이 전혀 없는 설계도. 껍데기(모든 멤버가 public)
인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상이 아니다)
다중 상속이 가능(추상메서드는 충돌해도 문제 없음)
** 클래스의 다중상속이 안되는 이유는 ? : 다른 조상에서 같은 이름. 같은 일을 하는 메소드가 있을 수 있어서 안된다 / 그러나 인터페이스는 어차피 구현부만 있기 때문에 문제가 되지 않는다)
interface 인터페이스이름 {
public static final 타입 상수이름 = 값;// 상수는 가질 수 있다.
public abstract 메서드이름(매개변수목록);
}
interface PlayingCard {
public static final int SPADE = 4;
final int DIAMOND = 3; // public static final 생략
static int HEART = 2; // public static final 생략
int CLOVER = 1; // public static final 생략
public abstract String getCardNumber();
String getCardKind(); // public static final 생략
}
인터페이스의 구현
- 인터페이스에 정의된 추상 메서드를 완성 하는 것
** implements : 구현
class 클래스이름 implements 인터페이스이름{
// 인터페이스에 정의된 추상 메서드를 구현
}
interface Fightable {
void move(int x, int y);
void attack(int x, int y);
}
class Fighter implements Fightable {
public void move(int x, int y);{}
public void attack(int x, int y);{}
}
- 일부만 구현 하는 경우는 class 앞에 abstract를 붙여야 한다.
abstract class Fighter implements Fightable {
public void move(int x, int y){ }
}
** 추상클래스 <> 인터페이스 공통점
- 추상 메서드를 가지고 있다.(미완성 설계도)
** 추상클래스 <> 인터페이스 차이
- iv를 가질수 있느냐 없느냐의 차이
- 추상클래스 : 추상 메서드를 가진 클래스 / 멤버변수를 가질 수 있다. / 구현이 있을 수 있다.
- 인터페이스 : 추상 메서드만 있다. / 멤버변수를 가질 수 없다. / 구현이 없다.
인터페이스를 이용한 다형성
- 인터페이스도 구현 클래스의 부모? YES!!!
class Fighter extends Unit implements Fightable {
public void move(int x, int y){ }
public void attack(Fightable f){ }
}
// 다형성
Unit u = new Fighter();
Fightable u = new Fighter(); // 대신 Fightable에 있는 메서드만 사용 가능
- 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능
f.move(100, 200);
f.attack(new Fighter()); // Fightable 인터페이스를 구현한 클래스의 인스턴스만 가능
- 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
Fightable method(){
...
Fighter f = Fighter();
return f;
}
Fightable ff = method();
인터페이스의 장점
- 두 대상(객체) 간의 '연결, 대화, 소통' 을 돕는 '중간 역할'을 한다.
- 선언(설계)와 구현을 분리시킬 수 있게 한다.
- 인터페이스 덕분에 B가 변경되어도 A는 안바꿀 수 있게 된다. 변경에 유연하다. (느슨한 결합)
** 직접적인 관계(강한결합)
class A {
public void method(B b){
b.methodB();
}
}
class B{
public void methodB(){
System.out.println("methodB");
}
}
** 간접적인 관계
class A {
public void method(I b){
b.methodB();
}
}
interface I { void methodB();}
class B implements I{
public void methodB(){
System.out.println("methodB");
}
}
추후 새로운 클래스 C가 추가된다면 인터페이스를 이용할 경우 A클래스는 변경 할 필요가 없다.
class C implements I{
public void methodB(){
System.out.println("methodB is C");
}
}
- 개발 시간을 단축 할 수 있다.
인터페이스를 사용하지 않으면 그 해당 클래스, 기능이 완성되기 전 까지 그 기능을 이용하는 부분은 개발 하지 못하지만
인터페이스를 사용할 경우 기능이 구현 전이라도 그 기능을 이용하는 부분은 개발이 가능하다.
위의 소스를 예로 하면 B클래스가 구현 전이라도 인터페이스 I 를 이용해 A 클래스 구현이 가능
- 변경에 유연한 설계가 가능하다.
- 표준화가 가능하다. JDBC
- 서로 관계없는 클래스들을 관계를 맺어줄 수 있다.
디폴트 메서드와 static 메서드
- 인터페이스의 디폴트 메서드, static 메서드 추가 가능(JDK 1.8부터)
- 인터페이스에 새로운 메서드 추가하기 어려움
메서드를 추가하면 기존에 그 인터페이스를 이용해 구현된 클래스에 영향이 있음.
해결책 >> 디폴트 메서드(default method)
- 디폴트 메서드는 인스턴스 메서드(인터페이스 원칙 위반)
interface MyInface {
void method();
void newMethod(); // 새로추가된 메서드 기존 구현된 클래스에 영향을 줌
}
interface MyInface {
void method();
default void newMethod(){} // 몸통이 있는 default 메서드 추가 구현 안해도 됨
}
>> 그러면 디폴트 메서드가 기존의 메서드와 충돌하면 어떻게 하지 ??
1. 여러 인터페이스와 디폴트 메서드 간의 충돌
: 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 해야한다.
2. 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
: 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
>>> 그냥 충돌 났을때 오버라이딩 하면 된다.
'개발' 카테고리의 다른 글
Java - 오류 / 예외 처리하기 (0) | 2021.06.05 |
---|---|
Java - 내부 클래스(inner class) / 익명 클래스(anonymous class) (0) | 2021.06.05 |
Java - 추상클래스 (0) | 2021.06.05 |
Java - 객체지향개념 (0) | 2021.05.30 |
Java - 배열 (0) | 2021.05.10 |