1.  자료형 변환

🐝  코틀린에서는 자료형이 다른 변수에 재할당하면 자동 형 변환이 되지 않고 자료형 불일치 오류 Type Mismatch 발생
        ➡️  의도하지 않게 자료형이 변하는 것을 방지하기 위한 것

fun main() {
    val a: Int = 1
    // val b: Double = a // 자료형 불일치 오류 발생. 자바와 차이점.
    // val c: Int = 1.1 // 자료형 불일치 오류 발생
}

 

    🍯  변수 a는 Int 형이므로 Double 형 변수 b에 다시 할당할 수 없음
    🍯  만일 자료형을 변환해 할당하고 싶다면 코틀린에서는 자료형 변환 메서드를 이용
            ex. Int ▶️ Double :  toDouble() 메서드를 이용

fun main() {
    val b: Double = a.toDouble()
    println("a=$a, b=$b") // a = 1, b = 1.0
}

자료형이 서로 다른 값을 연산하면, 자료형이 표현할 수 있는 범위가 큰 자료형으로 자동 형변환하여 연산
fun main() {

    val result = b + a
    println("result = $result") // result = 2.0

}

 


2.  기본형과 참조형의 비교 원리

🐝   자료형을 비교할 때는 단순히 값만 비교하는 방법 vs 참조 주소까지 비교하는 방법
🐝   단순히 값만 비교할 때는 이중 등호(==)를 사용하고, 참조 주소를 비교하려면 삼중 등호(===)를 사용

이중 등호는 참조와 상관없이 값이 동일하면 true를, 값이 다르면 false를 반환
삼중 등호값과 상관없이 참조가 동일하면 true를 반환, 값이 동일하더라도 참조 주소가 다르면 false를 반환

 

다음은 Int 형으로 선언한 변수 a, b에 128을 대입하고 이중 등호와 삼중 등호로 비교한 것
    비교 결과는 모두 true. 이 때 참조형으로 선언된 a와 b는 코틀린 컴파일러가 기본형으로 변환하여 저장
    즉, 여기서는 삼중 등호가 비교하는 값도 저장된 값인 128.
fun main() {

    val a: Int = 128
    val b: Int = 128
    println(a == b) // true
    println(a === b) // true

}

참조 주소가 달라지는 경우는 null을 허용한 변수
    null을 허용한 변수는 같은 값을 저장해도 이중 등호와 삼중 등호를 사용한 결과값이 다름 
fun main() {  

    val c: Int? = 128
    val d: Int? = 128
    println(c == d) // true
    println(c === d)  // false
    
}

3.  스마트 캐스트 알아보기

🐝  만약 어떤 값이 정수일 수도 있고, 실수일 수도 있는 경우에는 그때마다 자료형을 변환해도 되지만
     '스마트 캐스트'를 사용할 수 있음
🐝  스마트 캐스트 Smart Cast컴파일러가 자동으로 형 변환

    ⚡️  대표적으로 스마트 캐스트가 적용되는 자료형은 Number형이 있음
    ⚡️  Number형을 사용하면 숫자를 저장하기 위한 특수한 자료형 객체를 만듦
    ⚡️  Number형으로 정의된 변수에는 저장되는 값에 따라 정수형이나 실수형 등으로 자료형이 변환됨

fun main() {

    var test: Number = 12.2 // 12.2에 의해 test는 Float형으로 스마트 캐스트
    println("$test") // 12.2

    test = 12 // Int 형으로 스마트 캐스트
    println("$test") // 12

    test = 120L // Long형으로 스마트 캐스트
    println("$test") // 120

    test += 12.0f // Float형으로 스마트 캐스트
    println("$test") // 132.0
    
}

4.  자료형 검사하기

🐝  변수의 자료형을 알아낼떄는 is 키워드를 사용
🐝   is는 왼쪽 항의 변수가 오른쪽 항의 자료형과 같으면 true를, 아니면 false를 반환
🐝   is는 변수의 자료형을 검사한 다음 그 변수를 해당 자료형으로 변환하는 기능도 있음

   

    ⚡️ Any형을 사용하면 자료형을 결정하지 않은 채로 변수를 선언할 수 있음
    ⚡️ Any형은 코틀린의 최상위 기본 클래스로 어떤 자료형이라도 될 수 있는 특수한 자료형
    ⚡️ 이때 is를 사용하여 자료형을 검사하면 검사한 자료형으로 스마트 캐스트

fun main() {

    var num = 256

    if (num is Int) { // num의 자료형이 Int라면 실행.
        println(num) // 256
    } else if (num !is Int) {
        println("No an Int")
    }

    val x: Any
    x = "Hello"
    if (x is String) {
        println(x.length) // 5
    }
    /*
    변수 x는 Any형으로 선언. 그 후에 "Hello"라는 값을 대입. 아직 x의 자료형은 Any형.
    이후 if문으로 is로 x의 자료형을 검사할 때 String으로 스마트 캐스트되어 조건문이 실행.
     */

}

 


5.  묵시적 형변환

🐝  코틀린의 모든 클래스는 Any형이라는 슈퍼클래스(Superclass)를 가짐
🐝  Any는 자바의 최상위 클래스인 Object와 비슷하지만 서로 다른 유형
🐝  Any 형은 무엇이든 될 수 있기 때문에 언제든 필요한 자료형으로 자동변환할 수 있음
        ➡️  이것을 묵시적 변환이라고 함

fun main() {

    var a: Any = 1  // Any형 a는 1로 초기화 될 때 Int형이 됨.
    a = "one" // Int형이었던 a는 변경된 값에 의해 String이 됨.
    println("a: $a type: ${a.javaClass}") // 자바의 기본형을 출력하면 String이 나옴
    // 띄어씌기가 있으면 중괄호 생략 가능
    // a: one type: class java.lang.String

    checkArg("Hello") // x is String: Hello
    checkArg(5) // x is Int: 5
}

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

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

}

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]

+ Recent posts