Dev/Kotlin

Kotlin (묵시적변환, 제어문, 연습문제, when, 범위클래스, for반복문, 연습문제)

Walker_ 2024. 4. 4. 17:05

1. 묵시적 변환

 - Any형은 자료형이 특별히 정해지지 않은 경우에 사용

 - 코틀린의 Any형은 모든 클래스의 뿌리. Int나 String 그리고 사용자가 직접 만든 클래스까지 모두 Any형의 자식 클래스

 - 즉 코틀린의 모든 클래스는 바로 이 Any형이라는 슈퍼클래스 (Superclass)를 가짐

 - * Any는 자바의 최상위 클래스인 Objcet와 비슷하지만 서로 다른 유형

 

 - Any형은 무엇이든 될 수 있기 때문에 언제든 필요한 자료형으로 자동변환 할 수 있음

 - 이것을 묵시적 변환이라고 함

fun main() {
    var a: Any = 1 // Any형 a는 1로 초기화될 때 Int형이 됨
    a = "one" // Int형이었던 a는 변경된 값에 의해 String이 됨
    println("a: $a type: ${a.javaClass}") // 자바의 기본형을 출력하면 String이 나옴.

    checkArg("Hello") // 문자열을 인자로 넣음
    checkArg(5) // 숫자를 인자로 넣음
}

fun checkArg(x: Any) { // 인자를 Any형으로 받음
    if (x is String) {
        println("x is String: $x")
    }

    if (x is Int) {
        println("x is Int: $x")
    }
}

 

2. 제어문 

 - 제어문 : 코드의 흐름을 조건에 따라 바꿀 수 있음

 - 제어문은 크게 조건문에 해당하는 if, when, 그리고 반복문인 for, while이 있음

var out = 0
var strike = 3
if (strike > 2) {
    out = out + 1
}
println("out: $out") // 1

 

 - if /  else / else if

var ball = 4 
if (ball > 3) { // 조건식이 참이면 여기 코드 블럭이 실행
    println("4볼로 출루합니다.")
} else { // 조건식이 거짓이면 여기 코드 블럭이 실행
    println("타석에서 다음 타구를 기다립니다.")
}

 

 - 변수에 직접 if문 사용하기

 - if문의 조건식 결과를 변수에 대입할 수 있음

var a = 5;
var b = 3;
var bigger = if (a>b) a else b;
println("bigger: $bigger") // 5

 

 - if문의 마지막 값을 반환값으로 사용하기

 - 위의 코드와 같은데 if문의 코드 영역이 여러 줄일 경우에도 마지막 줄을 변수값으로 사용할 수 있음

bigger = if (a>b) {
    var c = 30
    a // 마지막 줄의 a 값이 bigger에 저장
} else {
    b
}
println("bigger: $bigger")
var eraOfRyu = 2.32
var eraOfDegrom = 2.43

val era = if (eraOfRyu < eraOfDegrom) {
    println("2019 류현진이 디그룸을 이겼습니다.")
    eraOfRyu
} else {
    println("2019 디그룸이 류현진을 이겼습니다.")
    eraOfDegrom
}
println("2019 MLB에서 가장 높은 ERA는 ${era}입니다.")

 

 - 그래서 다음과 같이 'if문을 활용하여 변수에 값을 할당할 수 있음'

 - '값을 할당해야 하므로 반드시 else문이 필요'

val myAge = 20
val isAdult = if (myAge > 20) true else false

println("성인 여부 : $isAdult")

 

3. 연습문제

 - 사용자에게 입력받은 정수가 양수인지, 0인지, 음수인지 알려주는 코드를 완성하세요

fun main() {
    print("정수를 입력하세요 : ")
//    val num = readln().toInt()

    val scanner = Scanner(System.`in`)
    val num = scanner.nextInt()

    if (num > 0) {
        println("양수 입니다.")
    } else if (num == 0) {
        print("0 입니다.")
    } else {
        print("음수 입니다.")
    }
}

 

 - 성적을 입력받아 학점을 출력하는 코드를 완성하세요

print("성적을 입력하세요 : ")
val score = readln().toInt()

if (score <= 100 && score >= 90) {
    println("학점 A")
}
else if (score < 90 && score >= 80) {
    println("학점 B")
}
else if (score < 80 && score >= 70) {
    println("학점 C")
}
else if (score < 70 && score >= 60) {
    println("학점 D")
}
else if (score < 60 && score >= 0) {
    println("학점 F")
}

 

