기본 인자는 인자의 값이 default로 설정되는 것을 말합니다. JAVA의 경우 동일한 메소드 이름에 인자를 하나 추가하려면, 오버로딩(이름은 같지만 인자나 리턴타입이 다른 메소드)하여 새로운 메소드를 만들어야 합니다.
예를들어, 자바에서 인자 1개를 갖고 있는 foo
메소드가 있는데 인자를 2개인 foo
를 만드려면 기존 메소드를 오버로딩하여 새로운 메소드를 정의해야 합니다.
void foo(int bar) { }
void foo(int bar, int baz) { }
위 처럼 정의하면 아래처럼 호출될 수 있습니다.
foo(1);
foo(1, 2);
하지만 코틀린은 기본 인자(Default arguments, parameters)를 지원하기 때문에, 1개의 메소드만 정의하여 위의 두가지 함수 호출을 가능하게 할 수 있습니다.
기본 인자를 설정하는 방법은, 인자 이름 다음에 인자 = 0
처럼 기본 값을 정의하면 됩니다.
fun foo(bar, baz: Int = 0)
위의 메소드는 아래처럼 인자의 개수가 다르게 호출될 수 있습니다.
foo(1) // baz = 0 은 기본인자로 전달
foo(1, 2)
기본 인자 규칙1
인자와 기본 인자(Default arguments)를 섞어쓰는 경우가 있습니다. 인자를 생략하는 방법에 따라서 메소드를 호출할 때 어떤인자를 생략할 수 있는지 정해집니다. 이런 규칙들에 대해서 알아보겠습니다.
인자로 함수 1개를 받고 기본 인자로 Int 2개 받는 foo
함수가 있습니다.
fun foo(qux: () -> Unit, bar: Int = 0, baz: Int = 1) {
println("bar: $bar")
println("baz: $baz")
qux()
}
함수를 호출할 때 매번 인자 앞에 이름을 명시적으로 써주면 문제가 되지 않습니다.
foo(bar = 2, baz = 1, qux = { println("hello") } )
실행 결과
bar: 2
baz: 1
hello
하지만 인자의 이름을 명시적으로 지정하지 않고 일부 인자를 생략한다면, 코틀린 규칙에 의해서 기본 인자가 적용됩니다.
위의 함수는 아래와 같은 인자들로 호출될 수 있습니다. 인자를 생략한 메소드는 기본인자가 적용되었습니다. 기본 인자로 적용된 변수는 오른쪽에 주석으로 적어놨습니다.
foo({ println("hello") }) // bar = 0 (default), baz = 1 (default)
foo({ println("hello") }, 1) // baz = 1 (default)
foo({ println("hello") }, 1, 2)
기본 인자 규칙2
기본인자가 왼쪽에 오고, 인자가 오른쪽에 오도록 함수를 만들면 어떻게 될까요? 아래 코드는 그렇게 작성한 함수입니다.
fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) {
println("bar: $bar")
println("baz: $baz")
qux()
}
위 함수는 아래 처럼 호출할 수 있습니다. 두번째 인자 baz는 생략되었기 때문에 기본 인자로 전달되었습니다.
qux =
로 함수에 이름을 명시한 것은 컴파일러가 이 인자를 두번째 인자인 baz로 인식하기 때문입니다. 함수 인자가 세번째 인자라는 것을 알려주기 위해 이름을 명시적으로 써주었습니다.
foo(1, qux = { println("hello") }) // baz = 1 (default)
코틀린에서 지원하는 문법으로, 위 코드는 아래처럼 쓸 수도 있습니다. 마지막 함수 인자를 ()
밖으로 뺄 수 있습니다.
foo(1) { println("hello") } // baz = 1 (default)
bar
을 기본인자로 사용하려면 어떻게 해야 할까요?
baz = 2
와 qux = {...}
로 이름을 명시적으로 지정해주면 됩니다. 첫번째 인자인 bar
에 대한 인자가 없기 때문에 기본 인자가 사용됩니다.
foo(baz = 2, qux = { println("hello") }) // bar = 0 (default)
bar
과 baz
모두 기본인자로 사용하려면 아래처럼 함수만 이름을 명시적으로 써주면 됩니다.
foo(qux = { println("hello") }) // bar = 0 (default), baz = 1 (default)
위 코드는 이렇게 쓸수도 있습니다.
foo { println("hello") } // bar = 0 (default), baz = 1 (default)
정리해보면, 기본인자들이 오른쪽에 배치하는 것이 간결하게 메소드를 호출할 수 있게 도와줍니다.
정리
기본 인자에 대해서 알아보았습니다. 사실 대충 인자를 넘겨도 IDE가 어떤 값이 할당되는지 표시해주기 때문에 위의 내용을 몰라도 큰 문제는 없습니다만, 위의 내용은 코틀린 언어를 이해하기 위해 알아두면 좋을 것 같습니다.
참고
Related Posts
- Kotlin - 배열에서 최소 값, 최대 값 찾기
- Kotlin - 2차원 배열 선언, 초기화 방법
- Kotlin - 배열 선언, 초기화 방법
- Kotlin - 리스트, 배열 길이 가져오기
- Kotlin - 리스트에서 최대, 최소 값 찾기
- Kotlin - for 반복문, 배열/리스트 순회
- Kotlin - Timer, 주기적으로 함수 실행
- Kotlin - sleep, 쓰레드 몇 초 지연
- Kotlin - Thread 생성 및 실행
- Kotlin에서 정규표현식 사용하기
- Kotlin - 문자열 길이 계산
- Kotlin - 문자열 비교 방법(equals, ==, compareTo)
- Kotlin - 2개의 배열 하나로 합치기
- Kotlin - 2개의 List 하나로 합치기
- Kotlin - 디렉토리의 모든 파일 리스트 출력
- Kotlin - 리스트 정렬 방법 (sort, sortBy, sortWith)
- Kotlin - 문자열 뒤집기 (Reverse String)
- Kotlin - 랜덤 숫자 생성 (Random, SecureRandom)
- Kotlin - Range, 숫자 범위 표현
- Kotlin - 음수를 양수로 변환, math.abs()
- Kotlin - List를 Set로 변환
- Kotlin - Set를 List로 변환
- Kotlin - 문자열에서 숫자(int)만 추출하는 방법
- Kotlin - Map을 List로 변환하는 방법
- Kotlin - File, Directory가 존재하는지 확인
- Kotlin - List를 Map으로 변환
- Kotlin - List의 중복 요소 제거
- Kotlin - List를 Array로 변환
- Kotlin - 엘비스 연산자 (Elvis Operation)
- Kotlin - Array를 List로 변환
- Kotlin - String을 Float으로 변환
- Kotlin - String을 Double으로 변환
- Kotlin - String을 Int로 변환
- Kotlin - String을 Long으로 변환
- Kotlin - String Null 또는 Empty 체크