📝 if문
val max = a
if (a < b)
max = b
📝 if~else문
val max: Int
if (a > b)
max = a
else
max = b
val mac = if (a > b) a else b
fun main() {
val a = 20
val b = 7
val max = if (a > b) {
println("a 선택")
a
} else {
println("b 선택")
b
}
println(max)
}
fun main() {
println("Enter the score : ")
val score = readLine()!!.toDouble()
var grade: Char = 'F'
if (score >= 90.0) {
grade = 'A'
} else if (score >= 80.0 && score <= 89.9) {
grade = 'B'
} else if (score >= 70.0 && score <= 79.9) {
grade = 'C'
}
println("Score : $score, grade : $grade")
}
출력 :
Enter the score :
89.9
Score : 89.9, grade : B
readLine()
: 콘솔로부터 문자열을 입력받는 함수.toDouble()
을 이용해 Double형으로 변환!!.
: non-nul 단정 기호 - 변수에 할당된 값이 null이 아님을 단정하고 컴파일러가 null 검사를 하지 않는다.범위 연산자 : 왼쪽의 값부터 오른쪽의 값까지 포함하는 범위를 계산한다.
변수이름 in 시작값..마지막값
if (score >= 90.0) {
grade = 'A'
} else if (score in 80.0..89.9) {
grade = 'B'
} else if (score in 70.0..79.9) {
grade = 'C'
}
switch~case문
과 비슷하지만 각 수행 문장을 멈추는 break가 필요하지 않다. when (인자) {
인자에 일치하는 값 or 표현식 -> 수행할 문장
인자에 일치하는 범위 -> 수행할 문장
...
else -> 수행할 문장
}
,
를 이용하면 된다.when(x) {
parseInt(s) -> print("일치")
else -> print("불일치")
}
📝 when과 is키워드 함께 사용하기
is
키워드를 사용하면 특정 자료형을 검사할 수 있다.result
에 할당한다.val str = "지묵"
val result = when (str) {
is String -> "문자열입니다."
else -> false
📝 when문과 in 연산자를 조합해서 앞의 식을 작성
fun main() {
println("Enter the score : ")
val score = readLine()!!.toDouble()
var grade: Char = 'F'
when (score) {
in 90.0..100.0 -> grade = 'A'
in 80.0..89.9 -> grade = 'B'
in 70.0..79.9 -> grade = 'C'
!in 70.0..100.0 -> grade = 'F'
}
println("Score : $score, grade : $grade")
}
출력 :
Enter the score :
85.7
Score : 85.7, grade : B
when{
조건 or 표현식 -> 실행할 문장
...
}
fun main() {
println("Enter the score : ")
val score = readLine()!!.toDouble()
var grade: Char = 'F'
when {
score >= 90.0 -> grade = 'A'
score in 80.0..89.9 -> grade = 'B'
score in 70.0..79.9 -> grade = 'C'
score < 70.0 -> grade = 'F'
}
println("Score : $score, grade : $grade")
}
score
를 when문에 직접 사용fun main() {
cases("Hello")
cases(1)
cases(System.currentTimeMillis()) // 현재시간을 Long형으로 반환
}
fun cases(obj: Any) {
when (obj) {
1 -> println("Int : $obj")
"Hello" -> println("String : $obj")
is Long -> println("Long : $obj")
!is String -> println("Not a String")
else -> println("Unknown")
}
}
출력 :
String : Hello
Int : 1
Long : 1658370729747
for (요소 변수 in 컬렉션 or 범위) { 반복할 본문 }
📝 1부터 10까지 더하기
fun main() {
var sum = 0
for (x in 1..10) sum += x
println("sum : $sum")
}
출력 : sum : 55
📝 하행, 상행 및 다양한 반복 방법
for (i in 5..1) print(i) // 아무것도 출력되지 않는다.
⚠️ ⬇️ 이렇게 해야 역순으로 출력 가능 ⚠️
for (i in 5 downTo 1) print(i)
출력 : 54321
or (i in 5 downTo 1 step 2) print(i)
출력 : 531
📝 for문을 활용한 삼각형 출력
fun main() {
print("Enter the lines : ")
val n = readLine()!!.toInt()
for (i in 1..n) {
for (space in 1..(n - i)) print(" ")
for (star in 1..(2 * i - 1)) print("*")
println()
}
}
출력 :
Enter the lines : 5
*
***
*****
*******
*********
📝 1~100의 홀수, 짝수의 합 구하기
fun main() {
var oddTotal = 0
var evenTotal = 0
for (i in 1..100 step 2) oddTotal += i
println("Odd total : $oddTotal")
for (i in 0..99 step 2) evenTotal += i
println("Even total : $evenTotal")
}
출력 :
Odd total : 2500
Even total : 2450
while(조건식) {
본문
...
}
true
면 무한히 반복한다.false
이어야 탈출이 가능하다.📝 while문 응용하여 팩토리얼 계산하기
fun main() {
print("Enter the number : ")
var number = readLine()!!.toInt()
var factorial: Long = 1
while (number > 0) {
factorial *= number
--number
}
println("Factorial : $factorial")
}
while문과의 차이
do {
본문
} while(조건식)
fun main() {
do {
print("Enter an integer : ")
val input = readLine()!!.toInt()
for (i in 0..(input - 1)) {
for (j in 0..(input - 1)) print((i + j) % input + 1)
println()
}
} while (input != 0)
}
출력 :
Enter an integer : 5
12345
23451
34512
45123
51234
Enter an integer : 0
return
: 함수에서 결괏값을 반환하거나 지정된 라벨로 이동한다.break
: for문이나 while문의 조건식에 상관없이 반복문을 끝낸다.continue
: for문이나 while문의 본문을 수행하지 않고 다시 조건식으로 넘어간다.try {...} catch {...}
: try 블록의 본문을 수행하는 도중 예외가 발생하면 catch 블록의 본문을 실행한다.try {...} catch {...} finally {...}
: 예외가 발생해도 finally 블록 본문은 항상 실행한다.fun add(a: Int, b: Int): Int {
return a + b
println(" 여기는 실행 되지 않는다")
}
1. Unit을 명시적으로 반환
fun hello(name: String): Unit {
println(name)
return Unit
}
2. Unit 이름을 생략한 반환
fun hello(name: String): Unit {
println(name)
return
}
3. return문 자체를 생략
fun hello(name: String) {
println(name)
}
fun main() {
retFunc()
}
fun retFunc() {
println("start retFunc")
inlineLambda(13, 3) { a, b ->
val result = a + b
if (result > 10) return
println("result : $result")
}
println("end of retFunc")
}
inline fun inlineLambda(a: Int, b: Int, out: (Int, Int) -> Unit) {
out(a, b)
}
출력 : start retFunc
람다식 함수 이름 라벨이름@ {
...
return@라벨이름
}
라벨이름@
, return@라벨이름
fun main() {
retFunc()
}
fun retFunc() {
println("start retFunc")
inlineLambda(13, 3) lit@ { a, b ->
val result = a + b
if (result > 10) return@lit
println("result : $result")
}
println("end of retFunc")
}
fun inlineLambda(a: Int, b: Int, out: (Int, Int) -> Unit) {
out(a, b)
}
출력 :
start retFunc
end of retFunc
암묵적 라벨 : 람다식 표현식 블록에 직접 라벨을 쓰는 것이 아니라 람다식의 명칭을 그대로 라벨처럼 사용하는 것
fun retFunc() {
println("start retFunc")
inlineLambda(13, 3) { a, b ->
val result = a + b
if (result > 10) return@inlineLambda
println("result : $result")
}
println("end of retFunc")
}
fun retFunc() {
println("start retFunc")
inlineLambda(13, 3 fun(a, b) {
val result = a + b
if (result > 10) return@inlineLambda
println("result : $result")
})
println("end of retFunc")
}
fun(..){..}
형태로 이름 없이 특정 함수의 인자로 넣을 수 있음📝 람다식
val getMessage = lambda@{ num: Int ->
if (num !in 1..100) {
return@lambda "Error"
}
"Sucess"
}
📝 익명함수
val getMessage = fun(num: Int): String {
if (num !in 1..100) {
return "Error"
}
return "Sucess"
}
📫 람다식 : 보통의 경우, 익명함수 : 명시적으로 반환해야 할 것이 여러 개일 경우
📝 람다식
fun greet() = { println("Hello") }
greet()
호출 시 아무 것도 반환되지 않음greet()()
greet()함수가 가지고 있는 함수를 사용하려면 이렇게 표기 해야한다.📝 익명함수
fun greet() = fun() { println("Hello") }
for
, while
, do~while
을 빠져 나온다.📝 break
fun main() {
for (i in 1..5) {
if (i == 3) break
println(i)
}
println()
println("outside")
}
출력 :
1
2
outside
📝 continue
fun main() {
for (i in 1..5) {
if (i == 3) continue
println(i)
}
println()
println("outside")
}
출력 :
1
2
4
5
outside
📍 라벨을 사용하며 중단 위치 바꾸기
fun main() {
labelBreak()
}
fun labelBreak() {
println("labelBreak")
for (i in 1..5) {
second@ for (j in 1..5) {
if (j == 3) break
println("i : $i, j : $j")
}
println("after for j")
}
println("after for i")
}
출력 :
labelBreak
i : 1, j : 1
i : 1, j : 2
after for j
i : 2, j : 1
i : 2, j : 2
after for j
i : 3, j : 1
i : 3, j : 2
after for j
i : 4, j : 1
i : 4, j : 2
after for j
i : 5, j : 1
i : 5, j : 2
after for j
after for i
second@ for
가 중단됨fun main() {
labelBreak()
}
fun labelBreak() {
println("labelBreak")
first@ for (i in 1..5) {
second@ for (j in 1..5) {
if (j == 3) break@first
println("i : $i, j : $j")
}
println("after for j")
}
println("after for i")
}
출력 :
labelBreak
i : 1, j : 1
i : 1, j : 2
after for i
first@ for
가 중단됨continue
도 결과가 같으니 생략~
예외 : 해당 코드가 제대로 작동하지 못하고 중단되는 현상
잘못된 시스템 호출의 문제
존재하지 않는 파일 or 숫자 입력란에 문자 입력 등
0으로 나누기
전원 문제, 망가진 기억 장치 등
예외처리 : 프로그램을 실행할 때 발생할 수 있는 예외에 대비
try~catch
문으로 감싸두기try {
예외 발생 가능성이 있는 문장
} catch (e: 예외 처리 클래스 이름) {
예외를 처리하기 위한 문장
} finally {
반드시 실행되어야 하는 문장
}
fun main() {
val a = 6
val b = 0
val c: Int
try {
c = a / b
} catch (e: Exception) {
println("Exception is handled")
} finally {
println("finally 블록은 항상 실행")
}
}
출력 :
Exception is handled
finally 블록은 항상 실행
fun main() {
val a = 6
val b = 0
val c: Int
try {
c = a / b
} catch (e: ArithmeticException) {
println("Exception is handled ${e.message}")
} finally {
println("finally 블록은 항상 실행")
}
}
출력 :
Exception is handled / by zero
finally 블록은 항상 실행
ArithmeticException
: 0으로 나누는 것 이외의 산술 연산에 대한 예외를 잡아 처리 함e.message
: 에러 원인을 출력해줌