포스트

Kotlin의 함수 다루기


함수 선언 문법


두 정수를 받아 더 큰 정수를 반환하는 예제


Java

1
2
3
4
5
6
public int max(int a, int b) {
    if(a > b){
        return a;
    }
      return b;
  }


Kotlin으로 수정

1
2
3
4
5
6
fun max(a: Int, b: Int): Int =
    if(a > b){
        a
    }else{
        b
    }

{} (block)를 사용해서 return값을 반환하는 대신에 =를 사용해서 return을 사용하지 않고 작성 가능

  • 단, 하나의 값을 반환하는 경우만 가능


한 줄로 변경 가능

1
fun max(a: Int, b: Int) = if(a > b) a else b

=을 사용하는 경우 반환 타입을 생략 가능

  • 단, {}를 사용하는 경우라면 반환 타입이 Unit이 아닌 경우 명시적으로 작성




default parameter


주어진 문자열을 N번 출력하는 예제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
        }
    }
  }


// 항상 true가 오는 메서드
public void repeat(String str, int num){
  repeat(str, num, true);
  }


// 항상 3번 반복하는 메서드
public void repeat(String str){
  repeat(str, 3, true);
  }
  

Java는 메서드를 오버로딩해서 같은 이름의 메서드를 다른 기능으로 여러개 만들 수 있다.


Kotlin으로 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
// 기본 값을 지정해 줄 수 있고 기본 값이 있는 경우 메서드를 사용할 때 값을 넣지 않으면 기본 값을 사용
fun repeat(str: String,
           num: Int = 5,
           useNewLine: Boolean = true
){
    for(i in 1..num){
        if(useNewLine){
            println(str)
        }else {
            print(str)
        }
    }
}

numuseNewLine에 기본 값을 세팅
메서드를 사용할 때 해당 parameter의 값을 받지 않으면 기본 값을 사용

  • Kotlin도 Java와 동일하게 오버로딩, 오버로드 기능이 있음




named argument (parameter)


  • 이름있는 parameter
  • 장점 : builder를 직접 만들지 않고 builder의 장점을 가질 수 있다.
  • 주의 사항 : Kotlin에서 Java함수를 가져다 사용하는 경우 named argument를 사용할 수 없다.


Kotlin 예시

1
2
3
4
5
fun main(){

  repeat("Hi", useNewLine = false)

}

num: Int = 5로 기본 값이 세팅되어 있기 때문에 useNewLine의 값만 수정해서 넣고 싶은 경우
즉, 5를 계속 써야하는데 쓰고 싶지 않다면 이렇게 named argument를 사용하면 된다.


타입이 같아서 혼동이 있을 수 있는 경우

1
2
3
4
5
6
7
8
9
10
11
12
fun main(){
    
  // 파라미터가 많은 경우 동일한 타입이라 혼동되는 경우 방지
  printNameAndGender(gender = "남자", name = "김용준")

}

fun printNameAndGender(name: String, gender: String){
    println("이름 : $name")
    println("성별 : $gender")
}

이런 식으로 자리가 바뀌는 경우에도 대응할 수 있게 된다.
또한 parameter가 많은 경우에 혼등이 올 수 있는데 이런 상황을 방지해 줌




같은 타입의 여러 parameter 받기 (가변인자)


문자열을 N개 받아 출력하는 예제


Java

1
2
3
4
5
  public static void printAll(String... strings) {
    for (String str : strings) {
      System.out.println(str);
    }
  }

type...을 사용하면 가변인자 사용


배열을 직접 넣거나, comma를 이용해서 여러 parameter를 넣어 준다.

1
2
3
4
String[] array = new String[]{"A", "B", "C"};
printAll(array);

printAll("A", "B", "C");


Kotlin으로 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fun main(){
    
  var array = arrayOf("A", "B", "C")
  // * -> spread 연산자 : 배열안에 있는 것들은 `,`룰 쓰는 것과 같이 꺼내 온다.
  printAll(*array)

}


fun printAll(vararg strings: String){
    for(str in strings){
        println(str)
    }
}

vararg를 같은 타입의 parameter를 여러개 받는다고 선언 (Java의 type...과 동일)
위와 같이 spread연산자를 사용해서 배열에 array에 들어 있는 값들을 ,를 쓰는 것과 같이 꺼내 온다

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.