10장. 함수에서 확장 함수까지
이 작품은 AI를 사용하여 번역되었습니다. 여러분의 피드백과 의견을 환영합니다: translation-feedback@oreilly.com
Kotlin에는 메서드처럼 호출되지만 실제로는 (일반적으로) 최상위 함수인 확장 함수라는 특별한 종류의 프로시저가 있습니다. 일반 함수에서 확장 함수로 쉽게 변환할 수 있습니다. 언제 어느 것을 더 선호해야 할까요?
기능 및 방법
객체 지향 프로그래밍 은 객체에 메시지를 보내 문제를 해결하는 기술입니다. myString 의 길이를 알고 싶으세요? 메시지를 보내 물어보세요 myString.length() 그 문자열을 콘솔에 인쇄하고 싶으세요? 메시지에 문자열을 넣고 콘솔을 나타내는 다른 객체에 인쇄해 달라고 요청하세요:
System.out.println(myString). 고전적인 OO 언어에서는 클래스에 메서드를 정의하여 객체가 메시지에 반응하는 방식을 정의합니다. 메서드는 해당 클래스에 바인딩되어 특정 인스턴스와 관련된 멤버(필드 및 기타 메서드)에 액세스할 수 있습니다. 메서드를 호출하면 런타임은 올바른 버전이 호출되도록(객체의 런타임 유형에 따라 다름) 인스턴스 상태에 액세스할 수 있도록 준비합니다.
반면 함수형 프로그래밍에서는 값으로 함수를 호출하여 문제를 해결합니다. myString 의 길이를 함수에 전달하여 length(myString) 의 길이를 구합니다. println(myString) 로 콘솔에 출력하고, 다른 곳에 출력하려면 println(myString, System.err) 로 함수에 전달합니다. 함수는 유형에 정의되지 않지만 함수 매개변수와 결과에는 유형이 있습니다.
패러다임에는 장단점이 있지만 지금은 검색 가능성과 확장성만 고려해 보겠습니다.
다음은 Customer 유형입니다:
dataclassCustomer(valid:String,valgivenName:String,valfamilyName:String){...}
이것은 클래스이므로 id, givenName, familyName 를 요청하는 메시지를 보낼 수 있다는 것을 바로 알 수 있습니다. 다른 작업은 어떻습니까? 클래스 기반 시스템에서는 아래로 스크롤하기만 하면 보낼 수 있는 다른 메시지를 확인할 수 있습니다:
dataclassCustomer(valid:String,valgivenName:String,valfamilyName:String){valfullNameget()="$givenName $familyName"}
종종 우리는 정의를 살펴보지도 않습니다. val customer: Customer 변수가 있는 경우 customer. 을 입력하면 IDE가 id, givenName, familyName 또는 fullName 을 호출할 수 있다고 열심히 알려줍니다. 사실 이 자동 완성 기능은 슈퍼타입에 정의되거나 언어에 암시된 다른 연산(equals, copy 등)도 보여주기 때문에 클래스 정의를 보는 것보다 여러 면에서 더 나은 ...