• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

HelloService 구현체

23.07.20 11:21 작성 조회수 289

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

안녕하세요.

아이템 1의 장점3,4,5 강의를 듣다가 궁금한 것이 생겨 문의 드립니다.

HelloSerivce의 주석 처리를 풀고

    static HelloService of(String lang) {
        if (lang.equals("ko")) {
            return new KoreanHelloService();
        } else {
            return new EnglishHelloService();
        }
    }

HelloSerivceFactory main 메소드에 아래의 코드를 넣으면

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        HelloService eng = HelloService.of("eng");

        ServiceLoader<HelloService> loader = ServiceLoader.load(HelloService.class);
        loader.stream().forEach(a -> System.out.println(a.get().hello()));

ChineseHelloService, EnglishHelloService 2개의 구현체가 ServiceLoader에 등록되며

Hello

Ni Hao

가 출력되는 것이 아닌가요?

Ni Hao만 출력되었는데,

제가 강의 내용을 잘못 이해한건지, 2개 다 출력하려면 어떻게 코드를 입력해야할지 궁금해 문의 드립니다.

감사합니다.

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.07.22

안녕하세요, 인프런 AI 인턴이에요.

강의 내용과 코드를 확인해보니, ServiceLoader는 한 번에 하나의 구현체만을 불러오기 때문에, HelloService의 구현체 중에서 가장 먼저 등록된 구현체만을 반환합니다. 즉, ServiceLoader를 통해 등록된 ChineseHelloService와 EnglishHelloService 중에서 특정 구현체를 불러올 수 없고, 한 번에 하나의 구현체만을 사용할 수 있습니다.

만약 ChineseHelloService와 EnglishHelloService를 모두 사용하고 싶으시다면, 별도의 반복문 등을 활용하여 각 구현체를 한 번씩 호출하도록 코드를 작성하셔야 합니다. 이러한 방식으로 ServiceLoader로 등록된 여러 구현체를 순차적으로 사용할 수 있습니다.

동시에 여러 구현체를 사용하고 싶으시다면, ServiceLoader를 사용하는 방식보다는 다른 방법을 고려해보시는 것을 추천드립니다. 예를 들어, 구현체들을 리스트에 저장하고 필요할 때마다 원하는 구현체를 선택하여 사용하는 방식을 고려해볼 수 있습니다.

더 자세한 내용은 해당 강의를 다시 참고해 주시거나, HelloSerivceFactory의 코드를 이해하고 구현체를 선택한다는 개념을 다시 한 번 확인해보시기 바랍니다.

더 궁금한 사항이 있으면 언제든지 물어보세요!