사용자에게 정수 두 개를 물어보고 그 두 수의 합을 표시하는 프로그램을 작성한다고 하자. 다음은 코틀린으로 작성한 프로그램이다.
fun main() { val a = readLine()!!.toInt() val b = readLine()!!.toInt() println(a + b) }
이 코드가 하는 일을 더 자세히 살펴보자.
• readLine()은 프로그램에서 readLine을 실행하게 하는 호출 식(call expression)이다. readLine은 표준 입력(standard input)에서 한 줄을 읽어서 문자열로 반환해주는 표준 코틀린 함수다.
• !!는 널 아님 단언(not-null assertion)으로, readLine()의 결과가 널(null)인 경우 예외를 발생시킨다. 자바와 달리 코틀린은 어떤 타입이 널 값이 될 수 있는지를 추적하고, 널이 아닌 것이 확실하지 않은 값에 대해 toInt() 함수를 호출하지 못하게 막음으로써 널로 인한 오류를 방지한다. 여기서는 콘솔에서 값을 읽을 경우 readLine()이 널을 반환하지 않을 것이 확실하므로 !!로 널이 될 수 있을 가능성을 무시하게 만든다. 4장 클래스와 객체 다루기에서 널 가능성을 더 자세히 다루겠다.
• readLine()의 결과에 대해 toInt() 함수를 호출한다. toInt()는 코틀린 String 클래스가 제공하는 메서드(method)로, 메서드가 호출된 대상 문자열을 정숫값으로 변환한다. 대상 문자열이 올바른 정숫값의 형태가 아니라면 toInt()는 런타임 오류(runtime error)를 내면서 프로그램을 종료시킨다. 지금은 모든 사용자 입력이 정상이라 가정하고, 오류 처리는 다음 장까지 미뤄두자.
• toInt()를 호출한 결과를 같은 줄에서 정의 중인 a 변수에 저장한다.
• 마찬가지로 b라는 두 번째 변수를 정의하고, 사용자가 입력한 정수를 저장한다.
• 마지막으로 a + b로 두 수의 합을 계산한 다음, 결과를 println() 함수에 전달한다. println()은 인자로 받은 값을 표준 출력에 출력한다.