Kotlin print(), println(), readLine(), Scanner, REPL

오늘은 Kotlin의 프린트 함수를 사용하는 방법과 콘솔에서 사용자 입력을 받고 파싱하는 방법을 배울 것입니다. 또한 Kotlin REPL에 대해서도 알아볼 것입니다.

Kotlin 프린트 함수

화면에 무언가를 출력하기 위해 다음 두 가지 메서드를 사용합니다:

  • print()
  • println()

print 문은 그 안에 있는 모든 내용을 화면에 출력합니다. println 문은 출력 끝에 개행을 추가합니다. 프린트 문은 내부적으로 System.out.print를 호출합니다. 다음 코드는 프린트 문이 작동하는 것을 보여줍니다:

fun main(args: Array<String>) {
var x = 5
print(x++)
println("Hello World")
print("Do dinasours still exist?\n")
print(false)
print("\nx is $x.")
println(" x Got Updated!!")
print("Is x equal to 6?: ${x == 6}\n")    
}

프린트 문 안에서 변수를 출력하려면, 변수/상수 이름 뒤에 이중 따옴표로 둘러싸인 문자열 리터럴 내부에 달러 기호($)를 사용해야 합니다. 식의 결과를 출력하려면 ${ //식이 여기에 들어갑니다 }를 사용합니다. 위의 코드를 Kotlin 온라인 컴파일러에서 실행한 결과는 아래와 같습니다.

이스케이프 리터럴과 표현식

달러 기호를 이스케이프하고 ${expression}을 문자열로만 처리하고 계산하지 않도록 하려면, 이스케이프할 수 있습니다.

fun main(args: Array<String>) {
val y = "\${2 == 5}"
println("y = ${y}")       
println("Do we use $ to get variables in Python or PHP? Example: ${'$'}x and ${'$'}y")
val z = 5
var str = "$z"
println("z is $str")
str = "\$z"
println("str is $str")
}

간단한 $ 는 변수나 표현식 없이 사용되면 이스케이프 처리되어 문자열의 일부로 취급됩니다.

함수 값 출력

fun sumOfTwo(a: Int, b: Int) : Int{
    return a + b
}

fun main(args: Array<String>) {
val a = 2
val b = 3
println("Value of ${'$'}a and ${'$'}b is : ${sumOfTwo(a,b)}") 
println(println("Printing Value of ${'$'}a and ${'$'}b is : ${sumOfTwo(a,b)}"))    
}

다음 출력이 표시됩니다: 참고: 내부에 print를 전달하면 재귀처럼 동작합니다. 가장 내부에 있는 것이 먼저 출력됩니다. print 문은 Unit (Java의 void에 해당)을 반환합니다.

Kotlin 사용자 입력

사용자 입력을 받으려면 다음 두 가지 방법을 사용할 수 있습니다:

참고: 사용자 입력은 명령 줄 도구가 필요합니다. REPL 또는 IntelliJ를 사용할 수 있습니다. 여기서는 IntelliJ를 사용하겠습니다.

readLine() 사용

readLine()은 null 값이 발생할 수 있는 경우에 대비하여 String? 타입의 값을 반환합니다. 다음 코드는 readLine()을 사용한 예제를 보여줍니다.

fun main(args: Array<String>) {
    println("Enter your name:")
    var name = readLine()
    print("Length is ${name?.length}")
}

보시다시피 우리는 속성에 대한 String 타입 함수를 사용하기 위해 nullable 타입을 언래핑해야 합니다. 값이 null이 아닐 경우에만 String?을 String으로 강제 변환하려면 !!를 사용하세요. 그렇지 않으면 프로그램이 충돌할 수 있습니다. 입력을 정수로 변환 입력 String을 Int로 변환하려면 다음과 같이 합니다:

fun main(args: Array<String>) {
var number = readLine()
try {
        println("Number multiply by 5 is ${number?.toInt()?.times(5)}")
    } catch (ex: NumberFormatException) {
        println("Number not valid")
    }
}

다시 한 번 ?. 연산자를 사용하여 nullable 타입을 우선적으로 Int로 변환합니다. 그런 다음 5로 곱합니다. 연속적인 입력 읽기 아래와 같이 do while 루프를 사용하여 연속적인 입력을 읽을 수 있습니다.

    do {
        line = readLine()

        if (line == "quit") {
            println("Closing Program")
            break
        }

        println("Echo $line")

    } while (true)
}

