본문 바로가기

프로그래밍 언어/코틀린_Kotlin_더파기

Kotlin더파기_02_Control Flow 흐름제어

프로그램을 실행하는 도중에 어떤 조건에 따라 선택이 나누어지는 경우가 있다.

이 경우에 사용하는 코딩 방법이 control flow(흐름 제어)이다.

 

흐름 제어에 사용하는 표현식은 if문, when문 등이 있다.

 

if else

if (조건 ) {실행}

else {실행}

 

만약(조건)이라면 {실행하라}

그렇지 않으면 {실행하라}

 

실습을 위해 인텔리제이로 새 프로젝트를 만든다.

프로젝트명은 NetHack

 

새 코틀린 파일을 만든다.

파일명은 Game

 

main()함수를 만든다.

 

코틀린 파일 이름 Game에서 짐작하듯이 게임을 만드는 과정으로 if else를 어떻게 사용하는지 알아본다.

 

main()함수에 다음과 같은 내용을 코딩해 보자.

 

게임 주인공 이름(name)은 Wraven 이다.

생명(life)의 초기값은 100 이다.

만약 생명이 100이면

"Wraven : Best condition!"을 출력한다. 

그렇지 않으면

"Wraven : Bad condition!"을 출력한다. 

 

 

name과 life 변수를 선언하고 초기값을 넣는다.

if 문 괄호 안에 조건을 넣는다. 

문장이 if 문으로 변하는 과정은 다음과 같다.

 

만약 생명이 100이면

if (life는 100 이다)

if (life는 100과 같다)

if (life == 100) 

 

이와 같이 값이 같은지 비교할 때는 ==를 사용한다.

이런 것을 비교연산자(comparison operator)이라고 한다.

다음과 같은 것들이 있다.

 

# 비교연산자

 

<  왼쪽이 작다

<= 작거나 같다

> 크다

>= 크거나 같다

== 같다

!= 같지 않다

=== 양쪽 Instance가 같은 Object를 참조한다

!== 양쪽 Instance가 같은 Object를 참조하지 않는다

 

(Instance와 Object는 다음에 배우기로 한다)

 

조건이 참(true)일 때 실행할 내용은 { }중괄호 안에 넣는다.

else(그렇지 않으면) 다음의 {}중괄호 안에는 조건이 거짓(false)일 때 실행할 내용을 넣는다.

 

println()함수는 '화면에 출력하라'는 명령을 가진 내부함수이다.

출력할 내용은 변수와 문자열이 합해진 모습이다.

변수의 값도 문자열이다.

두 문자열을 합할 때도 + 덧셈 연산자를 사용한다.

 

else 조건일 때를 확인하기 위해 var life = 50으로 수정한 후 실행 해보자.

 

현재 코드는 정상적으로 실행되지만

println의 괄호 부분에 노란 물결줄이 나타나있다.

마우스 포인터를 대면 다음과 같은 메시지가 나온다.

 

Convert concatenation to template

연결을 템플릿으로 바꿔라

 

이 부분을 해결하기 위해 string template기능을 알아본다.

String Template

 

코틀린에는 String Template(문자열 템플릿)라는 기능이 있다.

문자열 템플릿을 사용하면 문자열 값 안에 변수를 포함할 수 있다.

문자열 템플릿을 표현하려면 다음과 같이 한다.

 

$변수명

 

String Template를 실습하기 위해 새 파일을 하나 만든다.

이름은 Temp

main()함수를 만든다.

 

 

main()함수 바깥에 새 함수를 만든다.

함수명은 stringTemplate

 

 

stringTemplate()함수의 실행 부분에 다음과 같이 입력한다.

 

stringTemplate()함수의 내용은 다음과 같다.

 

변수 a에 문자열 Hello를 넣고

변수 b에 문자열 Kotlin을 넣고

변수 c에는 변수 a와 b를 스트링템플릿 표현으로 넣는다.

그리고 변수 c를 출력한다.

 

이 함수를 main()함수에서 실행해 보자.

내용 부분에 stringTemplate()을 입력하고 실행 해서 결과를 보자.

 

 

결과를 보고 스트링템플릿 기능을 어떻게 사용하는 지 생각해 보자.

 

