F# 명명된 인자
F# 명명된 인자 (Named Arguments)
메서드를 호출할 때 인자를 위치에 따라 나열하는 대신, 이름을 직접 붙여서 전달하는 방법을 알아봐요. F#에서는 메서드 호출에 한해 인자에 이름을 붙일 수 있어요. 이렇게 하면 코드가 더 읽기 쉬워지고, 나중에 API의 매개변수 순서가 바뀌어도 코드를 덜 고쳐도 돼요. 함수나 람다 표현식에는 적용할 수 없고 오직 메서드에서만 쓸 수 있다는 점, 그리고 생성자 호출 시에는 속성 값을 함께 설정할 수도 있다는 점까지 짚어드릴게요.
출처
- 원문: Parameters and Arguments - F# 중 "Named arguments" 섹션
- (참고: 작업에 준 URL
.../values/named-arguments는 현재 404 — 명명된 인자 내용은 "Parameters and Arguments" 페이지에 포함되어 있습니다.)
본문
메서드의 인자는 쉼표로 구분한 인자 목록에서 위치에 따라 지정할 수도 있고, 이름 뒤에 등호(=)와 전달할 값을 붙여서 명시적으로 넘길 수도 있어요. 이름을 지정해서 넘길 경우, 선언에서 사용된 순서와 다르게 배치해도 괜찮아요.
명명된 인자(named arguments)를 쓰면 코드가 더 읽기 쉬워지고, API가 바뀌는 상황(예: 메서드 매개변수의 순서가 변경되는 경우)에도 더 유연하게 대처할 수 있어요.
명명된 인자는 메서드에만 허용되고, let으로 묶은 함수, 함수 값(function value), 람다 표현식(lambda expression)에는 사용할 수 없어요.
다음 코드 예제는 명명된 인자를 사용하는 방법을 보여줘요.
type SpeedingTicket() =
member this.GetMPHOver(speed: int, limit: int) = speed - limit
let CalculateFine (ticket : SpeedingTicket) =
let delta = ticket.GetMPHOver(limit = 55, speed = 70)
if delta < 20 then 50.0 else 100.0
let ticket1 : SpeedingTicket = SpeedingTicket()
printfn "%f" (CalculateFine ticket1)
위 예제에서 GetMPHOver(limit = 55, speed = 70)처럼 인자를 선언 순서와 다르게 이름으로 지정해서 넘기는 걸 볼 수 있어요.
클래스 생성자를 호출할 때도 명명된 인자와 비슷한 문법을 사용해서 클래스의 속성 값을 설정할 수 있어요. 다음 예제가 그 문법을 보여줘요.
type Account() =
let mutable balance = 0.0
let mutable number = 0
let mutable firstName = ""
let mutable lastName = ""
member this.AccountNumber
with get() = number
and set(value) = number <- value
member this.FirstName
with get() = firstName
and set(value) = firstName <- value
member this.LastName
with get() = lastName
and set(value) = lastName <- value
member this.Balance
with get() = balance
and set(value) = balance <- value
member this.Deposit(amount: float) = this.Balance <- this.Balance + amount
member this.Withdraw(amount: float) = this.Balance <- this.Balance - amount
let account1 = new Account(AccountNumber=8782108,
FirstName="Darren", LastName="Parker",
Balance=1543.33)
new Account(AccountNumber=..., FirstName=..., ...)처럼 생성자에 인자 이름을 붙여서 호출하면, 각 속성이 해당 값으로 초기화되는 형태예요.
자세한 내용은 Constructors (F#) 문서를 참고하세요.
속성 setter를 호출하는 같은 기법은 객체를 반환하는 메서드(예: 팩토리 메서드)에도 그대로 적용돼요.
type Widget() =
member val Width = 1 with get,set
member val Height = 1 with get,set
type WidgetFactory =
static member MakeNewWidget() =
new Widget()
static member AdjustWidget(w: Widget) =
w
let w = WidgetFactory.MakeNewWidget(Width=10)
w.Width // = 10
w.Height // = 1
WidgetFactory.AdjustWidget(w, Height=10)
w.Height // = 10
여기서 WidgetFactory.MakeNewWidget(Width=10)처럼 반환 객체의 속성 값을 지정해서 호출할 수 있어요. 그런 멤버는 사실상 어떤 임의의 작업이라도 수행할 수 있지만, 이 문법은 최종 값을 반환하기 전에 속성 setter를 호출하는 손쉬운 축약 표현(shorthand)이라고 보면 돼요.
더 알아보기
- Parameters and Arguments - F# (전체 문서: 매개변수 패턴, 선택적 매개변수, 참조 전달, 가변 인자)
- Constructors (F#)
- Members (F#)
- F# Language Reference