본 포스팅의 목적
- 인터페이스를 활용하면 표준화를 통해 일관성 있는 프로그래밍을 할 수 있다는 장점이 있다.
- 본 포스팅에서는 인터페이스의 여러 장점 중, 클래스와 클래스간의 느슨한 결합에 기여하는 인터페이스의 활용을 간단한 예시코드를 통해 알아보고자 한다.
- 인터페이스를 사용했을 때와 사용하지 않았을 때 드러나는 차이점을 중점으로 기록하겠다.
//1. 클래스 A는 methodA의 매개변수로 인스턴스B를 받아들여, 직접 사용하고있다.
// (A는 B에 의존한다.)
class A {
void methodA(B b) {
b.methodB();
}
}
class B {
public void methodB() {
System.out.println("methodB");
}
}
A a = new A();
a.methodA(new B());
이를 그림으로 표현하면 아래와 같다.
//2. 어느 날, 클래스 A는 더이상 인스턴스B를 사용하지 않고, 인스턴스C를 사용한다고 가정해보자.
//클래스 C의 등장
class C {
public void methodC() {
System.out.println("methodC");
}
}
//3. 클래스 A는 methodA의 매개변수로 인스턴스C를 받아들여, 직접 사용하고있다.
// (A는 C에 의존한다.)
//4. 그렇다면, 클래스 A에서는 무슨 일이 일어날까?
// 아래와 같이 반드시 메서드를 수정해주어야만 할 것이다.
class A {
/*
더이상 사용하지 않는 메서드
void methodA(B b) {
b.methodB();
}
*/
//새롭게 사용할 메서드 정의 : 매개변수를 수정해야만 한다 !!
void methodA(C c) {
c.methodC();
}
}
A a = new A();
a.methodA(new C());
이를 그림으로 표현하면 아래와 같다.
//인터페이스 I
interface I {
void methodI();
}
//인터페이스 I를 구현한 B 클래스
class B implements I{
public void methodI() {
System.out.println("methodB");
}
}
//1. 클래스 A는 methodA의 매개변수로 인터페이스 I를 구현한 인스턴스를 받아들여 사용한다.
class A {
void methodA(I i) {
i.methodI();
}
}
A a = new A();
a.methodA(new B());
이를 그림으로 표현하면 아래와 같다.
//2. 어느 날, 클래스 A는 더이상 인스턴스B를 사용하지 않고, 인스턴스C를 사용한다고 가정해보자.
//인터페이스 I를 구현한 C 클래스의 등장
class C implements I{
public void methodI() {
System.out.println("methodC");
}
}
//3. 앞서 그랬던 것처럼, 클래스 A의 메서드를 수정해주어야 할까??
class A {
void methodA(I i) {
i.methodI();
}
}
A a = new A();
a.methodA(new C());
이를 그림으로 표현하면 아래와 같다.
참고문헌
- 자바의 정석(남궁성 저)