위 코드의 IntelliJ Command Line 출력은 아래와 같습니다.

split 연산자를 사용하여 여러 값 읽기

구분 기호로 구분된 여러 값을 읽고 아래와 같이 튜플 형식으로 저장할 수 있습니다.

fun readIntegers(separator: Char = ',')
        = readLine()!!.split(separator).map(String::toInt)

fun main(args: Array<String>) {
    println("Enter your values:")
    try {
        val (a, b, c) = readLine()!!.split(' ')
        println("Values are $a $b and $c")
    } catch (ex: IndexOutOfBoundsException) {
        println("Invalid. Missing values")
    }

    try {
        val (x, y, z) = readIntegers()
        println("x is $x y is $y z is $z")
    } catch (ex: IndexOutOfBoundsException) {
        println("Invalid. Missing values")
    }
    catch (ex: NumberFormatException) {
        println("Number not valid")
    }

}

split 함수는 구분 기호가 될 문자를 취합니다. readIntegers() 함수는 각 값을 Int로 변환하기 위해 split에 대한 맵을 사용합니다. 튜플에서 지정된 값보다 작은 값을 입력하면 IndexOutOfBoundsException이 발생합니다. 우리는 두 입력 모두에 try-catch를 사용했습니다. 출력은 다음과 같습니다: 대안으로 튜플 대신 아래에 표시된 대로 리스트를 사용할 수도 있습니다.

val ints: List<String>? = readLine()?.split("|".toRegex())
println(ints)

Kotlin Scanner Class

입력을 받기 위해 Scanner(System.`in`)을 사용할 수 있습니다. 이는 표준 입력 키보드에서 입력을 받습니다. 다음 코드는 동일한 것을 보여줍니다:

fun main(args: Array) {
    val reader = Scanner(System.`in`)
    print("Enter a number: ")

    // nextInt()는 다음 정수를 읽습니다. next()는 문자열을 읽습니다
    var integer:Int = reader.nextInt()

    println("You entered: $integer")

reader.nextInt()는 다음 정수를 읽습니다. reader.next()는 다음 문자열을 읽습니다. reader.nextFloat()는 다음 float를 읽고 이와 같이 계속됩니다. reader.nextLine()은 Scanner를 nextLine으로 전달하고 버퍼를 지웁니다. 다음 코드는 print 문 안에서 다양한 유형의 입력을 읽는 것을 보여줍니다.

import java.util.*

fun main(args: Array) {

    val reader = Scanner(System.`in`)
    print("Enter a number: ")

    try {
        var integer: Int = reader.nextInt()
        println("You entered: $integer")
    } catch (ex: InputMismatchException) {
        println("Enter valid number")
    }
    enterValues(reader)
    //스캐너를 다음 줄로 이동시켜야만 다음에 버퍼 입력이 읽히지 않습니다.
    reader.nextLine()
    enterValues(reader)
}

fun enterValues(reader: Scanner) {
    println("Enter a float/boolean :")
    try {
        print("Values: ${reader.nextFloat()}, ${reader.nextBoolean()}")
    } catch (ex: InputMismatchException) {
        println("First value should be a float, second should be a boolean. (Separated by enter key)")
    }
}

InputMismatchException은 입력이 요청된 유형과 다른 유형일 때 발생합니다. 출력은 아래와 같습니다.

Kotlin REPL

REPL은 Read-Eval-Print-Loop의 약자로, 코드 일부를 대화형 셸에서 직접 실행하는 데 사용됩니다. 이를 위해 코틀린 컴파일러를 터미널/명령 줄에서 시작하여 수행할 수 있습니다.

명령 줄 컴파일러 설치

Mac/Windows/Ubuntu에서 명령 줄 컴파일러를 설치할 수 있습니다. 여기에서 설명한 대로 일반적으로 맥에서는 터미널에서 HomeBrew를 사용하여 코틀린 컴파일러를 설치할 수 있습니다.

brew update
brew install kotlin

설치가 완료되면 터미널/명령 프롬프트에서 kotlinc를 입력하여 REPL을 시작할 수 있습니다. 다음은 REPL에서의 첫 번째 코드입니다. 이것으로 코틀린 출력 함수와 코틀린 REPL에 대한 간단한 소개를 마치겠습니다.

Source:
https://www.digitalocean.com/community/tutorials/kotlin-print-println-readline-scanner-repl