인프런 커뮤니티 질문&답변

고 예진님의 프로필 이미지
고 예진

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

함수형 인터페이스 (전반전)

함수형 인터페이스(전반전)에서 작성한 코드가 이해되지 않습니다.

작성

·

411

0

 안녕하세요 선생님🙇‍♀️
함수형 인터페이스(전반전) 강의를 듣다 이해가 되지 않는 부분이 있어 질문 드립니다.

public class _04_FunctionalInterface {
    public static void main(String[] args) {
        KRWConverter converter = new KRWConverter();
//        converter.convert(2);
        convertUSD(converter, 2);

    }

    public static void convertUSD(Convertible converter, int USD) {
        converter.convert(USD);

    }
}
  1. public static void convertUSD(Convertible converter, int USD) {converter.convert(USD);}
    에서 (Convertible converter, int USD) 이 부분이 이해가 되지 않았습니다. Convertible converter 를 사용한 이유가 무엇인가요?

답변 1

7

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?
메소드의 전달값으로 사용된 Convertible converter 에서 Convertible 은 KRWConverter 라는 클래스가 구현하는 인터페이스입니다.

public class KRWConverter implements Convertible {
    @Override
    public void convert(int USD) {
        // 1 달러 = 1400 원
        System.out.println(USD + " 달러 = " + (USD * 1400) + " 원");
    }
}

Convertible 인터페이스는 다음과 같이 정의되어 있으며 이를 구현하는 클래스는 반드시 convert() 메소드를 정의해야하죠.

public interface Convertible {
    void convert(int USD);
}

그러므로 Convertible 인터페이스를 구현하는 KRWConverter 에도 convert() 메소드의 동작이 정의되어 있습니다. 만약 KRWConverter 가 아닌 다른 국가의 통화를 변환하는 클래스라고 해도 동일하게 convert() 메소드의 동작이 정의되어 있을 것입니다. 가령 말레이시아 링깃이라면 이런 식으로 만들어볼 수 있겠네요.

public class MYRConverter implements Convertible {
    @Override
    public void convert(int USD) {
        ...
    }
}

그런데 만약 KRWConverter 와 MYRConverter 클래스로부터 만들어지는 객체를 어떤 메소드 내에서 전달받아서 convert() 메소드를 사용하려면 어떻게 할 수 있을까요? 아마 다음과 같이 각각에 대해 별도의 메소드를 만들어줘야 할 것입니다.

public static void convertUSD(KRWConverter converter, int USD) {
    converter.convert(USD);
}
public static void convertUSD(MYRConverter converter, int USD) {
    converter.convert(USD);
}

지금은 2개라서 다행이지만 통화의 종류가 더 늘어난다면 convertUSD 메소드 또한 비례하여 늘어나게 되겠지요. 그런데 뭔가 메소드의 동작에 수정이 필요하다면 모든 메소드에 동일하게 수정을 해야 하는 불편함이 있을 것입니다. 사용자의 실수가 발생할 수도 있구요.

다행히 자바에는 다형성이란 것이 있습니다. 다형성에 의해 KRWConverter 와 MYRConverter 클래스로부터 만들어지는 객체는 Convertible 로 관리될 수 있죠. 이게 무슨 말이냐면 다음과 같이 하나의 메소드로 서로 다른 국가의 통화를 한 번에 처리할 수 있게 되는 것입니다.

public static void convertUSD(Convertible converter, int USD) {
    converter.convert(USD);
}

이는 KRWConverter 와 MYRConverter 가 모두 Convertible 인터페이스를 구현하기 때문에 가능한 것이며, Convertible 인터페이스를 구현하는 경우라면 모두 convert() 메소드가 구현되어 있을 것이므로 converter.convert(USD); 라는 문장도 문제 없이 수행될 수 있게 됩니다.

이해에 도움되었으면 좋겠습니다 😊
감사합니다.

고 예진님의 프로필 이미지
고 예진

작성한 질문수

질문하기