8장 코틀린에서 함수를 다루는 방법
2024. 1. 14. 00:56ㆍkotlin/문법
해당 내용은 인프런 최태현님의 자바 개발자를 위한 코틀린 입문 강의에서 발췌한 내용입니다.
목차
- 함수 선언 방법
- default parameter
- named argument (parameter)
- 같은 타입의 여러 파라미터 받기(가변인자)
함수 선언 방법
두 정수를 받아 더 큰 정수를 반환하는 예제
JAVA
public int max(int a, int b) {
if (a > b) {
return a;
}
return b;
}
Kotlin
fun max(a: Int, b: Int): Int {
if ( a > b) {
return a
}
return b
}
⏬️ (expression 적용)
===================================================================
fun max(a: Int, b: Int): Int {
return if ( a > b) {
a
} else {
b
}
}
⏬️ (중괄호 삭제)
===================================================================
fun max(a: Int, b: Int): Int =
if ( a > b) {
a
} else {
b
}
// → 함수가 하나의 결과값이면 block 대신 = 사용가능!
⏬️ (반환타입 및 중괄호 삭제)
===================================================================
fun max(a: Int, b: Int) = if (a > b) a else b
// → 반환 타입을 생략가능한 이유는 =을 사용했기 때문이다. 즉, =을 사용하는 경우 반환 타입생략 가능!
// block을 사용하는 경우에는 반환 타입이 Unit이 아니라면 명시적으로 타입을 작성해줘야한다.
default parameter
주어진 문자열을 N번 출력하는 예제
JAVA
public void repeat(String str, int num, boolean useNewLine) {
for (int i=1; i<=num; i++) {
if (useNewLine) {
System.out.println(str);
} else {
System.out.println(str);
}
}
}
// 만약 많은 코드에서 useNewLine에 true를 사용한다면?? 자바에서는 오버로딩 활용!
⏬️ (오버로딩 사용)
===================================================================
public void reapeat(String str, int num) {
repeat(str, num, true);
}
⏬️ (한번 더 오버로딩 사용)
===================================================================
public void reapeat(String str, int num) {
repeat(str, 3, true);
}
// 중복이 너무 많다... ㅠㅠ 메소드를 3개나 만들어야하나!?
Kotlin
fun main() {
repeat("Hello World")
repeat("Hello World", 3, true)
}
// 밖에서 파라미터를 넣어주지 않으면 기본값을 사용하자!
fun repeat(str: String, num: Int = 3, useNewLine: Boolean = true) {
for (i in 1..num) {
if(useNewLine) {
println(str)
} else {
print(str)
}
}
}
// 그런데,, repeat을 호출할 때 num은 그대로 3을 쓰고싶고 useNewLine은 false를
// 쓰고 싶은데?
named argument
Kotlin
fun main() {
repeat("Hello World")
repeat("Hello World", 3, true)
repeat("Hello Wold", useNewLine = false) // named argument적용!
}
// 밖에서 파라미터를 넣어주지 않으면 기본값을 사용하자!
fun repeat(str: String, num: Int = 3, useNewLine: Boolean = true) {
for (i in 1..num) {
if(useNewLine) {
println(str)
} else {
print(str)
}
}
}
// → 매개변수 이름을 통해 직접 지정 지정되지 않은 매개변수는 기본값 사용!
// builder를 만들지 않고 builder의 장점을 가질 수 있다!!
// Ex) repeat("Hello World", num = 4, useNewLine = false)
- kotlin에서 Java 함수를 가져다 사용할 때는 named argument를 사용할 수 없다!
- 이유는 Kotlin에서 java코드를 쓸 때 JVM 상에서 Java가 바이트 코드로 변환됐을 때
parameter 이름을 보존하고 있지 않다 보니까 사용하지 못한다!
- 이유는 Kotlin에서 java코드를 쓸 때 JVM 상에서 Java가 바이트 코드로 변환됐을 때
같은 타입의 여러 파라미터 받기 (가변인자)
문자열 N개 받아 출력하는 예제
JAVA
public main() {
String[] array = new String[]{"A", "B", "C"};
printAll(array);
printAll("A", "B", "C");
}
public void printAll(String... strings) {
for (String str : strings) {
System.out.println(str);
}
}
Kotlin
fun main() {
printAll("A", "B", "C")
val array = arrayOf("A", "B", "C")
printAll(*array)
// 배열을 바로 넣는대신 스프레드 연산자 (*)를 붙여주어야 한다.
}
fun printAll(vararg strings: String) {
for (str in strings) {
println(str)
}
}
정리하기
- 함수의 문법은 Java와 다른다!
- body가 하나의 값으로 간주되는 경우 block을 없앨 수도 있고, block이 없다면 반환타입을 없앨 수도 있다.
Ex) fun max(a: Int, b: Int): Int = if(a > b) a else b
fun max(a: Int, b: Int) = if (a > b) a else b
- 함수 파라미터에 default parameter라 해서 기본 값을 설정해줄 수 있다.
- 함수를 호출할 때 특정 파라미터를 지정해서 넣어줄 수 있다. ( builder를 쓰는듯한..?)
- 가변인자에는 vararg 키워드를 사용하며, 가변인자 함수를 배열과 호출할 때는 *를 붙여주어야한다.
'kotlin > 문법' 카테고리의 다른 글
7장 코틀린에서 예외를 다루는 방법 (0) | 2024.01.14 |
---|---|
5장. 코틀린에서 제어문을 다루는 방법 (0) | 2023.09.07 |
코틀린에서 null을 다루는 방법 (3) | 2023.06.05 |
코틀린에서 변수를 다루는 방법 (0) | 2023.06.05 |