인터페이스는 한마디로 말하자면 일종의 추상 클래스다. 추상 클래스처럼 추상메서드를 갖지만, 추상 클래스보다 추상화 정도가 높아서 추상 클래스와 달리 추상 메서드와 상수만을 멤버로 가질 수 있다.
추상 클래스를 부분적으로만 완성된 미완성 설계도라고 한다면 인터페이스는 밑그림만 그려져 있는 기본 설계도라고 할 수 있다.
interface 인터페이스명 {
.....
}
class 클래스명 implements 인터페이스명{
...
}
그렇다면 바로 구현하면 되지 왜 귀찮게 서비스 인터페이스 만들고 구현 클래스를 따로 만드는 걸까?
✅ 개발 기간을 단축 시킬 수 있다
일단 인터페이스와 구현 클래스를 나누어서 작업하면, 인터페이스만 먼저 작성해놓으면 이 틀을 사용해서 프로그램을 작성할 수 있다. 또한, 한 쪽에서 구현 클래스를 작성하면서 동시에 다른 개발을 진행할 수 있다.
✅ 표준화가 가능하다
아까부터 틀이라는 단어를 계속 사용하고 있는데, 이렇게 인터페이스로 틀을 잡아 놓고 개발을 하게 되면 여러 명의 개발자가 작업을 할 때도 일관된 틀안 에서 그 안의 내용을 구현하면서 개발이 진행되므로 정형화된 작업이 가능하다.
✅ 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다
서로 상속(extends)관계도 아니고 조상 클래스도 갖고 있지 않은 아무런 관계도 없는 클래스들이 하나의 인터페이스를 공통적으로 구현하게 하면 관계를 맺어줄 수 있다.
✅ 독립적인 프로그래밍이 가능하다
클래스의 선언(interface > Service)과 구현(class > ServiceImpl)을 분리시킴으로써 독립적인 프로그래밍이 가능하다. 만약 모든 클래스들을 직접 관계로 한다면, 한 클래스를 변경할 때마다 직접 관계로 맺어진 클래스를 모두 수정해야 할 것이다. 하지만 선언과 구현을 나누면서 간접적인 관계로 변경하면, 하나의 클래스를 변경하더라도 다른 클래스에 영향을 미치지 않게 된다.
package interface_;
public interface InterA {
//only 상수
public static final String NAME = "홍길동";
int AGE = 25; //public static final생략가능
//only 추상 메소드
public abstract void aa();
public void b(); //abstract생략가능
}
/*
이렇게 전체적인 틀을 짜준 후, 실제 구현 클래스에서 메서드 내용 부분을 채워넣어 구현(implements)을 해주는 것이다.
*/
package interface_;
public interface InterB {
public void cc();
public void dd();
}
package interface_;
public interface InterC extends InterA, InterB{ //다중 상속 가능
//추상 메소드 4개
// @Override
// default void aa() {
// // TODO Auto-generated method stub
//
// }
//
// @Override
// default void b() {
// // TODO Auto-generated method stub
//
// }
//
// @Override
// default void cc() {
// // TODO Auto-generated method stub
//
// }
//
// @Override
// default void dd() {
// // TODO Auto-generated method stub
//
// }
/*
extends(상속) 하는 경우, 추상메소드는 반드시 Sub Class에서 Override 꼭 해 주어야 한다.
but, 하위 인터페이스(Inter C)에서는 상위 인터페이스(Inter A, Inter B)의 추상 메서드를 반드시 오버라이드(override)할 필요는 없다.
이 경우, 하위 인터페이스(InterC)를 구현(implement)한 클래스(InterMain)에서 상위 인터페이스(Inter A, Inter B)의 추상 메서드를 모두 구현해야 합니다.
interface간 상속 가능
class는 다중상속이 불가능하지만, interface는 다중상속 가능
단, 상속(extends)의 경우 class extends class, interface extends interface 만 가능(Mix X)
[EX] 맞는 문장을 모두 고르시오
class A{}
interface InterA{}
1. class B extends A { } 0
2. class B implements InterA { } 0
3. class B implements A { } x
4. class B extends InterA { } x
5. interface InterB extends A { } x
6. interface InterB implements InterA { } x --> class B implements InterA { }
7. interface InterB implements A { } x
8. interface InterB extends InterA { } o
상수와 추상메소드만 존재(필드 선언 X)
인터페이스만으로 객체 생성 X -> 인터페이스의 변수를 가지고 (인터페이스를 구현한)클래스의 객체를 참조, 익명 내부 클래스 사용
*/
}
package interface_;
public class InterMain implements InterC{
/*
interface를 implements 한 클래스는 반드시 추상메소드를 Override(재구현)해주어야 한다.
Override(재구현) 할때 반드시 public를 붙여야 한다.
*/
public void aa() {
}
public void b() {
}
public void cc() {
}
public void dd() {
}
public static void main(String[] args) {
}
}