정리
- 함수의 문법은 Java와 다르다
접근지시어 fun 함수이름(파라미터): 반환타입 { }
- body가 하나의 값으로 간주되는 경우 block을 없앨 수도 있고, block이 없다면 반환 타입을 없앨 수도 있다.
- 함수 파라미터에 기본 값을 설정해줄 수 있다.
- 함수를 호출할 때 특정 파라미터를 지정해 넣어줄 수 있다.
- 가변인자에는 vararg 키워드를 사용하며, 가변인자 함수를 배열과 호출할 때는 * 를 붙여주어야 한다.
함수 선언 문법
두 정수를 받아 더 큰 정수를 반환해보자
Java
public int max(int a, int b) {
if(a > b){
return a;
}
return b;
}
Kotiln
fun max(a: Int, b: Int): Int =
if(a > b) {
a
}else{
b
}
→ public : 접근 지시어. public은 생략 가능
fun max(a: Int, b: Int): Int {
return if(a > b) {
a
}else{
b
}
}
→ if - else 는 Expression이기 때문에 return을 앞으로 빼서 하나의 Expression으로 만들 수 있다
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
→ a, b 둘 다 반환 값이 Int기 때문에 반환 타입 생략 가능하고, if - else를 밑으로 내리지 않고 위로 올려서 정렬 가능
→ 타입 생략이 가능한 이유는, 함수를 쓸 때 중괄호를 쓰는 대신 = 를 사용했기 때문이다.
따라서 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.print(str);
}
}
}
위와 같은 코드가 있다고 했을 때, 많은 코드에서 useNewLine이라는 파라미터에 true를 사용한다면?
→ 이럴 경우 OverLoading 기능 사용한다.
public void repeat(String str, int num) {
repeat(str, num, true);
}
여기서 추가로, num에 3을 넣어서 호출하는 로직이 많다고 한다면?
public void repeat(String str) {
repeat(str, 3, true);
}
Kotiln
Java에서 3번 선언하는 것과는 달리 Kotlin에서는 default parameter라는 것이 존재한다.
fun main(){
repeat("Hello World")
}
fun repeat(
str: String,
num: Int = 3,
useNewLine: Boolean = true
) {
for(i in 1..num){
if(useNewLine) {
println(str)
} else {
print(str)
}
}
}
파라미터에 기본 값을 넣어주게 되면 호출 시 파라미터를 넣지 않더라도 기본 값을 사용하도록 구현된다.
named argument(parameter)
위에서 만든 repeat 함수을 호출할 때, num은 3을 그대로 쓰고 useNewLine은 false를 쓰고 싶다면?
어떤 파라미터에 특정 값을 넣을거라는 것을 함수를 호출하는 쪽에서 명시해줄 수 있다.
fun main(){
repeat("Hello World", useNewLine = false)
}
fun repeat(
str: String,
num: Int = 3,
useNewLine: Boolean = true
) {
for(i in 1..num){
if(useNewLine) {
println(str)
} else {
print(str)
}
}
}
매개변수 이름을 통해 직접 지정이 가능하고, 지정되지 않은 매개변수는 기본 값을 사용한다.
→ 이 기능은 builder를 직접 만들지 않고도, builder의 장점을 가지게 된다. (어떤 파라미터에 어떤 값을 넣었는지 명시적으로 확인 가능함)
⚠️ Kotlin에서 Java 함수를 갖다 사용할 때는 named argument를 사용할 수 없다.
: JVM 상에서 Java가 바이트 코드로 변환됐을 때 파라미터 이름을 보존하고 있지 않다보니, Kotlin에서는 그 이름을 통해서 가져오는 named argument를 사용할 수 없다.
같은 타입의 여러 파라미터 받기(가변인자)
문자열을 N개 받아서 출력해보자
Java
public static void printAll(String.. strings) {
for(String str : strings) {
System.out.println(str);
}
}
Java에서는 타입... 을 쓰면 가변인자를 쓰는구나 하고 이해한다.
이 코드를 호출하는 쪽에서는 아래와 같이 파라미터를 넣어서 호출한다.
String[] array = new String[]{"A", "B", "C"};
printAll(array);
printAll("A", "B", "C");
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)
}
}
→ ...을 타입 뒤에 쓰는 대신 제일 앞에 vararg를 적어주어야 한다.
→ 배열을 바로 넣는 대신 스프레드 연산자(*)를 붙여주어야 한다.
'지식을 쌓아보자 > Kotlin' 카테고리의 다른 글
| [기초] 코틀린에서 상속을 다루는 방법 (0) | 2026.01.18 |
|---|---|
| [기초] 코틀린에서 클래스를 다루는 방법 (0) | 2025.12.15 |
| [기초] 코틀린에서 예외를 다루는 방법 (0) | 2025.12.14 |
| [기초] 코틀린에서 반복문을 다루는 방법 (0) | 2025.12.14 |
| [기초] 코틀린에서 조건문을 다루는 방법 (0) | 2025.12.14 |