본문 바로가기

프로그래밍 언어 기초/KOTLIN

[Kotlin] 함수, 제어문, 반복문

개요

오늘은 코틀린의 함수(Function), 제어문(Conditions), 반복문(Loops)에 대해서 알아보도록 하겠습니다.

 


함수(Fucntion)

프로그래밍에서 함수란 수학에서의 함수와 의미가 같습니다.

수학에서 함수의 정의는 아래와 같습니다.

"어떤 집합의 각 원소를 다른 어떤 집합의 유일한 원소에 대응시키는 이항 관계"

그러므로, 프로그래밍 언어에서 함수란 주어진 미지의 값들의 집합을 통해 유일한 값을 얻어내는 것이라고 볼 수 있는데요.

여기서 미지의 값들의 집합을 파라미터(parameter)유일한 값을 반환 값(returns)이라고 부릅니다.

따라서, 코틀린을 포함하는 프로그래밍 언어에서 함수란,

함수를 구분하기 위한 함수의 이름,

'함수명'과 미지의 값들의 집합, 파라미터(parameter),

함수를 통해 얻어낼 수 있는 유일한 값, 반환 값(returns)으로 구성됩니다.

코틀린에서 함수는 아래와 같이 사용할 수 있습니다.

 

fun addNumber(x:Int, y:Int):Int{
    return x+y;
}

fun main(args: Array<String>) {

    val result = addNumber(1,2);
    println(result); // 3
    
}



혹시 조금 예리하신 분들은 이미 눈치채셨을 수도 있겠지만,

 

지금까지 코틀린을 실행시키기 위해 반복적으로 작성했던

fun main(args: Array<String>) {} 이 코드도 함수의 일종입니다.

 

이처럼 프로그래밍에서 어떤 프로그램의 시작점이 되는 함수를 메인 함수(Main function)이라고 부르며,

지금까지 코틀린 코드를 실행하기 위해 작성했던 저 코드는 메인 '함수(Fuction)'였습니다.

코틀린 파일을 실행하기 위해서는 이러한 메인 함수가 반드시 필요하며,

따라서 이 함수를 통해야 비로소 변수의 선언 및 출력, 연산 등의 작업이 수행될 수 있습니다.

 


조건문(if)

'철수가 영희보다 키가 크다면 1을 출력해주세요' 라는 문장을 프로그램으로 만들면 어떻게 해야 할까요?

이를 코틀린으로 작성해보면 아래와 같이 작성할 수 있을 것입니다.

val chulSuHeight = 180;
val youngHeeHeight = 160;
if(chulSuHeight > youngHeeHeight){
    println(1);
}else {
    println("철수는 영희보다 작습니다.");
}

// result : 1

 

여기서 if() {} else {} 에 해당하는 부분을 조건문 이라고 부릅니다.

 

프로그래밍 언어에서 조건문은 어떤 주어진 명제를 만족할 때 특정 작업을 수행할 수 있도록,

즉 프로그램의 흐름을 제어할 수 있도록 해줍니다.

또한 조건문은 if() else if() else 절로 더 많은 조건을 설정할 수 있는데,

이 경우 소괄호()에 명시된 조건을 위에서 아래로 검사하면서, 제일 먼저 만족하는 조건으로 흐름이 이동합니다.

 val number = 10;

if(number > 20){
    println("number is biggeer than 20");
}else if(number > 5){
    println("number is biggeer than 5");
}else if(number > 3){
    println("number is biggeer than 3");
}else {
    println("unknown number...");
}

// result : number is biggeer than 5


 

위의 코드를 보면, 변수 number1는 5보다 크고, 3보다 큽니다.

하지만, 두번째 else if 절에서 이미 조건이 참이므로 두번째 else if절에 작성된 코드가 실행됩니다.

 

 

조건에 따라 변수에 값을 담기

 

'철수가 영희보다 키가 크다면 그 차이를 변수에 담아주세요'라는 조건을 만족하려면 어떻게 해야 할까요?

자바(Java)와 같은 언어에서는 그 조건이 if - else로만 구성될 경우 3항 연산자를 통해 변수의 값을 동적으로 바꿀 수 있습니다.

하지만, 코틀린에서는 삼항 연산자 대신 조건문을 통해 변수에 값을 담을 수 있습니다.

그리고 이 덕분에 변수에 2가지 이상의 조건에 따라 서로 다른 값을 담는 식으로 프로그래밍할 수 있습니다.

// 철수가 영희보다 키가 크다면 그 차이를 변수에 담아주세요
val gap = if(chulSuHeight > youngHeeHeight){
    chulSuHeight-youngHeeHeight
}else {
    -1
}
println(gap); // 20


val result2 = if(number > 20){
    "number is biggeer than 20"
}else if(number > 5){
    "number is biggeer than 5"
}else if(number > 3){
    "number is biggeer than 3"
}else {
    "unknown number..."
}

println(result2); // number is biggeer than 5

 

 


when

코틀린에서 조건문은 주어진 조건을 만족하면 프로그램의 흐름을 분기한다고 설명드렸습니다.

그런데, 이 조건문이 여러개 라면 어떻게 될까요?

