오늘은 오랜만에 코틀린 기본 문법에 대해서 이것저것 찾아보면서 시간을 보냈다. 제네릭 같은 부분을 자세히 공부해보고 싶은데 이해가 쉽지 않은 부분이라 시간이 조금 걸릴 것 같다.
여기에는 아주 기본적인 식과 문의 차이에 대해서 적어보았다.
1. Kotlin 식과 문의 차이
프로그래밍에서 식과 문의 차이에 대한 것은 아주 기본적인 것으로 거의 맨 처음에 배웠던 걸로 기억한다. 그런데 이것에 대해서 이제와서 정리하는 이유는 내가 무의식적으로 여태까지 잘 사용은 해왔지만 완벽하게 정리되어 있는 상태가 아니었기 때문이다.
식과 문에 대해 짧게 정리하면 다음과 같다.
식(expression)이란 가장 간단히 말하면 값으로 표현될 수 있는 것이다. 가장 단순한 식은 값을 표현하는 리터럴이다. 식을 연산자로 서로 엮어서 새로운 식을 만들 수 있다.
문(statement)은 값을 만들어내지는 않지만 프로그램의 흐름을 제어하는 역할을 한다. 함수를 호출하고 결과값을 사용하지 않는 경우 처럼 식이 만들어내는 값을 무시한다면 식도 문의 역할을 할 수도 있다. 주로 상태를 변경하거나 입출력을 하는 용도로 사용된다.
코틀린은 if, when과 try ~ catch의 경우도 식으로 쓸 수 있다는 점이 독특하다.
내가 여태까지 무의식적으로 if식과 if문, when문과 when식을 번갈아 가면서 써왔기 때문에 헷갈리는 부분이 있었던 것이다.
먼저 if문과 when문을 먼저 살펴보자. 아래처럼 코드를 간단하게 작성해보았다.
fun main() {
number(5)
println("__________________")
number(1)
number2(5)
println("__________________")
number2(1)
// 실행 결과
// __________________
// 일
// __________________
// 일
}
fun number(a:Int) {
if (a == 1)
println("일")
else if (a == 2)
println("이")
else if (a == 3)
println("삼")
}
fun number2(a:Int) {
when {
a == 1 -> println("일")
a == 2 -> println("이")
a == 3 -> println("삼")
}
}
위의 if와 when은 문으로 쓰였고 완전히 똑같이 동작한다. 조건에 따라 하나의 문을 택해 동작을 하거나 아무것도 하지 않는다. 위의 함수의 경우 1,2,3이 아닌 다른 값이 들어오면 아무런 동작도 하지 않는다. 반드시 여러 조건 중 무조건 하나의 동작은 하도록 만들어주려면 else를 사용하면 된다.
위의 함수 number2에 쓰인 when문은 아래와 같이 간단히 쓸 수 있다는 점도 적어둔다.
when(a) {
1 -> println("일")
2 -> println("이")
3 -> println("삼")
}
그 다음 이번에는 if식과 when식을 살펴보자.
아래와 같이 코드를 간단히 작성해보았다.
fun main() {
number(5)
println("__________________")
number(1)
number2(5)
println("__________________")
number2(1)
// [실행 결과]
// 숫자
// __________________
// 일
// 숫자
// __________________
// 일
}
fun number(a:Int) {
val number = if (a == 1)
"일"
else if (a == 2)
"이"
else if (a == 3)
"삼"
else
"숫자"
println(number)
}
fun number2(a:Int) {
val number = when(a){
1 -> "일"
2 -> "이"
3 -> "삼"
else -> "숫자"
}
println(number)
}
아까 전에 썼던 코드와 비교해보면 식과 문의 차이가 뚜렷하게 보일 것이다. if식과 when식은 무언가를 수행하는 것이 아니라 값 하나를 만들게 된다. 따라서 else가 반드시 필요하다. 직접 else 없이 코드를 작성해보면 다음과 같은 경고문이 뜨는 것을 볼 수 있을 것이다. "if는 식으로 사용되면 반드시 메인 분기와 else 분기가 있어야합니다."
문의 경우에는 조건을 만족하지 않는 경우 단순히 아무런 동작을 하지 않아도 되었지만, 식으로 사용될 경우에는 어떠한 값이라도 반드시 가져야하기 때문에 else가 꼭 필요하다. 위의 함수 안에서 else가 없다면 number라는 변수에 아무런 값도 들어가지 않아 초기화가 되지 못할 것이다.
여태까지 if와 when 식과 문을 명확히 구분해서 사용하지 않고 else가 반드시 있어야한다는 문구를 볼때만 추가해주었었다. 어떨때는 왜 필요하고 어떨때는 왜 필요하지 않은지에 대해 깊게 생각해보지 못했던 것 같다.
이런 if식과 when식은 코드를 짧게 만들어주는 것 이외에도 장점이 있다.
아래 코드는 정수 i가 홀수인지 짝수인지에 따라 변수에 값을 달리하여 담아주는 상황을 나타낸다. i에 따라 변수 a,b,c에 결과적으로 담기는 값은 모두 같게 된다.
var a = ""
if (i % 2 == 0) a = "짝수"
else a = "홀수"
var b = "홀수"
if (i % 2 == 0) b = "짝수"
val c = if (i % 2 == 0) "짝수" else "홀수"
조건에 따라 값이 달라지는 경우에 a, b의 경우 처럼 반드시 var 변수를 사용해야한다. 변수를 선언할 때 초기화를 해야한다면 if 문만 사용하는 경우는 반드시 var로 변수를 정의할 수 밖에 없다. (초기화를 하지 않으면 val로 선언한 다음 값을 넣어줄 수 있다.)
if 식을 이용하면 val로 선언해서 쉽게 불변값으로 만들어 줄 수 있다는 장점이 생긴다.
무의식적으로 알고 사용해온 개념이지만 위와 같이 명쾌하게 정리를 한 번 하니 큰 도움이 된 것 같다. 앞으로 코드를 작성하는데에도 큰 도움이 될 것 같다.
2. 오늘 배운 것
- 식과 문 개념에 대해 확실히 정리할 수 있었다.
- 오랜만에 프로그래밍 언어 기본 문법을 봤더니 꽤 재미있었다. 프레임워크 공부와 동시에 꾸준히 살펴보아야겠다.
'오늘 배운 것' 카테고리의 다른 글
24-05-28 Spring 팀 프로젝트 (0) | 2024.05.28 |
---|---|
24-05-27 알고리즘 문제 풀이 (0) | 2024.05.27 |
24-05-25 알고리즘 문제 풀이 (0) | 2024.05.25 |
24-05-24 Spring 개인 과제 최종 (0) | 2024.05.24 |
24-05-23 JPA의 영속성 컨텍스트와 Spring Data JPA (2) | 2024.05.23 |