16장. 함수 인터페이스
이 작품은 AI를 사용하여 번역되었습니다. 여러분의 피드백과 의견을 환영합니다: translation-feedback@oreilly.com
Java에서는 인터페이스를 사용하여 일부 기능을 정의하는 코드와 이를 필요로 하는 코드 간의 계약을 지정합니다. 이러한 인터페이스는 두 당사자를 서로 연결하여 소프트웨어를 유지 관리하기 어렵게 만들 수 있습니다. 함수형은 이 문제를 해결하는 데 어떻게 도움이 될까요?
가능하다면 작성 중인 코드에서 이메일을 보내야 한다고 상상해 보세요. 지금은 메일을 받거나 보낸 메시지를 나열하는 것이 아니라 그냥 실행하고 잊어버리세요.
이메일을 설명하는 코드는 매우 간단합니다:
dataclass(valto:EmailAddress,valfrom:EmailAddress,valsubject:String,valbody:String)
Email 이 주어지면 클라이언트 코드는 이를 전송하기 위해 가능한 가장 간단한 함수를 호출하려고 합니다:
funsend(:){...}
물론 이 기능을 구현할 때 실제로 이메일을 보내려면 온갖 종류의 다른 정보가 필요하다는 것을 알게 되었습니다. 이메일 자체에 대한 정보가 아니라 이메일을 보내는 방법에 대한 구성이 필요합니다. 보내는 서버의 호스트 이름과 보안 자격 증명 등 기술 전문가가 아닌 친척이 모르는 모든 것을 새 컴퓨터에 설정해야 합니다. sendEmail 에 이 모든 설정을 대신할 수 있도록 세 개의 추가 매개 변수를 추가하겠습니다:
funsendEmail(:,serverAddress:InetAddress,username:String,password:String){...}
클라이언트로서는 상황이 훨씬 덜 편리해졌습니다. 이메일을 보내려는 모든 곳에서 이 설정을 알아야 하고, 코드베이스의 위에서 아래로 전달해야 합니다. 전역 변수에 세부 정보를 숨겨서 이 문제를 해결하는 것은 단위 테스트 스위트를 실행할 때마다 50개의 이메일을 보내는 것을 발견하기 전까지는 잘 작동합니다! 이런 사소한 세부 사항을 숨기는 더 좋은 방법이 있을 것입니다.
객체 지향 캡슐화
객체 지향 언어( )에는 이 문제에 대한 기성 솔루션이 있습니다. 객체는 데이터를 캡슐화할 수 있습니다:
classEmailSender(privatevalserverAddress:InetAddress,privatevalusername:String,privatevalpassword:String){funsend(:){sendEmail(,serverAddress,username,password)}}
이제 이메일을 보내려면 정적 함수가 아닌 EmailSender 에 액세스해야 합니다. 일단 EmailSender 이 있으면 함수를 호출하는 대신 메서드를 호출하고, 메서드가 이미 알고 있기 때문에 모든 사소한 세부 사항을 알려줄 필요가 없습니다(클래스의 ...