if-else if-else 절을 활용하여 대응할 수 있겠지만,

이러한 조건문이 너무 많이 늘어나면 코드를 쉽고 빠르게 파악하는데 어려움이 생깁니다.

가령 아래와 같은 상황을 예로 들어보겠습니다.

'num이라는 변수에 담긴 숫자가 1이라면 A를 출력시켜주시고, 2라면 B를 출력, 그것도 아니라면 무시해주세요.'

위의 조건을 만족하는 프로그램을 만든다면 어떻게 해야할까요?

물론, if-else if-else 문을 통해 조건에 대응할 수 있지만,

아래와 같이 when 절을 활용하여 조건을 분기할 수도 있습니다.

val num = 2;
when(num){
    1 -> {
        println("A");
    }
    2 -> {
        println("B");
    }
    else -> {

    }
}

 

위의 코드에서, 확인할 수 있듯이

 

when절은 주어진 조건을 '정확히' 만족하는, '분류'와 같은 작업에 적합합니다.

만약 주어진 조건이 공통점이 전혀 없이 서로 천차 만별이라면 when문을 사용할 수 없을 수도 있습니다.

 

그러나, 대부분의 경우에서 when 절은 많은 조건에 대하여 조건문 보다 훨씬 좋은 가독성을 보여주기 때문에

어떤 조건에 대해 공통점을 찾아내고 일관된 조건으로 판단할 수 있다면, when절을 활용하는 것도 좋습니다.


반복문 (for)

'10번 Hello World! 문구를 출력해주세요'
'변수 A에 담긴 숫자를 10이 될 때 까지 1씩 증가시켜 주세요'

위와 같은 조건을 만족하는 프로그램을 만든다면 어떻게 해야 할까요?

첫번째, 조건을 만족하기 위해서 print구문을 10번 작성할 수도 있습니다.

그런데, 이 반복 회수가 100번, 1,000번, 10,000번 반복해야 한다면 어떨까요?

오늘날의 프로그램은 그 누구보다도 반복적인 일을 잘 수행합니다!

만약 동일한 작업을 동일한 주기로 계속하여 반복하는 일이라면,

아래와 같이 반복문 for문을 통해 똑같은 작업을 반복할 수 있습니다.


 for(i in 0..9){
    println("Hello World!");
}

 

코틀린에서 for문은 in 절과 함께 사용할 수 있습니다.
그리고 이러한 in절 뒤에 오는 값을 범위(Ranges)라고 부릅니다.

예제에서 in절 뒤에 함께 사용한 값도 변수에 담을 수 있는데,

이 때의 자료형은 IntRange 가 됩니다.

 

val numberRage1:IntRange = 0..9



in 뒤에 오는 범위 값은 아래와 같이 증가하거나 감소하는 크기를 직접 조절할 수도 있습니다.

 

val ascOrder = 0..10 step 2;
for(i in ascOrder){
    println(i);
}

val descOrder = 10 downTo 1 step 2
for(i in descOrder){
    println(i);
}



또한, 이 in 절은 for문과 함께 사용하면 반복문으로 활용할 수 있지만

if문이나 논리 연산자와 함께 사용하면 불리언(Boolean) 값을 얻는 데에도 활용할 수 있습니다.

 

if (-1 !in 0..9) {
    println("-1 is out of range")
}

 


while과 do-while

코틀린에서 for문과 함께 사용할 수 있는 반복문은 while문과 do-while문이 있습니다.

while문은 소괄호()안에 조건을 만족할 때까지 작업을 반복할 수 있습니다.

 

do-While문 역시 while문과 마찬가지로 조건을 만족할 때까지 작업을 반복하지만,

처음부터 조건을 만족하는 경우라도 do {} 절에 작성된 코드가 1회는 실행 됩니다.

 

반면 while문의 경우는 처음부터 조건을 만족한다면 코드를 전혀 실행시키지 않을 수 있습니다.

var start1 = 0;
while(start1<10){
    start1++;
}
println(start1); // 10

var start2 = 0;
do{
    start2++;
}while(start2 < 10)
println(start2); // 10


만약 while문의 조건이 항상 참(true)라면 이는 곧 무한 반복(infinite loope)이 되기 때문에,
while문이나 do-while문을 사용할 때에는 시작과 종료 조건을 잘 설계해서 사용해야 합니다.

 


반복문의 제어

만약 반복문을 실행하는 도중 어떤 조건을 만족했을 때,  바로 작업을 중단하려면 어떻게 해야할까요?

코틀린에서는 이러한 상황에서 반복문에 라벨(label)을 부여하여 해결할 수 있습니다.

코틀린에서는 반복문에 라벨(label)을 부여하고,

반복문 내부에서 특정 조건을 만족할 때, 반복문을 탈출(break)하거나 종료(return)시킬 수 있습니다.

var start3 = 0;
loop@ for (i in 1..100) {
    if(i > 5) break@loop
    start3++;
}
println(start3); // 5

var start4 = 0;
abc@while(start4 < 100){
    start4++;
    if(start4 > 5)break@abc
}
println(start4); //6

 


 

참고자료

https://kotlinlang.org/docs/

 

You will be redirected shortly

 

kotlinlang.org