Function.apply()
Supplier.get()
위의 코드에서 `BridgeSize bridgeSize = read(BridgeSize::from, inputView::readBridgeSize);` 라인은 제네릭 메서드 `read`를 사용하여 `BridgeSize` 객체를 초기화하는 부분입니다. 이 코드 라인의 작동 원리는 다음과 같습니다:
1. `read` 메서드는 두 개의 매개변수를 받습니다. 첫 번째 매개변수 `Function<T, R> object`는 변환 함수를 나타내며, 두 번째 매개변수 `Supplier<T> input`은 입력 데이터를 제공하는 함수입니다.
2. `BridgeSize::from`은 `BridgeSize` 클래스의 정적 메서드인 `from`을 나타냅니다. 이 메서드는 입력으로 받은 문자열을 파싱하여 `BridgeSize` 객체를 생성하고 반환합니다.
3. `inputView::readBridgeSize`는 `inputView` 객체의 `readBridgeSize` 메서드를 나타냅니다. 이 메서드는 사용자로부터 입력을 읽어옵니다.
4. `read` 메서드는 `input.get()`을 호출하여 입력 데이터를 가져오고, 그 후에 `object.apply(...)`를 호출하여 변환 함수를 사용하여 입력 데이터를 변환합니다. 이 때, 변환 함수는 `BridgeSize::from`이 됩니다.
5. 만약 변환 함수(`BridgeSize::from`)에서 예외(일반적으로 `IllegalArgumentException`)가 발생하면, `catch` 블록에서 해당 예외 메시지를 출력하고 사용자로부터 새로운 입력을 받을 수 있도록 재귀적으로 `read` 메서드를 호출합니다. 이렇게 하면 사용자가 유효한 입력을 제공할 때까지 입력을 반복해서 받을 수 있습니다.
결국, `BridgeSize` 객체를 초기화하기 위해 사용자로부터 입력을 받고, 이 입력을 `BridgeSize::from` 메서드를 사용하여 변환하여 `BridgeSize` 객체로 반환하는 과정을 수행하는 코드 라인입니다. 이를 통해 `BridgeSize` 객체를 초기화하고, 이를 이용하여 게임 초기화를 진행합니다.
Predicate<T>
해당 포스팅 발췌