1장. 소개
이 작품은 AI를 사용하여 번역되었습니다. 여러분의 피드백과 의견을 환영합니다: translation-feedback@oreilly.com
프로그래밍 언어의 결
나무처럼 프로그래밍 언어에도 결이 있습니다. 목공과 프로그래밍 모두 결을 따라 작업하면 일이 순조롭게 진행되지만 결을 거슬러 작업하면 일이 더 어려워집니다. 프로그래밍 언어의 결을 거슬러 작업하면 필요 이상의 코드를 작성해야 하고 성능이 저하되며 결함이 발생할 가능성이 높고 편리한 기본값을 무시해야 하며 매 단계마다 도구와 싸워야 합니다.
순리를 거스르는 것은 불확실한 보상과 함께 끊임없는 노력을 수반합니다.
예를 들어 함수형 스타일로 Java 코드를 작성하는 것은 항상 가능했지만, Java 8 이전에는 그렇게 하는 프로그래머가 거의 없었는데, 그만한 이유가 있습니다.
다음은 덧셈 연산자로 목록을 접어 숫자 목록의 합을 계산하는 Kotlin 코드입니다:
valsum=numbers.fold(0,Int::plus)
Java 1.0에서 동일한 작업을 수행하기 위해 요구되었던 것과 비교해 보겠습니다.
시간의 안개 당신을 1995년으로 데려가는 동안 당신을 지나갈 것입니다...
Java 1.0에는 일급 함수가 없으므로 함수를 객체로 구현하고 다양한 유형의 함수에 대한 자체 인터페이스를 정의해야 합니다. 예를 들어 덧셈 함수는 인수가 두 개이므로 인수가 두 개인 함수의 유형을 정의해야 합니다:
publicinterfaceFunction2{Objectapply(Objectarg1,Objectarg2);}
그런 다음 Vector 클래스에 필요한 반복과 변형을 숨긴 fold 고차 함수를 작성해야 합니다. (1995년 Java 표준 라이브러리에는 아직 컬렉션 프레임워크가 포함되어 있지 않습니다.)
publicclassVectors{publicstaticObjectfold(Vectorl,Objectinitial,Function2f){Objectresult=initial;for(inti=0;i<l.size();i++){result=f.apply(result,l.get(i));}returnresult;}...andotheroperationsonvectors}
fold 함수에 전달하려는 모든 함수에 대해 별도의 클래스를 정의해야 합니다. 덧셈 연산자는 값으로 전달할 수 없으며, 현재 이 언어에는 메서드 참조, Lambda 또는 클로저가 없으며 내부 클래스도 없습니다. Java 1.0에는 제네릭이나 오토박싱도 없으므로 인수를 예상 유형으로 캐스팅하고 참조 유형과 프리미티브 사이에 박싱을 작성해야 합니다:
publicclassAddIntegersimplementsFunction2{publicObjectapply(Objectarg1,Objectarg2){inti1=((Integer)arg1).intValue();inti2=((Integer)arg2).intValue ...