함수 살펴보기

완료됨

일반적으로 코드가 반복하는 것처럼 보이는 상황이 있을 수 있습니다. 여러 위치에서 동일한 작업을 수행하고 있거나 약간의 차이만 있습니다. 이와 같은 상황에서는 코드를 다시 사용할 수 있는 방법을 고려합니다. 이러한 상황을 해결하는 방법은 이러한 식을 추출하여 하나 이상의 함수를 생성하는 것입니다. 함수는 다양한 프로그래밍 언어의 기본 빌딩 블록이며 F#도 마찬가지입니다.

함수입니다.

함수는 하나 이상의 식으로 구성된 본문을 포함하는 명명된 참조입니다. 매개 변수를 포함할 수도 있습니다. 함수는 키워드 let과 함수의 이름으로 시작합니다. 그다음에는 대입 연산자가 있으며 이 연산자의 오른쪽에는 함수 본문이 있습니다.

다음은 함수의 구문입니다.

let <function name> <parameters> = <function body>

위의 예제 구문을 사용하여 표시되는 실제 함수 예제는 다음과 같습니다.

let add a b = a + b 

이 예시에서 함수의 이름은 add이고 매개 변수는 ab 입니다. 함수 본문은 a+b와 같이 두 매개 변수를 더하고 결과를 반환합니다.

반환 값

첫 번째 예시와 같이, 반환되는 항목을 표시하는 return 키워드는 없습니다. F#에서 함수의 마지막 줄에 포함된 정보는 반환되는 항목입니다. 다음과 같은 여러 줄의 함수를 고려해 보세요.

let addAndMultiply a b c = 
    let sum = a + b
    let product = sum * c
    product

product를 마지막 줄에 배치하면 반환될 결과가 표시됩니다. 이와 같이 함수를 호출하려면 어떻게 해야 하나요?

함수 호출

함수를 호출하거나 발동하려면 함수 이름을 사용하고 공백 문자로 구분된 매개 변수를 추가합니다. 예를 들어 addAndMultiply() 함수를 호출하려면 다음 코드를 입력합니다.

addAndMultiply 2 3 3 // 15

함수의 결과를 보려면 변수에 할당하거나 다음과 같이 직접 출력할 수 있습니다.

let sum = addAndMultiply 2 3 3
printfn "%i" sum
// OR
printfn "%i" (addAndMultiply 2 3 3)

유추된 형식

다음 코드를 보겠습니다.

let add a b = a + b
let sum = add 2 2 
let concat = add "hello" "world" // will give compilation error

이 코드는 마지막 줄에서 다음 메시지를 나타내며 실패합니다.

error FS0001: This expression was expected to have type
    'int'    
but here has type
    'string'    

이 오류가 발생하는 이유는 F#에서 사용해야 하는 매개 변수 형식을 이미 결정했으며 정수로 결정했기 때문입니다. 정수로 결정한 이유는 두 번째 행 let sum = add 2 2의 정보 때문이었습니다. 함수 add()는 매개 변수 유형이 분명히 정수임을 명시하는 방식으로 사용되었습니다.

두 번째 행이 없는 경우 코드는 다음과 같이 작동합니다.

let add a b = a + b
// let sum = add 2 2 
let concat = add "hello" "world" // will work

컴파일러는 함수에 대한 첫 번째 사용이 문자열을 사용하여 생성된 것을 확인하고 매개 변수 유형이 문자열임을 확인합니다. 따라서 컨텍스트 및 첫 번째 사용은 형식을 유추합니다.

명시적 형식

어떤 형식의 매개 변수를 취하고 함수가 무엇을 반환하는지에 대해 명시적으로 정할 필요가 있는 경우가 있습니다. 컴파일러에 필요하지 않은 경우에도 가독성을 높이는 데 도움이 됩니다.

예를 들어, 다음 함수를 보겠습니다.

let convert a =
    int a

형식을 추가하려면, 다음과 같이 :<type>을 추가합니다.

let convert (a:string) =
    int a

이제 매개 변수는 코드 let convert (a:string)를 통해 string 형식을 갖습니다. 이제 반환 형식을 추가하여 훨씬 더 명시적으로 지정할 수 있습니다. 이렇게 하려면 매개 변수 바로 뒤에 다른 :<type>을 추가합니다.

let convert (a:string) :int =
    int a

이제 (a:string)에 표시된 것처럼 괄호로 매개 변수를 둘러쌉니다. 반환 형식은 나타나는 마지막 :<type> 주석으로, :int입니다. F#은 대부분의 시나리오를 파악하는 데 충분하지만, 경우에 따라 보다 명시적으로 지정하여 코드를 보완해야 합니다. 형식을 추가하는 또 다른 장점은 다른 개발자가 진행 상황을 쉽게 파악할 수 있다는 것입니다.