[kotlin] 코틀린 Type

백현균·2023년 4월 2일
0

1. 코틀린 타입 종류

1) 기본 타입

타입		비트 크기
Double	64
Float	32
Long	64
Int		32
Short	16
Byte	8

2) 이외 타입

Any
	- 자바에서 Object타입과 동일함
    - 모든 Primitive Type의 최상위 타입은 Any
    	* 자바는 레퍼런스 타입만 최상위 타입이 Object
	- Any자체로는 null을 표현할 수 없으며, Any?형태로 사용하여 null처리
Unit 
	- 자바에서 void 타입과 동일
    - void와의 차이점은 Unit은 그 차제로 타입으로 사용 가능
    - Unit은 하나의 인스턴스(싱글턴)을 갖는 의미
    	* 즉 코틀린의 Unit은 실제 존재하는 타입
Nothing
	- 함수가 정상적으로 처리되지 않았다는 사실을 표현하는 역할
    - 자바에서 함수 뒤에 throws를 붙이는 것과 같아 보임
    fun fail(message: String): Nothing {
    	throw IllegalArgumentException(message)
	}
    

3) 자바 vs 코틀린 캐스팅 연산

기본 타입

자바
	- 타입 간 변환이 암시적
	int number1=4;
    long number2 = number1;
	-> number1을 number2로 = 연산을 할 때, 내부적으로 int -> long 처리
코틀린
	- 타입 간 변환이 명시적 -> 코틀린에서는 암시적변환을 지원 하지 않음
	val number1:int = 4
    val number2:Long = number1 -> error
    
    val number:int = 4
    val number2:Long = number1.toLong()
   	-> 변수.toXXX()함수를 붙여 up or down캐스팅을 해야함 

객체 인스턴스

자바
	private void castToJava(obj:Object){
    	if(obj instanceOf Person){
        	Person person = (Person)obj;
            System.out.println(person.getName());
        }
    }
    
코틀린
	private fun castToKotlin(obj:Any){
    	if(obj is Person){
        	println(obj.name)
        }
        
        if(obj is Person){
        	val person = obj as Person
        	println(obj.name)
        }
    }

자바에서는 캐스팅 연산할 타입으로 변환 후 사용해야 하는 반면
코틀린에서는 스마트캐스트라는 기능을 이용해 타입을 이용한 변환을 해주지 않아도 자동으로 알아서 변환 처리
	* 스마트캐스트: if조건에서 is키워드를 통해 조건이 맞을 경우
    조건상의 타입으로 알아서 간주하여 변환하는 기능

4) nullable에 대한 캐스팅 연산

as 키워드 뒤에 ?을 붙여 safety call을 할 수 있다.

fun pringAgeIfPerson(obj:Any?) {
    // as 키워드 뒤에 ? 을 붙여주게 될 경우, obj가 null일 경우, obj as? Person 자체가 null처리됨 -> safety call
    val person = obj as? Person;
    
    // 엘비스 조건을 이용해, null일경우 값을 0으로 부여
    val age = person?.age ?: 0
}

5) String interpolation / String indexing

fun testString(){
    // java style
    val person = Person()
    val msg = String.format("나이: %s, 이름: %s", person.age, person.name)
    System.out.println(msg)

    //kotlin style
    // 괄호 생략 가능이 가능하지만, 가독성, 일괄변환, 정규식활용 측면에서 {}사용하는것이 더 좋았다. - 발표자 기준
    val msg_kotlin = "나이: ${person.age}, 이름: ${person.name}"

    val msg1 = """
        나이: ${person.age},
        이름: ${person.name}
        
    """.trimIndent()

    println(msg1)

    // 특정 문자열 가져오기
    // java -> str.charAt(1)
    var str = "abcdef"
    println(str[0])
}

0개의 댓글