코틀린 Kotlin 기본 문법2

김민준·2024년 2월 21일

반복문
for 문
while 문
if, else, else if 문
when 문
map 함수
filter 함수

어제에 이어서 마저 조건문, 반복문, 콜렉션 함수에 대해 알아보겠다

오늘도 역시 Kotlin 플레이 그라운드를 사용한다.

함수

함수란 특정한 작업을 수행하는 재사용 가능한 코드이다.

fun main() {
    var answer: Number = 0
    
    answer = 1+2    
    println(answer)
    
    answer = 5+5
    println(answer)
}

위와같이 answer라는 변수에 그때그때 계산 결과를 넣을 수 있다. 하지만 훨씬 복잡한 계산이나 절차를 거쳐야하는 일을 한다면 일도 많아지고 실수도 하기 쉬울 것이다.

아래와 같이 미리 함수를 만들어 두면 코드를 재사용 할 수 있다.

fun main() {
    fun add(a: Int, b: Int) {
        val result = a + b
        println(result)
    }
    
    add(1,2)
    add(5,5)
}

결과 자체는 처음과 똑같지만 단순히 숫자 두개를 더하는 것이 아닌 더 복잡한 작업을 해야했다면 함수를 사용하는 것이 더 쉽고 편한 일이었을 것이다.

그리고 간단한 작업을 했다 치더라도 만약에 더하기로 작성한 코드 100줄을 빼기로 바꿔야한다면 그 많은 것들을 하나도 빼놓지 않고 다 빼기로 바꾸는것은 매우 길고 어려운 일이 될 것이다. 하지만 함수를 사용했다면 함수를 정의한 부분(fun으로 시작하는 부분)에서 바꾸기만하면 함수를 사용한 모든 코드에서 다른 결과를 내놓기 때문에 유지보수에 유리하다.

참고로 코틀린에서는 Number 타입간의 연산을 지원하기 않기 때문에 toInt(), toDouble()등의 기능을 사용하거나 Number이외의 타입으로 입력해야한다고한다.

반복문

특정 조건을 만족할 때 까지 같은 일을 반복한다.

for 문

범위의 안에서 같은 일을 반복한다.

fun main() {
    
    for (i in 1..5) {
        println("양이 $i 마리")
    }
}

위와 같이 범위를 직접 지정하는 경우가 있고.

아래와 같이 범위(컬렉션 등)를 사용하는 경우가 있다.

fun main() {
    
    val list = listOf("철수", "영희", "민수", "철구", "영민")
    
    for (i in list) {
        println("$i 씨는 진료소로 들어오세요")
    }
}

또한 위의 i는 순전히 임의로(자기 마음대로) 정할 수 있다. 한글의 을 사용해도 같은 결과가 나온다

while 문

for문이 정해진 범위에서 하나씩 세나가는 것이라면, while 문은 조건이 참인동안 계속 반복되는 특성이 있다.

fun main() {
   
    var count = 1
    
    while (count <= 5) {
        println("양이 $count 마리")
       	count ++
    }
}

위의 count ++는 count의 값을 1 증가 시키라는 의미이다. 반대로 count --를 한다면 count의 값이 1 감소하게 된다.

그렇다면 여기 이 count++를 넣지 않는다면 어떻게 될까?

메모리(컴퓨터가 일을 하기 위한 작업 공간)이 부족하다며 에러가 뜬다. count라는 변수가 5보다 커져야 작업이 멈추는데 항상 1에서 고정되어 있기 때문에 "양이 1 마리" 라는 글자를 무한히 출력하려다가 컴퓨터의 뇌 용량이 부족해져서 멈춰버린 것이다. 이렇게 똑같은 일을 계속 반복하는 것을 무한 루프라고 한다.

조건문

이름 그대로 조건에 맞을 때(참)와 맞지 않을 때(거짓) 다르게 작동하는 함수이다.

if, else, else if 문

특정한 조건이 참, 또는 거짓일 때 작동하는 함수이다.

fun main() {
    val score = 80
    
    if (score >= 80) {
        println("합격입니다.")
    }
}

위의 코드를 실행시키면 score>=80이라는 조건에 대해서 이 나오기 때문에 println("합격입니다.")가 실행되고 합격입니다.라는 글자가 출력되게 된다.
하지만 거짓이라면 어떻게 될까?

score를 79로 바꾸어서 거짓이 되게 만들면 아무런 일도 일어나지 않는다 거짓일 경우에는 작동할 함수가 없기 때문이다.

if문을 하나 더 만들 수 도 있지만 이럴때는 else 문을 이용한다.

프로그램의 흐름이 else문을 만나면 무조건 실행이 된다.

만약 조건을 더 많이 붙이고 싶다면 else if문을 사용한다.

fun main() {
    val score = 45
    
    if (score >= 90) {
        println("A등급입니다.")
    } else if (score >= 75) {
        println("B등급입니다.")
    } else if (score >= 50) {
        println("C등급입니다.")
    } else {
        println("불합격입니다.")
    }
}

else if문은 원하는 만큼 붙일 수 있으며 else문은 한번밖에 쓰지 못한다.

when 문

if문과 비슷하지만 else if와 같은 것을 쓸 필요가 없다.

fun main() {
   
    var math = "나누기"
    
    when (math) {
        "더하기" -> println(2+3)
        "빼기" -> println(2-3)
        "곱하기" -> println(2*3)
        "나누기" -> println(2/3)
        else -> println("사칙연산이 아닙니다.")
    }
}

위의 사진에서 0.6666... 이 아니라 0 이 나온 이유는 정수끼리의 나누기이기 때문에 소숫점을 무시했기 때문이다. 둘 중 하나를 소수로 표현하거나 .toDouble()를 사용하여야한다.

fun main() {
   
    var math = "나누기"
    
    when (math) {
        "더하기" -> println(2+3)
        "빼기" -> println(2-3)
        "곱하기" -> println(2*3)
        "나누기" -> println(2/3.toDouble())
        else -> println("사칙연산이 아닙니다.")
    }
}

Collection 함수

collection은 데이터드를 관리하기 위한 자료형이다.

map 함수

collection의 일종인 Map과는 다르다.
map은 collection에 대해서 작업을 수행하고 그 결과를 list(역시 컬렉션의 일종)로 반환한다.

fun main() {
   
    var set1 = setOf(1,2,3,4,5,6,7,8,9)
    
    var mapFunction = set1.map { it * it }
    println(set1)
    println(mapFunction)
}

새로운 list를 만들어 내는 것이기 때문에 원본에는 아무런 변화가 없다.

여기서 it이라는 이름은 코틀린 자체에서 정해진 이름이기 때문에 무조건 따라야한다. 만일 it이 아니라 q라는 표현을 쓰고 싶다면 { q -> q * q } 와 같이 표현해야한다.

filter 함수

조건문 안의 내용이 참인 경우만 골라서 새로운 list를 반환한다. if, when에서는 괄호 ()로 표시했으나 filter 함수에서는 중괄호 {}로 표시한다.

fun main() {
   
    var set1 = setOf(1,2,3,4,5,6,7,8,9)
    
    var filter1 = set1.filter { it < 5 }
    var filter2 = set1.filter { it % 2 == 0 }
    println(set1)
    println(filter1)
    println(filter2)
}

map 함수와 마찬가지로 기존의 콜렉션을 변형시키지 않는다.

profile
node 개발자

0개의 댓글