일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- array
- Github
- string
- numpy
- PySpark
- Excel
- Apache
- PostgreSQL
- dataframe
- c#
- Python
- Java
- GIT
- math
- matplotlib
- SQL
- list
- 파이썬
- Google Excel
- PANDAS
- gas
- Tkinter
- hive
- Mac
- Google Spreadsheet
- google apps script
- Redshift
- django
- Kotlin
- Today
- Total
달나라 노트
Kotlin - Functions 본문
Original source = play.kotlinlang.org/byExample/01_introduction/01_Hello%20world
Kotlin에서 Function을 어떻게 만들고 사용하는지 봅시다.
fun fun_name(parameter1: data_type1, parameter2: data_type1, ...): return_type {
contents...
return ...
}
기본적으로 Kotlin에서의 function은 위처럼 만들 수 있습니다.
fun = function 선언의 의미
fun_name = 함수 이름
parameter1 = 첫 번째 parameter 이름
data_type1 = parameter1의 data type
parameter2 = 두 번째 parameter 이름
data_type2 = parameter2의 data type
return_type = 함수가 어떤 값을 return하는 경우 return 값의 data type.(return하지 않는다면 이 값을 적지 않거나 Unit으로 적으면 됨.)
contents = 함수 내용
return = return값이 있을 경우 사용하는 키워드
fun showText(x: String): Unit {
println(x)
}
fun showPrefixText(x: String, prefix: String = "P") {
println("[$prefix] $x")
}
fun sum(x: Int, y: Int): Int {
return x + y
}
fun multiply(x: Int, y: Int) = x * y
fun main() {
showText("This is Text")
showPrefixText("Apple", "Red")
showPrefixText("Apple")
showPrefixText(prefix = "Red", x = "Apple")
println(sum(1, 2))
println(multiply(2, 3))
}
-- Result
This is Text
[Red] Apple
[P] Apple
[Red] Apple
3
6
위 코드는 예시로 사용한 코드입니다.
showText 함수부터 봅시다.
showText함수는 x라는 String type의 parameter를 받고 Unit이라고 적힌 걸 보아하니 return값은 없습니다.
함수 내용은 println만 있고 return 키워드가 없으니 맞는말이죠.
showPrefixText 함수를 봅시다.
이 함수는 2개의 parameter를 받습니다. x와 prefix이지요.
x와 prefix는 모두 String type입니다.
근데 prefix: String = "P"라고 되어있습니다.
이건 prefix parameter의 기본값을 설정해주는 겁니다.
이 함수를 사용할 때 prefix가 명시되지 않으면 P라는 값을 기본으로 사용하는것이죠.
그리고 showPrefixText 함수의 내용을 보면 아래와 같은 내용이 적혀있습니다.
"[$prefix] $x"
위처럼 parameter 앞에 $ 기호를 붙이면 쌍따옴표로 감싼 text 안에 변수를 삽입할 수 있습니다.
마치 python의 {}.format같은 기능이죠.
fun showItemDetail(name: String, color: String) {
println("This is ${name}. Its color is ${color}.")
}
fun main() {
showItemDetail("IPhone", "Blue")
showItemDetail("IPhone", "Green")
showItemDetail("IPhone", "White")
showItemDetail("Galaxy S21", "Violet")
showItemDetail("Galaxy S21", "Pink")
showItemDetail("Galaxy S21", "Black")
}
-- Result
This is IPhone 12. Its color is Blue.
This is IPhone 12. Its color is Green.
This is IPhone 12. Its color is White.
This is Galaxy S21. Its color is Violet.
This is Galaxy S21. Its color is Pink.
This is Galaxy S21. Its color is Black.
format 구문은 위처럼 사용할 수도 있습니다. $기호와 중괄호{}를 동시에 사용하면 좀 더 보기에 구분이 명확해지죠.
sum function을 봅시다.
x, y 2개의 parameter를 받고 둘 다 Int type입니다.
return 키워드가 있고 x + y의 값은 당연히 int일테니 return type도 int라고 적혀있네요.
muliply function을 봅시다.
이건 기존의 function과는 형태가 다르죠.
python의 if 한 줄 쓰기처럼 function을 한줄로 선언한 것입니다.
main function을 봅시다.
실제 코드를 실행하면 main function 안에 있는 내용들이 실행됩니다. (main function이 없으면 함수를 많이 정의해놔도 output이 없을거예요.)
필수적인 부분이죠.
대부분은 실행 결과가 이해갈겁니다.
show
showPrefixText("Apple", "Red")
showPrefixText("Apple")
showPrefixText(prefix = "Red", x = "Apple")
위 부분만 한번 체크해봅시다.
showPrefixText 함수를 만들었을 때 prameter의 순서는 (x, prefix)였습니다.
따라서 parameter를 부여할 때에도 이 순서에 맞게 부여를 해야합니다.
다만 세 번째처럼 parameter_name = value와 같이 어떤 parameter에 어떤 값을 부여할지 적어준다면 순서가 바뀌어도 상관없습니다.
fun main() {
fun showAll(vararg x: String) {
for (i in x) println(i)
}
showAll("Blue", "White", "Sky", "Black", "Green", "Red", "Yellow")
fun printAllwithPrefix(vararg x: String, prefix: String) {
for (i in x) println(prefix + i)
}
printAllwithPrefix("Blue", "White", "Sky", "Black", "Green", "Red", "Yellow", prefix = "color")
}
-- Result
Blue
White
Sky
Black
Green
Red
Yellow
color_Blue
color_White
color_Sky
color_Black
color_Green
color_Red
color_Yellow
Kotlin function에는 vararg라는 키워드를 제공합니다.
function parameter 앞에 vararg 키워드를 명시해주면 이 paramter는 몇개의 값이건 받을 수 있습니다.
showAll함수를 보면 x가 vararg로 셋팅되었으며 String data type으로 설정되었습니다.
이는 x parameter가 String type인 값들을 몇개든 받을 수 있다는 것입니다.
그리고 여러 개의 값을 받아 x에 list 비슷한 형태로 저장되고 이를 반복문을 통해 print해주는 것을 알 수 있죠.
showAllwithPrefix 함수를 봅시다.
마찬가지로 x를 vararg로 설정하였지만 prefix라는 parameter를 하나 더 받습니다.
이렇게 vararg 인자 외에도 다른 인자를 또 받을 수도 있습니다.
이번엔 infix function입니다.
좀 특이한 function인데요.
fun main() {
println("Hi".repeat(2))
infix fun Int.test(x: String): String {
return x.repeat(this)
}
println(2 test("Bye"))
}
-- Result
HiHi
ByeBye
먼저 infix function을 보기 전에 repeat이라는 내장함수를 알아봅시다.
repeat 함수는 아래처럼 사용가능하며 문자열을 n번만큼 반복하여 연결한 문자열을 반환합니다.
문자열.repeat(n)
그래서 println("Hi".repeat(2))의 결과는 HiHi인거죠.
infix function을 만들 때에는 fun 키워드 앞에 infix라는 키워드를 붙여서 만듭니다.
infix function은 간단하게 말하면 parameter를 2개 받는 function을 좀 간단하게 사용하기 위해서 사용하는 것입니다.
infix fun Int.test(x: String): String
위 문장을 해석해보면
Int = infix function이 받는 첫 번째 인자.(Int type)
test = infix function의 이름
x: String = infix function이 받는 두 번째 인자.(String type)
: String = return 값이 String임.
return x.repeat(this)
이제 위 부분을 해석해봅시다.
x = infix function의 x 인자가 받은 값.
repeat(this) = x를 this만큼 반복하여 연결한 문자열을 return. 여기서 this는 infix function에서 받은 첫 번째 인자를 의미.
println(2 test("Bye"))
위 부분이 infix function의 호출 방법인데요.
Int.test(x:String)과 동일한 순서로 호출을 하면 됩니다.
2 test("Bye")라면
Int = 2
x = "Bye"가 되는거죠.
infix function의 다른 예시를 봅시다.
fun main() {
infix fun String.test2(x: String): String {
return this + x
}
println("this parameter " test2("x parameter"))
}
-- Result
this parameter x parameter
위 코드를 보면 좀 더 이해가 되실까요?
test2라는 Infix function은 첫 번쨰 인자로 String, 두 번쨰 인자로 x(String)을 받고 String type의 데이터를 return합니다.
또한 test2 앞에 적힌 첫 번째 String인자는 infix function의 코드 블럭에서 this라는 변수에 저장되어 사용됩니다.
"this parameter " test2("x paramter")
위 코드에서
String = "this parameter"
x = "x parameter"
위처럼 할당되는것이죠.
이번엔 operator function이라는 것을 알아봅시다.
fun main() {
operator fun Int.times(x: String): String {
return x.repeat(this)
}
println(2 * "Bye ")
}
-- Result
Bye Bye
위 예시를 보면 infix function의 예시와 거의 동일합니다.
차이점은 infix 키워드 대신 operator 키워드를 사용했다는 것이며
함수 호출 시 함수의 이름인 times 대신 * 기호를 사용했다는 것입니다.
operator function은 특정한 함수명을 operator function으로 선언했을 때 함수명 대신 미리 정의된 어떠한 기호를 이용하여 해당 함수를 호출 할 수 있는 함수입니다.
위의 경우 operator function으로 times라는 함수를 선언할 경우 * 기호로 해당 함수를 호출 할 수 있습니다.
추가
return의 다른 사용법에 대해 알아봅시다.
이제까지 return은 function에서 어떤 값을 반환하기 위해 사용되었습니다.
근데 다음과 같이 적으면 어떻게될까요?
fun test() {
println("Test line 1")
return
println("test line 2")
}
fun main() {
test()
println("Test line 3")
}
-- Result
Test line 1
Test line 3
위 코드의 결과를 보면 line 1, 3만 출력되고 line 2는 출력되지 않았습니다.
그 이유는 return 때문에 그렇습니다.
function 안에 어떠한 값도 return하지 않는 채로 그냥 return 키워드만 적어주게되면 function이 실행되면서 해당 return 키워드를 만났을 때 바로 function을 종료합니다.
단, 해당 function만 종료하는거지 모든 프로그램의 전체 실행문을 종료하지 않습니다.
따라서 위 결과를 단계별로 보면 다음과 같습니다.
Step 1. test function의 실행으로 line 1이 출력되고,
Step 2. return을 만나 test function 종료. -> 따라서 line 2 출력안됨
Step 3. test function과는 별도로 존재하는 line 3가 출력됨
return을 잘 이용하면 exception 대응에 유용하게 사용할 수 있습니다.
'Kotlin' 카테고리의 다른 글
Kotlin - Inheritance (상속) (0) | 2021.03.15 |
---|---|
Kotlin - Class (0) | 2021.03.15 |
Kotlin - Null (0) | 2021.03.15 |
Kotlin - Variable (0) | 2021.03.15 |
Kotlin - Hello World! (0) | 2021.03.15 |