코틀린 함수 정의하기

김종완·2022년 6월 5일
1

코틀린 문법 학습

목록 보기
2/6

식이 본문인 함수


코틀린을 배우면서 흥미로웠던 점은 식이 본문인 함수를 정의할 수 있다는 것이다. 자바에서는 블록이 본문인 함수를 사용하는데 본문이 중괄호{} 로 둘러싸인 함수를 본문이 블록인 함수라 부른다. 식은 자바에서 볼 수 없는 코틀린만의 특징이다.

fun circleArea(radius: Double) = PI*radius*radius

위 함수는 식으로 구성된 코틀린 함수이다. 파리미터 타입은 명시되어 있지만 반환 타입은 명시되있지 않다. 식에서는 마지막에 나온 값이 return 되기 때문이기도 하고 컴파일러가 식을 분석할 수 있어서 타입 추론이 가능하다.

이름 붙은 인자의 장단점


요즘 자바 스프링 프로젝트를 진행하면서 클래스를 생성하고 파라미터 값을 넣을 때 빌더 패턴을 자주 사용했다. 빌더 패턴의 장점으로 파라미터의 순서에 영향을 받지 않고 파라미터 명으로 값을 넣기 때문에 순서에 상관없이 값을 넣을 수 있어서 순서를 모르는 개발자가 보아도 이 값이 어떤 값인지 알 수 있게 된다. 이러한 기능을 코틀린에서는 빌더 패턴을 사용하지 않더라도 지원한다. 단점으로는 아무래도 코드가 좀더 길어질 수 있고, 파라미터 명을 변경한다면 생성 시점에서도 코드를 수정해야하는 번거로움이 따를 수 있다.

nothing, unit, void


함수를 생성하고 반환 값이 없을 때 자바에서는 함수 뒤에 void를 붙여서 반환값이 없음을 명시하고 return null을 표시하지만 코틀린에서는 반환 타입이 없을 경우 표시하지 않아도 된다. 표시하지 않으면 자동으로 반환 타입이 unit으로 설정되고 리턴 타입도 명시해주지 않아도 된다. nothing 타입은 명시적으로 의미 있는 데이터가 없다는 것을 못을 박는다.

import as


외부 패키지의 기능을 사용하려면 보통 패키지 구조의 전체 이름을 사용해야된다. 하지만 코틀린에서는 더 좋은 방법을 제시한다. import 문 끝에 as 를 붙여 임포트한 선언에 새 이름을 부여할 수 있다는 장점이 있다. 이 새 이름은 임포트 디렉티브가 있는 파일 전체 영역에서 유효하다.

import foo.readInt as fooReadInt
import bar.readInt as barReadInt

fun main() {
	val n = fooReadInt()
    val m = barReadInt()
}

식으로 사용할 수 있는 코틀린의 if


보통 간단한 조건을 걸어서 값 2개중 하나를 선택하고 싶다면 삼항 연산자를 활용한다.

a > b ? a : b

자바의 경우 위와같이 ? : 를 사용하지만 코틀린에서는 지원하지 않고 대신에 if 문을 삼항 연사자처럼 사용할 수 있도록 지원한다.

if (a > b) a else b

인상 깊은 코틀린의 for문 사용법


fun forExam1(a: IntArray){
    var sum = 0

    // 루프 변수는 불변 값이다.
    for (x in a) {
        sum += x
    }

    println("Sum: $sum")
}

fun forExam2(a: IntArray){
    for (i in 0..a.lastIndex){
        if (i % 2 == 0){
            a[i] *= 2
        }
    }
}

fun forExam3(a: IntArray){
    for (i in a.indices step 2){
        a[i] *= 2
    }
}

fun main() {
    val a = IntArray(10) { it*it }  // 0, 1, 4, 9, 16, ...
    forExam1(a)
    forExam2(a)
    forExam3(a)
}

위 코드를 통해서 iterable한 객체를 for문으로 각각 객체에 접근할 때 어떻게 접근해야하는지 알 수 있다. 단순하게 인덱스가 필요없이 값에 접근하고자 한다면 for(배열요소이름 in 배열) 과 같이 작성하면 되고 인덱스로 접근할 필요가 있다면 for(i in 배열.indices) 로접근하면 된다. 만약 값이 2씩 증가하게 만들고 싶으면 for(i in 배열.indices step 2)와 같은 방식으로 for문을 구성하면 된다.

profile
개발에 재미를 느끼며 꾸준히 성장하는 개발자 김종완 입니다.

0개의 댓글