다시 Game.kt 탭으로 돌아간다.

 

노란색 물결줄 부분을 Template으로 변환하면 어떻게 될까?

 

 아래와 같이 문자열을 나타내는 큰따옴표 안에 변수가 문자열 표현으로 변환된다.

 

 

if else if else

조건이 여러 개일 때는 아래와 같이 만든다.

 

if (조건 ) {실행}

else if (조건 ) {실행}

else if (조건 ) {실행}

else {실행}

 

만약(조건)이라면 {실행하라}

또 만약(조건)이라면 {실행하라}

또 만약(조건)이라면 {실행하라}

그렇지 않으면 {실행하라}

 

 

Game.kt파일에서 조건을 2개 더 추가 해보자.

 

또 만약 life가 70 이상이면 

"Wraven : Slight wound!"를 출력한다. 

 

또 만약 life가 20 이상이면

"Wraven : Serious wound!"를 출력한다. 

 

 

 

if 조건문을 실행하면 위에서 부터 아래로 실행하다가 조건이 true(참)이면 다음 조건은 검사하지 않고 멈춘다.

그래서 조건이 여러개 일때 조건의 순서가 중요하다.

 

중첩 if else

 

중첩은 조건의 실행 부분에 또 다른 조건을 넣는 것을 말한다.

 

위에서 만약 생명이 70 이상이면 "가벼운 부상"이라고 출력하라는 실행 내용이었다.

이것을 만약 생명이 70 이상이면 {만약 물을 가지고 있으면 "회복" , 그렇지 않으면 "가벼운 부상"}을 출력하는 것으로 바꿔보자.

 

생명이 70 이상일 때의 조건을 실행하는 노란색 중괄호 안에 또 다른 조건이 들어간 모양으로 바뀌었다.

그런데 haveWater 이 빨간색인 것은 이것이 참인지 거짓인지 알 수 없기 때문이다.

게임에서 자신의 캐릭터가 물을 얻었다고 해보자.

물을 얻었으면 true 라는 값을 가지고, 물이 없는 상태이면 false라는 값을 가지면 haveWater이 참인지 거짓인지 판단할 수 있을 것이다. 이렇게 true(참), false(거짓) 2가지 상태를 가지는 변수 타입을 Boolean(불리언)이라고 한다.

true를 1로, false를 0으로 표기하기도 한다.

그러면 haveWater라는 변수를 만들고 true값을 넣어보자.

 

 

빨간색 haveWater이 사라졌다.

변수 haveWater의 값을 보고 참이라는 것을 확인할 수 있게 되었다.

이제 life의 값을 70으로 바꾸고 실행 해보자.

 

논리연산자(Logical Operators)

 

조건이 여러 개 일때 if else조건문이 많아진다.

이런 경우에 if else 조건문을 여러 개 만드는 것 보다 논리연산자를 사용하면 간단하게 표현할 수 있다.

예를 들어 다음과 같은 조건문을 하나 더 만든다고 해보자.

 

만약 물을 가지고 있고 생명이 20 이상이거나 또는 파워를 얻었다면

"2배 커짐"을 출력하고 그렇지 않으면 "아님"을 출력한다.

 

논리 연산자를 어떻게 사용했는지 분해하면서 바꿔보자.

 

물을 가지고 있고 생명이 20 이상이거나 또는 파워를 얻었다면

물을 가지고 있다 + 그리고 + 생명이 20 이상이다 + 또는 + 파워를 얻었다.

haveWater + && + life > 20 + || + getPower

 

논리연산자는 조건문 뿐만 아니라 여러 표현에 사용할 수 있다. 

변수 선언할 때 변수값으로 사용할 수도 있다. 

위의 if조건문을 다음과 같이 표현할 수도 있다.

 

오른쪽 파란 부분은 if 조건에 있던 값을 sizeIncreased(크기 증가)라는 변수 만들어 그 값으로 넣고

if조건에는 sizeIncreased가 true인지를 판단하는 모양으로 바뀌었다.

 

논리연산자의 종류

 

논리 연산자는 3종류가 있다.

 

&&

||

!

 

&&는 "and, 그리고"라는 뜻이며 이 연산자 왼쪽과 오른쪽이 모두 true일때만 true가 된다.

 

