본문

[2017.08.15] 09. 왜 인터페이스(Interface)를 사용할까?

결과적으로 목적은 

1. 더 안전하게 개발하기 위함이다.

예를 들어, 대형 쇼핑몰의 배송 프로세스를 구현한다고 가정하자.


대형 프로젝트여서 회원 정보를 추출하는 로직은 '자사'에서 구현하고, 배송 최단경로를 찾는 로직은 '외주 업체'에 아웃소싱한다고 생각해보자.

여기서 문제는 구현할 UserInfoManager와 DeliveryManager가 선행 작업 관계가 있을 때, 작업시간이 오래 걸릴 수 있다. (회사에서 시간은 돈이다)


이러한 문제점은 더미클래스와 같은 방법으로 구현 전 틀을 만들어 시간을 줄 일 수 있다.

1
2
3
4
5
6
7
8
class UserInfoManagerDummy {
    String getLocation(String userId) {
        /*
         * 로직 구현 전 
         */
        return "tmp";
    }
}
cs

 

그러나! 또 다른 문제가 발생 할 수 있다. 

1개월이 지난 후 확인해보니 소통의 오류로 인자를 다르게 구현을 했다면 ... 

이러한 문제를 해결하기 위한 방법으로 Interface이다.


Interface는 명세서와 같다.

Interface를 구현하는 클래스는 반드시 해당 메소드들을 구현해야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {
    public static void main(String[] args) {
        UserInfoManager userInfoManager = new UserInfoManager();
        DeliveryManager deliveryManager = new DeliveryManager();
        
        deliveryManager.getShortestPath("본사", userInfoManager.getLocation("heepie"));
    }
}
 
interface LocationGettable {
    public String getLocation(String userId);
}
 
class UserInfoManager implements LocationGettable {
    @Override
    public String getLocation(String userId) {
        // TODO Auto-generated method stub
        return null;
    }
}
cs



2. 클래스  데이터를 전송하는 목적

글보다는 그림으로 시각화 후 실습을 통해 알아보자.

기본 실습

위의 그림처럼 클래스 B와 클래스 C를 인터페이스를 통해 접근해보자.

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
32
public class A {
    public static void main(String[] args) {
        // 아래 코드가 X, 명세서인 인터페이스를 통해 접근
//        B process = new B();
//        C process = new C();
 
        // 목적에 따라 해당 클래스 생성 
        IProcess process = new B();
//        IProcess process = new C();
        
        process.process();
        
    }
}
 
interface IProcess {
    void process();
}
 
class B implements IProcess {
    @Override
    public void process() {
        System.out.println("B Process 시작");
    }
}
 
class C implements IProcess {
    @Override
    public void process() {
        System.out.println("C Process 시작");
    }
}
cs


심화 실습 - 콜백 함수 호출 예제 

(콜백 함수 개념 - http://heepie.tistory.com/60,

인터페이스와 콜백 실습 - http://heepie.tistory.com/131)


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
32
33
34
public class callbackMain  {
    public static void main(String[] args) {
        A a = new A();
        a.process();
    }    
}
 
class A implements ICallback{
    void process() {
        System.out.println("A 프로세스 시작");
        B b = new B();
        b.process(this);
    }
    
    public void afterProcess() {
        System.out.println("callback: A 프로세스 시작");
    }
    @Override
    public void callback() {
        afterProcess();
    }
}
 
interface ICallback {
    void callback();
}
 
class B {
    void process(ICallback callback) {
        System.out.println("call: B 프로세스 시작");
        System.out.println("오래걸리는 데이터 처리");
        callback.callback();
    }
}

cs


의미를 깊게 생각해봐야 할 곳: A클래스 안의 b.process(this)

클래스 간 데이터를 전송하는 목적의 인터페이스 예제를 살펴보았다. callback의 경우, 안드로이드에서 많이 사용되는 패턴이다.



#interface #인터페이스 #왜 인터페이스 #인터페이스 목적

공유

댓글