내가 코틀린을 배우면서 코틀린에 있어 특별하다고 생각되는 부분들 또는 메모해두어야 할 점들을 여기에 적어놓으려고 한다.
Overloading
코틀린에서는 overloading을 지원한다. 이는 같은 스코프 내에서 서로 다른 파라미터 셋을 가지는 이름이 같은 함수들을 사용할 수 있다는 것인데. 아래 예시를 보자.
예시
fun main() {
println(add(1, 2))
println(add("a", "b"))
}
fun add (a: Int, b: Int): Int {
println("int added...")
return a + b
}
fun add (a: String, b: String): String {
println("string added...")
return a + b
}
출력
int added...
3
string added...
ab
두 함수 모두 이름이 add 이지만, 어떤 파라미터가 들어가느냐에 따라서 어떤 함수가 실행될지가 결정된다. 이를 overloading이라고 한다. 이름이 같더라도 파라미터의 자료형이 다르거나, 파라미터의 갯수가 다르다면 서로 다른 함수로 동작할 수 있다. 다만, 파라미터의 자료형과 개수가 같다면 함수에서 정의한 파라미터의 이름과 상관 없이 Conflicting overloads 에러로 인해 오버로딩을 할 수 없다.
Argument를 다루는 법
파라미터 지정
아래 예시를 보자.
예시
fun main() {
deliverItem("book")
deliverItem("note", 3)
deliverItem("present", 2, "Seoul")
}
fun deliverItem (name: String, count: Int = 1, destination: String = "집") {
println("${count} ${name} delivered to ${destination}.")
}
출력
1 book delivered to 집.
3 note delivered to 집.
2 present delivered to Seoul.
위의 경우 deliverItem 함수의 count와 destination 파라미터들에는 기본값들이 설정되어 있다. 그러나 count만을 기본값으로 사용하고 destination의 값을 바꿔주고 싶을 때에는 어떻게 해야할까? 이 경우에는 파라미터에 어떤 값을 다음과 같이 대응시키는 방식으로 count 값을 지정하는 것을 피하고 파라미터를 바꿀 수 있다.
예시
fun main() {
deliverItem("book", destination="Seoul")
}
fun deliverItem (name: String, count: Int = 1, destination: String = "집") {
println("${count} ${name} delivered to ${destination}.")
}
출력
1 book delivered to Seoul.
위와 같은 방식을 사용하면 파라미터가 많은 함수들에 유용하게 사용될 수 있다.
Vararg
만약 파라미터를 여러 개를 넘겨주고 싶을 때는 어떻게 해야할까? 단도직입적으로 vararg를 사용하면 된다. 아래 예시를 보자.
예시
fun main() {
println(addNums(1, 5, 8, 5))
println(addNums(1, 2, 3))
}
fun addNums(vararg numbers: Int): Int {
var sum = 0
for (n in numbers) {
sum += n
}
return sum
}
출력
19
6
vararg를 사용함으로써 몇 개의 파라미터가 들어올 지 지정하지 않아도 위와 같이 여러 argument들을 받아와 사용할 수 있다. 이 경우 Iteration이 가능하여, for문 등을 사용하여 들어온 파라미터들을 사용할 수 있다.
또한, vararg는 파라미터의 개수가 지정되지 않으므로, 함수에서 다른 받아와야 할 파라미터들 이외에도 vararg로 파라미터들을 받아오고 싶을 때에는 파라미터 셋의 가장 마지막에 위치시켜야 한다. 예를 들어, 다음과 같이 작성하여야 한다.
예시
fun main() {
family("Misun", "Hyungman", "Jjanggu", "Jjanga")
}
fun family(mum: String, dad: String, vararg children: String) {
println("${mum} is mum,")
println("${dad} is dad,")
for (c in children) {
print("${c}, ")
}
println("are children")
}
출력
Misun is mum,
Hyungman is dad,
Jjanggu, Jjanga, are children
infix 함수
infix 키워드를 함수 앞에 붙이면 함수를 마치 연산자처럼 사용할 수 있게 해준다. 함수에서 this는 해당 함수를 불러오는 객체를 가리키게 된다. infix 함수를 선언하면 다음과 같이 두 가지 방식으로 함수를 사용할 수 있다.
예시
fun main() {
println(6 multiply 4)
println(6.multiply(4))
}
infix fun Int.multiply(x: Int): Int = this * x
출력
24
24
출처
https://www.youtube.com/playlist?list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN
'Kotlin > Basic' 카테고리의 다른 글
Kotlin - 컬렉션 함수 (Collection Functions) (0) | 2021.05.24 |
---|---|
Kotlin - Null 처리와 동일성 확인 (Null Safety and Equality) (0) | 2021.05.22 |
Kotlin - 제너릭 (Generic) (0) | 2021.05.22 |
Kotlin - 클래스의 다형성 (Polymorphism) (0) | 2021.05.22 |
Kotlin - 고차함수와 스코프함수 (Higher Order Function and Scope Function) (0) | 2021.05.21 |