[Kotlin]Any/is연산자/형변환

dada·2021년 9월 2일
0

Kotlin

목록 보기
13/14
post-thumbnail

🟥Any

open class Any

  • Any는 코틀린에서 모든 타입이 상속받는 최상위 타입

  • 자바로 디컴파일 해보면 Object 타입으로 변환되며,

  • 제네릭 타입으로 Any를 사용하면 어떤 객체를 집어넣든 업캐스팅이 적용돼서 모든 타입이 들어갈 수 있게 된다.

  • 자바의 Object와 코틀린 Any의 차이점

    • 자바에서는 참조 타입만 Object를 최상위 클래스로 상속받는다, 코틀린은 원시타입과 참조타입을 구별하지 않기 때문에 Any가 모든 타입의 조상 클래스가 된다.
    • wait(), notify(), notifyAll()처럼 쓰레드를 제어하는 메서드는 Any에 없음. 사용하려면 (any as Object).notify() 이런 식으로 형변환이 필요
    • 자바의 object는 toString, equals, hasCode, wait, notify를 지원하지만 Any는 toString, equals, hasCode만 지원
 fun main() {
    val arrayList = arrayListOf<Any>()
    arrayList.add("안녕")
    arrayList.add(1)
    arrayList.add(3.14)

    println(arrayList.joinToString()) // 출력 결과 : 안녕, 1, 3.14

        }}

    val name: Any = object : Any() {  
    //익명객체 사용할때 Any생략되어있어도 모두 디폴트로 Any상속받고 있음
        val yourname = "길동"
        override fun toString(): String {
            return "내이름은 길동이다"
        }
    }

🟨is연산자

  • 자바의 instanceof연산자와 같은 역할
  • 리턴값은 true, false
fun isInt(var1 : Any) : Boolean{
    return (var1 is Int)
}

🟩형변환-java

자바의 암시적 형변환(자동타입변환)

class Test {
	byte v1=10;
}

자바의 명시적 형변환(강제타입변환=캐스팅)

class Test {
	public void test(Object ob1, Object ob2) {
		if (ob1 instanceof String && ob2 instanceof String) {
		String v1=(String)ob1;
		String v2=(String)ob2;
		}
	}
}

🟪형변환-Kotlin

✔문자열->숫자

val string:String="1"
    val int:Int=string.toInt()
  • Number클래스에 있는 to~메서드 사용

✔숫자간 형변환

    val int2:Int=10
    val double:Double=int2.toDouble()
  • 위와 똑같음

✔숫자->문자열

    val double2:Double=13.3
    val string2:String=double2.toString()
    
    val string3:String=""+double2
    //val string3:String=double2+"" 안됨 주의!!

✔코틀린의 암시적 형변환(스마트 캐스팅)

 class Test {
    fun test(ob1: Any?, ob2: Any?) {
        if (ob1 is String && ob2 is String) {
            val v1 = ob1 
            //val v1=ob1.toString() 에서 toString()생략이 가능
            val v2 = ob2
            //val v2=ob2.toString() 에서 toString()생략이 가능
        }
    }
}
  • 자바코드와 비교를 해보자면 인스턴스를 생성하는 부분, 명시적 형변환을 해주는 부분 없음. 이것이 바로 코틀린의 스마트 캐스트.
  • if문에서 String, Int로 타입 체크 하여서 타입이 String, Int로 확인되었으므로 해당 타입으로 캐스팅하도록 컴파일 된 것
  • return var1 is Int && var1>0 이런식으로도 작성 가능
  • 제약: "캐스팅 이후에도 값이 바뀌지 않아야 한다."
    즉 인스턴스가 close되어 있거나 var필드, 로컬 변수에는 스마트 캐스트를 사용할 수 없음

✔코틀린의 명시적 형변환-as

val double3: Double = 3.5
    double3 as Int
    println(double3)  //3

val double3: Double? = null
    double3 as Int  //에러

val double3: Double? = null
    double3 as? Int  //가능

//부모 클래스
open class Animal
class Dog : Animal()
 
//클래스 형변환
val dog = Dog()
val animal = dog as Animal
  • 제약없이 사용 가능
  • 하지만 null타입이 가능할 경우 as?사용

참고
https://kychul98.tistory.com/88

profile
'왜?'라는 물음을 해결하며 마지막 개념까지 공부합니다✍

0개의 댓글