20-1. 인터페이스의 의의 및 장점
인터페이스의 의의 및 장점
이전 글에서는 프로그래밍 관점에서 인터페이스를 다루어보았습니다. 이번 글에서는 짧게 보편적인 관점에서의 인터페이스를 살펴보고
그 의의와 장점을 알아보겠습니다! 보편적인 관점에서의 인터페이스는 어떠한 두 대상 간의 사이에서 중간자 역할을 수행해줍니다.
우리는 일상생활에서 중간자 역할을 수행해주는 분들 즉 중개인을 통해 어떠한 거래나 일을 수월하게 처리합니다.
또 사실 우리가 지금 사용하고 있는 컴퓨터 혹은 스마트폰 또한 마찬가지입니다. 우리가 직접 컴퓨터와의 대화를 통해 다루는 어려운
방식이 아닌, 중간자 역할을 수행해주는 그래픽 사용자 인터페이스(GUI, Graphical User Interface)를 통해 단순히 아이콘을 누르는 일로
인터넷이나 프로그램을 단순하게 실행하고 또 사용할 수 있습니다. 우리가 아무렇지 않게 사용하는 키보드와 마우스 또한 그렇습니다.
우리는 내부가 어떻게 동작하는지 알 필요 없이 단순히 어떻게 사용하는지에만 집중하면 된다는 것에 인터페이스는 그 의의가 있습니다.
이렇게 짧게 보편적인 관점에서의 의의이자 장점을 마무리 하고 좀 더 프로그래밍적인 관점에서 장점을 하나씩 살펴보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class A {
public void method1(B b) {
b.method2();
}
}
class B {
public void method2() {
System.out.println("메소드2 호출!");
}
}
public class InterfaceExam3 {
public static void main(String[] args) {
A a = new A();
a.method1(new B());
}
}
|
cs |
위 코드를 살펴보시면 클래스 A는 현재 매개변수로 클래스 B타입을 받아 클래스 B의 메서드인 method2()를 호출하고 있습니다.
따라서 두 클래스는 의존적인 관계임을 알 수 있습니다. 따라서 클래스 B가 클래스 C와 같이 변경되었을 때 A 또한 변경해주어야
한다는 문제가 있습니다. 위 예제는 매우 단순하지만, 만약 이 의존관계가 상당히 복잡하다면 수정하는데 굉장한 어려움을 겪을 것입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
class A {
public void method1(I i) {
i.method();
}
}
interface I {
void method();
}
class B implements I {
public void method() {
System.out.println("메소드2 호출!");
}
}
class C implements I {
public void method() {
System.out.println("메소드3 호출!");
}
}
public class InterfaceExam3 {
public static void main(String[] args) {
A a = new A();
a.method1(new C());
}
}
|
cs |
이번에는 중간자 역할을 수행하는 인터페이스 I를 통하는 방식을 이용해보았습니다. 클래스 A의 매개변수는 중간자인 인터페이스 I 타입을
받고 있기 때문에 인터페이스 I에 영향을 받습니다. 그리고 클래스 B와 C는 이를 구현하고 있기 때문에 이 인터페이스 I를 모두 거치게
됩니다. 따라서 클래스 A의 매개변수의 변경없이 28행에서와 같이 인터페이스 I를 구현한 어떤 클래스의 인스턴스를 받을 것인지만 설정
해주면 되는 것입니다.
물론 매우 간단하게 살펴본 예제였지만 이를 통해 알 수 있는 첫 번째 장점은 변화에 유연하다는 장점을 볼 수 있습니다. 변화에 유연하다
는 것은 곧 빠른 변화의 흐름에 대응할 수 있음을 의미합니다.
두 번째 장점은 개발시간이 단축 된다는 것입니다. 예를 들어 위 예제의 클래스 A가 사용자가 사용하는 방식에 대한 로직을 구현하려고 하
고, 클래스 B는 사용했을 때 내부적으로 동작하는 것에 대한 로직을 구현하려고 합니다. 이때 인터페이스를 사용하지 않고 일반적인
방식으로 서로 의존적인 관계로 개발하려고 한다면, 클래스 B가 모두 구현되어야 동작되는 방식에 맞춰 클래스 A를 구현해야 할 것이므로
클래스 B가 구현될 때까지 기다려야 합니다. 이는 개발 시간이 늘어나게 된다는 문제를 가집니다. 인터페이스를 둔다면 클래스 B는
이 인터페이스를 구현해야 하므로 인터페이스에 맞춰 개발하게 될 것이고, 클래스 A는 이에 대한 기대 로직을 인터페이스를 통해 예측해
개발할 수 있어 클래스 B가 모두 완성될 때까지 기다리지 않아도 됩니다. 따라서 이러한 과정을 통해 개발 시간이 단축된다는 장점을
가지게 되는 것입니다.
세 번째 장점은 표준화가 가능하다는 것입니다. 예를 들어 우리가 일상생활에서 어떠한 제품을 충전하려고 할 때 충전기를 이용합니다. 이때
충전기가 회사마다 제각각 다르다면 상당한 불편을 겪을 것입니다. 따라서 이에 대한 표준 규격이 있듯 자바도 비슷한 것이 있습니다.
바로 JDBC가 그 예입니다. 각기 다루는 방식이 다른 데이터베이스를 인터페이스 집합인 이 JDBC를 통해 표준화 하여 데이터베이스를
다루게 됩니다. (자바를 다루는 글인만큼 JDBC에 대한 자세한 설명은 생략하겠습니다. 좀 더 알아보시고 싶으시다면 검색을 권장합니다!)