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 한 것이다.
'국비교육(22-23)' 카테고리의 다른 글
75일차(3)/Android App(32) : Shared Preferences(2) / menu (1) | 2023.01.26 |
---|---|
75일차(2)/Android App(31) : Shared Preferences(1) (0) | 2023.01.25 |
74일차(5)/Android App(29) : Broadcast Receiver (0) | 2023.01.24 |
74일차(4)/Android App(28) : Bottom Navigation 예제 (0) | 2023.01.24 |
74일차(3)/Android App(27) : ViewPager 예제 (0) | 2023.01.24 |