4. when 

 - 다른 언어의 switch문을 if문과 비교하자면 switch문은 if문의 연산식에서

 - 사용되는 비교 연산자 중에 == 만 사용해서 같은 값인지를 비교하는 조건문

 - 코틀린을 제외한 거의 모든 프로그래밍 언어에서는 switch라는 이름으로 사용되며 선택문이라고 불리기도 함

 - 하지만 코틀린의 when문은 다른 언어와 다르게 같은 값뿐만 아니라 범위 값도 처리할 수 있고 사용 방법도 더 많음

 - 코틀린에서의 when문은 특정 값을 선택할 수 있는 switch의 사용법에 if문의 범위 비교 기능이 더해진 if문의 확장판

 

 - 1) 일반적인 형태의 when 사용하기

 - when 다음에 괄호 (())를 작성하고 괄호 안에는 주로 비교 대상 파라미터로 사용할 변수명을 입력

 - if에서 처럼 괄호 다음에 중괄호({})를 사용해서 when 블록을 구분하고 블록 내부에서 비교할 값은

 - 화살표 연산자 Arrow Operator (->)사용해서 선택

    when (파라미터) {
        비교값 -> {
            변수값이 비교값과 같다면 이 영역이 실행.
        }
    }
    switch문과 비교하면 값을 비교하는 줄 앞의 case가 없어지고, 비교값 다음의 콜론이 화살표 연산자(->)로 대체

   when(파라미터) {
        비교값1 -> {
            변수값이 비교값1과 같다면 이 영역이 실행
        }
        비교값2 -> {
            변수값이 비교값2와 같다면 이 영역이 실행
        }
        else -> {
            변수값이 앞에서 비교한 값들과 다르면 이 영역이 실행
        }
   }
val now = 10
when (now) {
    8 -> {
        println("현재 시간은 8시입니다.")
    }
    9 -> {
        println("현재 시간은 9시입니다.")
    }
    else -> { // 위의 조건에 맞지 않으면 else 다음 코드가 실행
        println("현재 시간은 9시가 아닙니다.")
    }
}

 

 - 콤마로 구분해서 when 사용하기

 - 특정 값을 비교하는데 결과 처리가 동일하다면 콤마(,)로 구분해서 한 번에 비교할 수 있음

val now = 9
when (now) {
    8, 9 -> {
        println("현재 시간은 8시 또는 9시 입니다.")
    }
    else -> {
        println("현재 시간은 9시가 아닙니다.")
    }
}

 

 - 범위 값을 비교하기

 - in을 사용해서 범위 값을 비교할 수 있음. if 문의 비교 연산자 중 <=, >=과 같은 기능을 구현할 수 있음

val ageOfMichael = 19
when (ageOfMichael) {
    in 10..19 -> {
        println("마이클은 10대입니다.")
    }
    !in 10..19 -> {
        println("마이클은 10대가 아닙니다.")
    }
    else -> {
        println("마이클의 나이를 알 수 없습니다.")
    }
}

 

 - 파라미터 없는 when 사용하기

 - when 다음에 오는 괄호를 생략하고 마치 if문처럼 사용할 수 있음

val currentTime = 6
when {
    currentTime == 5 -> {
        println("현재 시간은 5시입니다.")
    }
    currentTime > 5 -> {
        println("현재 시간은 5시가 넘었습니다.")
    }
    else -> {
        println("현재 시간은 5시 이전입니다.")
    }
}

 

 - when을 이용한 성적 출력 문제

print("점수을 입력하세요 : ")
val score = readln().toInt()

when (score){
    in 90..100 ->{
        println("입력하신 성적은 ${score}점이고, 학점은 A입니다.")
    }
    in 80..89 ->{
        println("입력하신 성적은 ${score}점이고, 학점은 B입니다.")
    }
    in 70..79 ->{
        println("입력하신 성적은 ${score}점이고, 학점은 C입니다.")
    }
    in 60..69 ->{
        println("입력하신 성적은 ${score}점이고, 학점은 D입니다.")
    }
    in 0..59 ->{
        println("입력하신 성적은 ${score}점이고, 학점은 F입니다.")
    }
}

var credit = when (score/10*10) {
    90, 100 -> 'A'
    80 -> 'B'
    70 -> 'C'
    60 -> 'D'
    else -> 'F'
}

// 범위 사용
credit = when(score) {
    in 90..100 -> 'A'
    in 80..89 -> 'B'
    in 70..79 -> 'C'
    in 60..69 -> 'D'
    else -> 'F'
}

 

5. 범위 클래스

 - 코틀린을 이용하면 특정 범위의 값들을 간편하게 표현할 수 있음

 - 범위 클래스로는 IntRange, LongRange, CharRange등이 있음

 - 예) IntRange 클래스를 사용해 1에서 5까지 숫자의 범위를 생성하는 코드

val numRange : IntRange = 1..5
println(numRange)

println(numRange.contains(3)) // true
println(numRange.contains(10)) // false

// 알파벳의 범위도 마찬가지. CharRange 클래스를 사용
val charRange: CharRange = 'a'..'e'
println(charRange.contains('b')) // true
println(charRange.contains('z')) // false

 

