/////
Search
Duplicate
9️⃣

비슷한 수학적 개념

1. 적분

: 다음과 같은 함수 f가 있다고 가정하자.
f(x)=x+10f(x) = x + 10
: 공학에서는 함수가 차지하는 영역을 묻는 질문이 자주 등장한다.
37f(x)dx\int^7_3 f(x) dx
또는
37(x+10)dx\int^7_3 (x+10) dx
: 이 예제에서 함수 f는 직선이므로 사다리꼴 기법으로 적분값을 쉽게 구할 수 있다.
1/2((3+10)+(7+10))(73)=601 / 2 *((3+10)+(7+10)) * ( 7 -3)=60
: 이 공식은 자바로 어떻게 표현할 수 있을까? 먼저 적분 기호나 dy/dx 등 이상한 기호를 어떻게 처리할 것인지가 문제다.
: 우선은 f와 한계값을 인수로 받는 intergrate라는 함수를 만들어야 한다. 즉 다음처럼 함수 f를 인수로 받는 함수를 자바로 구현할 수 있다.
intergarte(f, 3, 7)
Java
복사
: 그러나 다음처럼 간단히 구현할 수는 없다.
intergrate(x + 10, 3, 7)
Java
복사
: 우선 이 식에선 x의 범위가 불분명하며, f를 전달하는 것이 아니라 x + 10이라는 값을 전달하기 때문에 잘못된 식이다.
: 수학에서 dx의 정체는 ‘x를 인수로 받아 x + 10의 결과를 만드는 함수’로 정리할 수 있다.

2. 자바 8 람다로 연결

: 이전에 언급했듯이 자바 8에서는 (double x) → x + 10 같은 람다 표현식을 사용할 수 있다.
: 따라서 함수 f를 다음과 같이 구현할 수 있다. integrate((double x) → x + 10, 3, 7) 또는 다음처럼 구현할 수 있다. integrate((double x) → f(x), 3, 7)
: C가 정적 메서드 f를 포함하는 클래스라 가정하면 메서드 참조를 사용해서 코드를 더 간단하게 만들 수 있다. integrate(C::f, 3, 7)
: 이제 integrate 메서드를 어떻게 구현할지 궁금할 것이다. f를 선형 함수라 가정하자. 따라서 수학식과 비슷한 코드를 작성할 수 있다.
public double integrate((double -> double) f, double a, double b) { return (f(a) + f(b)) * (b - a) / 2.0 }
Java
복사
: 하지만 함수형 인터페이스를 기대하는 컨텍스트에서만 람다 표현식을 사용할 수 있으므로 다음처럼 코드를 구현해야 한다.
public double integrate(DoubleFunction<Double> f, double a, double b) { return (f.apply(a) + f.apply(b)) * (b - a) / 2.0; }
Java
복사
: 또는 DoubleUnaryOperator를 이용해서 결과를 박싱할 필요가 없다.
public double integrate(DoubleUnaryOperator f, double a, double b) { return (f.applyAsDouble(a) + f.applyAsDouble(b)) * (b - a) / 2.0; }
Java
복사
: 참고로 수학처럼 f(a)라고 표현할 수 없고 f.apply(a)라고 구현했는데, 이는 자바가 진정으로 함수를 허용하지 않고 모든 것을 객체로 여기는 것은 포기할 수 없기 때문이다.