본문 바로가기
  • 개발하는 곰돌이
Programming Language/Kotlin & Java

Kotlin 기본 문법 번외 : 입력과 출력

by 개발하는 곰돌이 2022. 11. 28.

목차

    개요

    이번 포스트에서는 Kotlin의 기본 입력과 출력 방법에 대해 정리하고자 한다.


    Kotlin의 입력

    Kotlin에서의 입력 방법은 크게 다음 3가지로 나뉜다.

    1. Java의 Scanner 클래스를 이용한 입력
    2. readLine() 또는 readln()를 이용한 입력
    3. BufferedReader 클래스를 이용한 입력

    1. Java의 Scanner 클래스를 이용한 입력

    Kotlin은 Java의 클래스를 그대로 가져와서 쓸 수 있기 때문에 Java가 익숙한 경우라면 그냥 Scanner 클래스로 간단하게 입력을 처리할 수 있다. 이 경우에는 사용 방법이 Java와 완전히 동일하기 때문에 Kotlin에 익숙하지 않은 경우라면 이 방법을 사용하는 게 편리할 것이다.

     

    주의할 점은 Kotlin에서는 in이 키워드이기 때문에 반드시 그레이브(`)로 감싸주어야 한다. 또한 Kotlin에서는 new 키워드가 존재하지 않으므로 객체를 생성할 때 생성자를 바로 호출한다는 것도 주의해야 한다.

     

    이 방법은 Java와 동일하게 공백 또는 개행을 기준으로 입력받는다.

    import java.util.Scanner
    
    ...
    
    val sc = Scanner(System.`in`)
    /*
    1 2 3
    */
    val a = sc.nextInt()	// 1
    val b = sc.nextInt()	// 2
    val c = sc.nextInt()	// 3

    2. readLine() 또는 readln()을 이용한 입력

    Kotlin에서는 기본적인 입력으로 readLine()readln()을 제공한다. 두 메소드 모두 줄 단위로 입력을 받아 문자열 형식으로 반환한다. 문자열 형식으로 반환하기 때문에 프로그램에서 필요한 형태에 따라 추가적인 가공이 필요하다. 두 메소드의 차이는 null의 허용 여부에 있는데, readLine()은 null값을 허용하는 String? 타입으로 반환하지만, readln()은 non-null 타입이라는 점이 다르다.

     

    이외에도 readlnOrNull()이라는 메소드가 있긴 한데, 이는 readLine() 메소드를 그대로 호출하는 것이다.

    readln()과 readlnOrNull() 모두 readLine() 기반인 메소드이다.

    /*
    한 줄 입력 받기
    */
    val str = readln()	// 한 줄 입력 받기

    3. BufferedReader 클래스를 이용한 입력

    좀 더 빠른 입력을 받기 위해 BufferedReader 클래스를 사용하는 방법도 있다. 이 방법 역시 2번과 마찬가지로 줄 단위로 입력을 받아 문자열 형식으로 반환하기 때문에 필요에 따라 추가적인 가공이 필요할 수 있다. 하지만 그러한 불편함을 감수하더라도 상당히 큰 속도 차이를 보이기 때문에 속도를 향상시키고 싶을 때 사용하면 된다.

     

    Kotlin에서는 예외처리가 강제되지 않기 때문에 Java와는 다르게 throws나 try-catch로 예외처리를 해주지 않아도 된다.

    https://www.acmicpc.net/blog/view/56 , 각 입력 방법의 속도 차이. BufferedReader와 Scanner는 7배가 넘는 속도 차이가 난다.

    import java.io.BufferedReader
    import java.io.InputStreamReader
    
    ...
    
    val br = BufferedReader(InputStreamReader(System.`in`))
    /*
    BufferedReader로 한 줄 입력 받기
    */
    val str = br.readLine()	// BufferedReader로 한 줄 입력 받기

    Kotlin에서는 BufferedReader 객체를 선언할 때 위와 같이 선언할 수도 있지만 아래와 같이 훨씬 간결하게 선언할 수도 있다. 두 경우 모두 같은 결과를 내므로 위의 방식을 사용할 필요는 없다. 아래의 경우는 추가적인 클래스를 import 할 필요도 없다.

    val br = System.`in`.bufferedReader()
    /*
    BufferedReader로 한 줄 입력 받기
    */
    val str = br.readLine()	// BufferedReader로 한 줄 입력 받기

    Kotlin의 출력

    Kotlin에서의 출력 방법은 크게 다음 2가지로 나뉜다.

    1. print(), println()을 이용한 출력
    2. BufferedWriter 클래스를 이용한 출력

    1. print(), println()을 이용한 출력

    Kotlin의 기본적인 출력 방법은 print(), println() 메소드를 이용하는 것이다. 이 두 메소드는 Java의 System.out.print(), System.out.println()과 완전히 동일하다. 두 메소드는 출력 후 개행여부의 차이가 있다.

    Java의 System.out.println()을 호출하는 println()

    // Kotlin
    print("출력1")
    println("출력2")
    println("출력3")
    
    /*
    출력1출력2
    출력3
    
    */
    // Java
    System.out.print("출력1");
    System.out.println("출력2");
    System.out.println("출력3");
    
    /*
    출력1출력2
    출력3
    
    */

    2. BufferedWriter 클래스를 이용한 출력

    좀 더 빠른 출력을 위해 BufferedWriter 클래스를 이용할 수 있다. 이 방법은 write() 메소드로 버퍼에 출력할 내용을 저장해두고 flush() 메소드로 버퍼를 비우면서 출력하게 된다. 주의할 점은 BufferedReader 클래스의 입력이 문자열만 반환하듯이 write()도 문자열만 버퍼에 저장할 수 있다. 정수를 입력한 경우엔 해당 정수값에 해당하는 유니코드 문자가 버퍼에 저장된다.

     

    flush()이외에도 close()를 이용하여 버퍼의 내용물을 출력할 수 있다. 두 메소드의 차이점은 flush()는 단순히 버퍼를 비워서 출력해주는 역할만 하지만 close()는 버퍼를 비워서 출력한 후 버퍼를 닫아준다는 점이다.

     

    BufferedWriter 또한 BufferedReader와 마찬가지로 Java보다 훨씬 간결하게 선언할 수 있고 throwstry-catch로 예외처리를 해주지 않아도 된다.

    https://www.acmicpc.net/blog/view/57 , 각 출력 방법의 속도 차이. BufferedWriter와 println()은 30배가 넘는 차이가 난다.

    val bw = System.out.BufferedWriter()	// BufferedWriter(OutputStreamWriter(System.out))와 동일
    bw.write("출력\n")
    bw.write(97)
    bw.write("버퍼 이용하기")
    bw.flush()
    bw.close()
    
    /*
    출력
    a버퍼 이용하기
    */

     

    댓글