Notice
Recent Posts
Recent Comments
Link
Today
Total
관리 메뉴

woodi

Kotlin - 문(statement)과 식(experssion)의 구분 본문

Language

Kotlin - 문(statement)과 식(experssion)의 구분

sungwoo jang 2023. 5. 9. 22:42

코틀린을 접하면서 헷갈렸던 개념 중 하나가 문(statement)과 식(experssion) 이다.

평소에 아무렇지 않게 사용했지만 이번 포스팅을 통해 자세히 알아보자.

 

Kotlin에서의 문은 아래와 같은 형태로 사용된다.

문(statement) 

1. Assignements

    아래와 같이 값을 할당하거나 연산하거나 변수를 안전하게 처리하고자 하는경우는 문에 해당한다.

    1) simple : "="

    2) operator : '+=' | '-=' | '*=' | '/=' | '%='

    3) safe :  a?.c

 

2. Loop

    리스트와 같이 순회 가능한 형태를 반복하는 반복문도 문에 해당한다.  

    1) while-loop

    2) do-while-loop

    3) for-loop

아래 두가지 코드는 같은 동작의 반복문 코드이다.

for(VarDecl in C)
when(val $iterator = C.iterator()) {
  else -> while ($iterator.hasNext()) {
	val VarDecl = __iterator.next()
	<... all the statements from Body>
  }
}

3. Code blocks

Kotlin에서는 Java와 달리 문으로 된 Code blocks을 지원하지 않는다. 사용된다면 람다리터럴이다.

 


식(Expression)

Kotiln에서의 Expression은 Statement 또는 Expression으로 사용할 수 있다.

독립적인 개념이 아니라 Statement는 Expression에 포함된 개념인것이다.

 

Context 에 따라 모든 표현식은 유효한 Statement이므로 독립실행형식은 단일 Statement 또는 내부코드 블록으로 사용할 수 있다.

 

Expression은 연산자에 대한 피연산자 또는 함수 호출에 대한 인수와 같이 명령문이 허용되지 않는 위치에서는 표현식으로만 사용된다.

Kotlin에서의 When을 사용하는 예시로 이해를 해보자.

val value = when (score) {
    1 -> 100
    2 -> 200
    else -> 0
}
fun printRank(score: Int){
    when (score) {
        0 -> println("C Rank")
        100 -> println("B Rank")
        200 -> println("A Rank")
    }
}

위 두가지의 코드의 차이점은 무엇일까? 

결론부터 말하자면 둘 다 when을 사용하였지만 return 값이 있고 없고의 차이이다.

단, 첫번째 코드에서는 else가 없으면 오류가 발생한다.

 

또다른 예시로 if 예시코드를 확인해보자

fun max(a: Int, b: Int): Int {
	return if (a > b) a else b
}
fun max(a: Int, b: Int): Int = if (a > b) a else b

if 처럼 블록이 본문인 함수이거나 식이 본문인 함수가 될 수도 있다.

 

코틀린에서의 Expression은 식이면서 문의 역할로도 사용될 수 있기 때문에 좀 더 편리하고 간편하게 사용될 수 있다는 장점이 있다. Java를 주로 사용했다면 조금 어색할 수도 있을 것 같다.

 

 

그런데 어떻게 같은 when을 사용하였는데 리턴값을 반환하거나 반환하지않을 수 있을까?

코틀린은 정적타입 언어인데 when의 반환값에 대한 타입도 지정되어있어야하지 않는가?

이에 대한 자세한 내용은 타입추론 포스팅에서 좀 더 자세히 알아보자.

 

 

 

아래와 같이 Expression은 다양한 형태로 지원되고 있다. 

 

1. Constant literals

    Bool, Integer, 정수형타입, String, Null

2. Constant 

3. String interpolation

4. Try

5. Conditional

6. When

7. Logical disjunction

8. Logical conjunction

9. Equality

10. Comparsion

11. Type-checking and containment-checking

12. Elvis operator

13. Range

14. Additive

15. Multiplicative

16. Cast

17. Prefix

18. Postfix

19. Not-null

20. Indexing

21. Call and property access

22. Function

23. Object

24. This

25. Super

26. Jump

 

 

https://kotlinlang.org/spec/pdf/kotlin-spec.pdf

반응형

'Language' 카테고리의 다른 글

왜 코틀린 인가?  (0) 2022.12.05
Clean Code - DRY  (0) 2022.12.05