|| 는 "or, 또는"이라는 뜻이며 이 연산자 왼쪽과 오른쪽 중 어느 한 쪽이 true이면 true가 된다.

(참고로 이 부호( | )를 넣으려면 shift+\키를 누르면 된다)

 

! 는 "not, 아님" 이라는 뜻이며 true, false 값을 반대로 바꾼다. 즉, true는 false가 되고 false는 true가 된다.

 

연산자들의 우선순위

 

여러 연산자들이 결합하면 실행하는 순서가 따로 있는데 그것을 우선순위라고 한다.

덧셈,뺄셈,곱셈,나눗셈이 결합되어 있는 계산을 할 때 곱셈,나눗셈을 먼저 계산하는 것과 같다.

#문제: 6/2(1+2)=

 

연산자 우선순위는 다음과 같다.

먼저 실행하는 순서이다.

 

!

< , <=, > , <=

== , !=

&&

||

 

조건 표현(conditional expression)

 

if else 조건문을 자세히 보면 게임 주인공의 건강 상태를 출력하는 부분이 반복되고 있다.

 

 

이렇게 중복되는 부분을 하나로 만들어 처리해 보자.

위에서 조건을 변수 sizeIncreased에 넣은 방법과 스트링템플릿을 응용하면 된다.

 

characterCondition (캐릭터 상태)라는 변수를 만들어서 조건문을 변수값으로 넣고 마지막 코드에 변수명과 변수상태를 나타낸 표현으로 변했다.

훨씬 깔끔하게 정리된 것을 알 수 있다.

조건 뿐만 아니라 조건식 전체도 변수값에 넣을 수도 있다는 것을 알게되었다. 

이것을 조건 표현(conditional expression)이라고 한다.

 

위 코드 중 아래 빨간 테두리의 코드도 조건 표현으로 나타내보자.

이 조건은 게임 캐릭터의 '크기 상태'를 나타내므로 변수명은 sizeStatus로 한다.

 

 

이 코드를 조건 표현으로 나타내면 다음과 같이 바꿀 수 있다.

 

 

그런데 if의 조건문에서 실행부분을 나타내는 { } 중괄호가 없다. 

이것이 가능한 이유는 if else 조건 표현이 하나만 있을 때는 중괄호를 생략할 수 있기 때문이다.

 

범위(range)

 

이번에는 조건이 어떤 범위일 때 표현하는 방법을 알아본다.

코틀린에서는 1~5는 1..5와 같이 표현한다.

즉, 1,2,3,4,5를 나타낸다.

그리고 어떤 값이 범위에 포함되는지 검사할 때는 in 키워드를 사용하면 된다.

 

위 코드에서 범위를 나타내는 해당 라인은 다음과 같이 바꿀 수 있다.

 

 

when

지금까지 흐름제어 중 if else문에 대해 알아보았다.

이번에는 when문에 대해 알아본다.

 

if else와 함께 흐름제어에 사용할 수 있는 또 다른 표현이 when이다.

when은 ~일 때 ~하라는 뜻으로 사용법은 if else와 거의 같지만 코드가 더 심플하고 3개 이상의 조건이 나누어질 때 유용하게 표현할 수 있다.

 

when 표현은 아래와 같이 표현한다.(쌩초보 기초 15 참고)

 

 

when 표현에서는 화살표( -> )연산자의 왼쪽 '조건'이 자동으로 '전달 인자'에 지정되어 비교한다.

 

인텔리제이를 실행하고 프로젝트 NetHack을 불러온다.

아래 코드의 빨간색 부분을 when 표현으로 바꿔보자.

 

아래와 같이 when 표현으로 고치고 실행하면 같은 결과가 나오는 것을 알 수 있다.

 

in 70..99의 실행 부분인 if else 조건도 앞에서 알아본 조건표현으로 바꿀 수 있다.

 

Game탭과 Temp탭의 코드는 같은 결과가 나오지만 코드의 길이와 간결함에서 차이가 나는 것을 알 수 있다.

 

이상으로 흐름을 제어하는 if else와 when에 대해 알아보았다.

 

끝.

 

Wraven...