국비교육(22-23)

75일차(1)/Android App(30) : Kotlin loop, try-catch

서리/Seori 2023. 1. 25. 14:04

75일차(1)/Android App(30) : Kotlin loop, try-catch

 

 

- 코틀린 모듈에 예제추가

 

Step15_loop 반복문

package com.example.kotlin_test

fun main(){
    var names=listOf("바나나","딸기","복숭아","사과","오렌지")
    for(i in 0..4){
        //i는 0에서 4까지 순서대로 참조가 된다.
        //val tmp=names[i]
        val tmp=names.get(i)
        println(tmp)
    }

    println("-----------------")
    //java 확장 for문처럼 item만 순서대로 참조할 수 있다.
    for(i in 0 until names.size){
        val tmp=names[i]
        println(tmp)
    }
    println("-----------------")
    for(num in 0..10 step 2){
        println(num)
    }
    println("-----------------")
    for(num in 10 downTo 0){
        println(num)
    }
    println("-----------------")
    for(num in 10 downTo 0 step 2){
        println(num)
    }
    println("-----------------")
    //names 배열의 아이템을 역순으로 참조하려면...
    for(i in names.size-1 downTo 0){
        var tmp=names[i]
        println(tmp)
    }
    println("-----------------")
    names.forEach{
        println(it)
    }
}

 

- 어떤 배열을 반복문 돌면서 access하고자 할 경우 for 문을 사용하면 된다.

 

for(i in 0..4){ 
}

- for( i in a .. b ) : a부터 b까지를 반복문으로 표현

- 위 코드는 0부터 4까지 들어있는 배열인데 거기서부터 숫자를 하나씩 빼 온다는 뜻이다.

 

- 배열 [ ] 로 참조할 수도 있고 .get() 형태로 메소드를 쓸 수도 있다.

 

- until : java 의 확장 for문처럼 item만 순서대로 참조할 수 있다.

 

- 이 부분은 코딩하는 것이 아니다. 입력하거나 자동완성시키면 >= 기호를 알아서 보여준다.

 

 

ex)

0 .. 10 => [ 0,1,2,3, ..., 10 ]

- 순서대로 하나씩 참조하기

0 .. 10 step 2 => [ 0,2,4, ..., 10 ]

- 2씩 증가하면서 10까지 참조하기

10 downTo 0 => [ 10,9,8, ..., 0 ]

- 10에서부터 거꾸로 0까지, 역순으로 참조하기

10 downTo 0 step 2 => [ 10,8,6, ..., 0 ]

- 10에서부터 거꾸로 0까지, 역순으로 2씩 감소시키면서 참조하기

 

- 이런 모양의 배열이라고 생각하면 된다.

 

 

for ( a in [0,1,2,3, ...] ){
	a에는 배열에 저장된 아이템이 순서대로 참조된다.
}

 

- 이런 배열을 순서대로 하나씩 참조하는 것

- 숫자가 들어있는 배열을 얻어내는 식이다.

 

- forEach 문 안에서는 it을 참조할 수 있다.

 

- 코틀린은 java에 비해 코딩양이 상당히 줄어든다.

 


 

Step16_trycatch

package com.example.kotlin_test

fun main(){
    var str="1000"
    var str2="천"

    try {
        var result = Integer.parseInt(str)
        println("result:${result}")

        var result2 = Integer.parseInt(str2)
        println("result2:${result2}")
    }catch(nfe: java.lang.NumberFormatException){
        nfe.printStackTrace()
    }
    println("main 함수가 정상 종료 됩니다.")
}

 

- str 에는 문자열 형태로 숫자가 들어가 있다

- str2 에는 문자열이 들어가 있다.

 

- str2의 문자를 숫자로 바꾸려고 하면 이렇게 오류발생 (NumberFormatException)

- 오류가 발생해도 정상적으로 종료되게 하려면 try~catch문으로 묶어주어야 한다.

 

- java라면 이렇게 적었겠지만, 코틀린 문법에 맞추어 타입적기 ( :type )

 

- result2에서 예외가 발생했음에도 불구하고, main함수가 정상 종료되었다.

 


 