6. for 반복문

 - for 다음의 괄호(()) 안에 반복할 범위를 지정하면 for 블록의 코드가 지정한 횟수만큼 반복해서 동작

 - for(반복할 범위) {

              실행코드

 -  }

 

 - for in .. (온점 2개) : 일반적인 형태의 for 반복문

 - 시작값과 종료값으로 지정한 숫자 범위만큼 코드를 반복하는 일반적인 방법

 - in을 사용해서 반복하는 범위의 숫자를 변수에 담아두고 사용

 - for (변수 in 시작값..종료값) {

             실행코드

 - }

 

 - 1부터 10까지 열 번 반복하면서 그 숫자를 변수 index에 가장 먼저 저장하고, for 블록의 코드를 실행

 - 첫 번째 반복에서는 변수 index에 '1'이 저장되고, 두 번째 반복에서는 index에 '2'가 저장

for (index in 1..10) {
    println("현재 숫자는 $index")
}
// until : 마지막 숫자 제외하기
// 시작값과 종료값 사이의 .. 대신에 until을 사용하면 '종료값 이전'까지만 반복.
/*
for (변수 in 시작값 until 종료값) {
    실행코드
}
배열의 index가 항상 0부터 시작하기 때문에 배열의 인덱스를 사용하여 처리하는 코드에서 사용
배열의 인덱스가 0부터 시작하기 때문에 배열의 크기는 항상 '마지막 인덱스 +1의 값',
따라서 반복을 할 때 배열의 크기 바로 전까지만 반복

 

 - step : 건너뛰기 

 - 예를 들어 1부터 100까지 반복하면서 3의 배수만 사용하고 싶을 때 사용

 - 이럴 때 step을 사용하면 for문의 블록을 step 수만큼 건너뛰어서 실행

 - for (변수 in 시작값..종료값 step 3) {

 -          실행코드

 -  }

for (index in 0..100 step 3) {
    println("현재 숫자는 ${index}")
}

 

 - downTo : 감소시키기

 - 대신 downTo를 사용하면 큰 수에서 작은 수로 감소시키면서 실행할 수 있음

for (index in 10 downTo 0) {
    println("현재 숫자는 ${index}")
}

 - step 사용가능

for (index in 10 downTo 0 step 3) {
    println("현재 숫자는 ${index}")
}

 

 - 배열. 컬렉션이 들어 있는 엘리먼트 반복하기

 - 배열이나 컬렉션을 엘리먼트의 개수만큼 반복하면서 사용

val arrayMonth = arrayOf("JAN", "FEB", "MAR", "APR", "MAY", "JUN")
for (month in arrayMonth) {
    println("현재 월은 ${month}입니다.")
}
// withIndex() 함수를 이용하면 요소의 인덱스도 함께 가져올 수 있음
val students = arrayOf("John", "Peter", "Jane")
for ((index, name) in students.withIndex()) {
    println("Index: $index, Name: $name")
    
}

 

7. 연습문제

for문을 이용해서 정수 5개를 입력받아 합을 출력하는 코드를 작성하시오.

실행 예)
1번째 정수를 입력해 주세요 >> 1
2번째 정수를 입력해 주세요 >> 2
3번째 정수를 입력해 주세요 >> 3
4번째 정수를 입력해 주세요 >> 4
5번째 정수를 입력해 주세요 >> 5
5개 정수의 합은 15입니다.

작성 순서
1) 5번 반복하는 for 반복문 작성
2) 반복문 안에서 정수 입력

 

var sum = 0;
for (index in 1..5) {
    print("${index}번째 정수를 입력해 주세요 >> ")
    var num = readln().toInt()

    sum += num;
}
println("5개 정수의 합은 ${sum}입니다.")

 

사용자로부터 임의의 양의 정수를 하나 입력받은 뒤 1부터 입력받은 정수까지 모든 정수의 합계를 출력하는 프로그램을 구현하세요.

실행 예)
임의의 양수를 입력하세요 >>> 5
1부터 5사이의 모든 정수의 합계는 15입니다.

 

주사위를 던지는 게임이 있다고 가정하자.
    중첩 for문을 이용하여 2개의 주사위의 합이 6이 되는 경우를 출력하는 코드 작성.
    (1, 5)
    (2, 4)
    (3, 3)
    (4, 2)
    (5, 1)
for (i in 1..6) {
    for (u in 1..6) {
        if (i+u == 6) {
            println("(${i}, ${u})")
        }
    }
}

공부 과정을 정리한 것이라 내용이 부족할 수 있습니다.

부족한 내용은 추가 자료들로 보충해주시면 좋을 것 같습니다.

읽어주셔서 감사합니다 :)