11월 5일
1.인터페이스의 장점
(1)두 객체간의 연결,대화,소통을 돕는 '중간역할'을 한다. 중간에 껍데기(인터페이스)는 안바뀌고 알맹이(서버)만 바껴도 사용자는 사용하는데 무리가 없다.
왜?사용자는 인터페이스 하고만 소통을 하기 때문에 변경에 영향이 없음. 즉,변경에 유리하다.
(2)선언과 구현을 분리시킬수 있다.변경에 유리하며 유연한 코드가 된다.
*직접적으로 연결된 두 클래스
package Java;
class A{
public void method(B b) {
b.method();
}
}
class B{
public void method() {
System.out.println("B클래스의 메서드");
}
}
public class Ex7_12 {
public static void main(String[] args) {
A a=new A();
a.method(new B());// A와 B를 의존하고 있음
}
}
A와 B클래스가 밀접하게 연결되어 있어서 B클래스를 C클래스로 변경시 손이 많이감.
package Java;
class A{
public void method(I i) {
b.method();
}
}
interface I{
public void method();
}
class B implements I{
public void method() {
System.out.println("B클래스의 메서드");
}
}
class C implements I{
public void method() {
System.out.println("C클래스의 메서드");
}
}
public class Ex7_12 {
public static void main(String[] args) {
A a=new A();
a.method(new B());
}
}
A클래스가 인터페이스를 보고있기 때문에 클래스가 B에서 C로 바껴도 영향이 없다.
왜? 이렇게 나누는이유는 변경을 최소화하여 에러날 확률을 줄임
(3)개발 시간을 단축한다.
예를 들어 A클래스가 먼저 개발되고 B클래스를 개발해야 한다면 A클래스가 다만들어 질때까지 기다려야한다. 그러나 인터페이스가 있으면 인터페이스에 맞추면 되니까 기다리지않고 같이 개발할 수 있다.
(4)변경에 유리한 설계가 가능하다.
(5)표준화가 가능하다.
예)JDBC를 표준에 맞춰 DB회사에서 개발하여 오라클을 쓰다가 나중에 MySQL로 바꿔도 크게 문제가 없다. 자바->JDBC->DB 이런식으로 접근하기 때문에 DB가 바뀐다해도 인터페이스인 JDBC는 동일하므로 영향이 없다.
(6)서로 관계없는 클래스끼리 관계를 맺어줌
위에 그림과 같이 SCV와 Tank와 Dropship은 서로 관계가 없음.
그래서 repair()메서드를 추가하고 싶으면 각각 SCV와 Tank와 Dropship 클래스마다repair()메서드를 추가해 줘야한다.
Interface Repairable{...}
class SCV extends GroundUnit implements Repairable{...}
class Tank extends GroundUnit implements Repairable{...}
class Dropship extends AirUnit implements Repairable{...}
위와같이 Repairable인터페이스를 상속받으므로써 새로 관계를 맺어주는 역할을 함.
2.인터페이스에 JDK1.8부터 디폴드메서드와 static메서드를 추가 가능하다.
3.디폴드메서드가 생긴이유
인터페이스에 새로운 추상메서드를 새로 넣어야할 경우 해당 인테페이스를 상속받아 구현한 모든 구현클래스에서는 추가한 메서드를 새로 구현해 줘야하므로 부담이 생김.
이러한 부담감을 해결하고자 '디폴드메서드'가 생김
Interface MyInterface{
void method();
default void newMethod(){}
}
그렇다면 구현부가 있는 메서드가 있으면 충돌문제가 다시 생길텐데 그부분은 어떻게 해결하나?
(1)여러 인터페이스의 디폴드 메서드가 충돌 한다면?
구현한 클래스에서 디폴드 메서드를 오버라이딩 한다.
(2)디폴드 메서드와 조성클래스의 메서드간에 충돌이 일어난다면?
조상클래스의 메서드가 상속되고 디폴드메서드는 무시됨.
(3)암것도 모르겠다 하면 오버라이딩하기!