Step16_trycatch2

package com.example.kotlin_test

fun main(){
    val isRun = true
    //아래와 같은 if문이 성립하듯이
    var result = if(isRun){
        "달려요"
    }else{
        "달리지 않아요"
    }
    //아래와 같은 try~catch 문이 가능하다.
    var str="1000"
    var str2="천"

    var result2=try {
        //예외가 발생하지 않는 경우 대입될 값
        Integer.parseInt(str2)
    }catch(nfe: java.lang.NumberFormatException){
        //예외가 발생하는 경우 대입될 값
        0
    }
    println("result2:${result2}")
}

 

- java에서 이것은 에러. 문법오류이다. if문이 수행된 결과를 변수에 담을 수도 없다..

 

- 하지만 코틀린에서는 이렇게 작성 가능하다.

- 각각 if일 경우, else일 경우 이 값을 반환하는 것이다.

 

- 코틀린에서는 3항연산자를 쓸 수 없다.

 

- 수행할 코드가 없다면 중괄호는 생략 가능하다.

 

- 예외가 발생할 경우 0이 들어가도록 했다.

- 그러면 result2 에 대해 0이 반환된다.

- 이렇게 try~catch 문을 사용해서 나온 결과에 따라 다른 값을 넣어줄 수도 있다.

 


 

Step17_InputOutput

package com.example.kotlin_test

import java.io.BufferedReader
import java.io.FileReader
import java.io.InputStream

/*
    kotlin 에서 입출력은 java의 클래스를 import해서 사용해야 한다.
 */
fun main(){
    //키보드와 연결된 inputStream
    var kbd : InputStream = System.`in`
    // C:\acorn202210\myFolder\memo.txt 파일에서 문자열을 읽어들이려면?
    // in java =>    FileReader fr = new FileReader( File )

    //FileReader
    var fr=FileReader("C:/acorn202210/myFolder/memo.txt")
    //BufferedReader
    val br=BufferedReader(fr)

    //반복문 돌면서
    while (true) {
        //한줄씩 읽어들이고
        val line = br.readLine()
        //만일 더이상 읽을 문자열이 없다면 반복문 탈출
        if (line == null) break
        println(line)
    }
}

 

var kbd : InputStream = System.`in`

- System.in 은 키보드와 연결된 inputStream이다.

- 이것을 변수에 담고싶다면 이렇게 담아준다.

 

- 코틀린에 in이 예약어로 있어서, 예약어로 사용되지 않기 위해서 이렇게 `백틱` 으로 감쌌다.

 

- import된 것을 보면 java 패키지를 사용하고 있다. java의 클래스를 import해서 사용하는 것.

- kotlin 에서 입출력은 java의 클래스를 import해서 사용해야 한다.

 


 

Q) inputStream이나 nfe는 코틀린에서 자주 안 써서 클래스를 안 만든것인지? 왜 java 패키지를 가져와 쓰는지?

 

A) Kotlin은 java, javascript, C 언어 등에서 모두 변환하여 사용할 수 있는데,

  java에서만 유효한 data type은 코틀린으로 따로 만들어두지 않음.

  코틀린으로 java를 대신할 때만 import해서 사용한다.

- nfc나 inputStream과 같은 데이터타입은 javascript, c 에는 없다.

 

- java에서 그대로 입출력하려면 필요하다. (java 클래스 import)

 


 

- java.io 패키지에 들어있는 객체를 그대로 쓰고있다

 

- FileReader 객체는 읽어들이는 기능이 좀 불편하다.

- BufferedReader 로 포장해서 readLine() 메소드를 사용한다.

 

- 단 이렇게 작성하면 한줄밖에 못 읽어들인다. 반복문 필요!

 

while (true) {        
	val line = br.readLine()        
	if (line == null) break  
    println(line)
	}

- 반복문을 사용해줘야 memo 파일 안의 내용을 전부 읽을 수 있다.

- while문을 java와 똑같이 사용할 수 있다.

 

- new 없이 그냥 이렇게 넣어서 바로 사용할 수 있다.

- 이런 작업을 처리하기 위해서 java 클래스를 import 한 것이다.