Kotlin Study 03

parkchaebin·2021년 9월 15일
0

KotlinStudy

목록 보기
3/7
post-thumbnail

IDE : Intellij
JDK : zulu11

Kotlin 변수와 자료형

ValVar.kt

fun main(args: Array<String>) {
    val number = 10	// Int형으로 추론
    var language = "Korean"	// String으로 추론
    val secondNumber: Int = 20	// Int형으로 명시적 지정
    language = "English"	// var 변수는 값을 다시 할당할 수 있음

    println("numbar: $number")
    println("language: $language")
    println("secondNumber: $secondNumber")
}

val : 읽기 전용 변수
var : 초깃값이 있더라도 값을 바꿀 수 있음

FloatingDecimalPoint.kt

fun main(args: Array<String>) {
    var num: Double = 0.1

    for(x in 0..999){
        num += 0.1
    }

    println(num) // 100.09999999999859
}

0.1을 1000번 더하면 100이어야 하지만, 결과는 100의 근사치가 된다.
0.1(10)을 2진수로 표현하면 0.0 0011 0011 0011...(2)의 순환소수이기 때문에, Double 형의 가수 부분인 52비트를 넘어서는 부분이 잘려 표현된다.

MinMax.kt

fun main(args: Array<String>) {
    println("Byte min: ${Byte.MIN_VALUE} max: ${Byte.MAX_VALUE}")
    println("Short min: ${Short.MIN_VALUE} max: ${Short.MAX_VALUE}")
    println("Int min: ${Int.MIN_VALUE} max: ${Int.MAX_VALUE}")
    println("Long min: ${Long.MIN_VALUE} max: ${Long.MAX_VALUE}")
    println("Float min: ${Float.MIN_VALUE} max: ${Float.MAX_VALUE}")
    println("Double min: ${Double.MIN_VALUE} max: ${Double.MAX_VALUE}")
}

각 자료형의 최댓값 최솟값 출력

Byte min: -128 max: 127
Short min: -32768 max: 32767
Int min: -2147483648 max: 2147483647
Long min: -9223372036854775808 max: 9223372036854775807
Float min: 1.4E-45 max: 3.4028235E38
Double min: 4.9E-324 max: 1.7976931348623157E308

StringTest.kt

fun main(args: Array<String>) {
    val str1: String = "Hello"
    val str2 = "World"
    val str3 = "Hello"

    println("str1 === str2: ${str1 === str2}")	// false
    println("str1 === str3: ${str1 === str3}")	// true
}

문자열 자료형도 추론 선언 가능
str1, str3는 같은 문자열이 저장되는데, 이 'Hello'를 스택에 2번 저장하는 것이 아니라, Heap 영역의 String Pool 공간에 문자열 'Hello'를 저장하고, 이 값을 str1, str3가 참조하도록 한다. 결과적으로 str3와 str1의 참조 주소가 같으므로, 참조 비교연산자 ===를 사용하면 true를 반환한다.

FormattedString.kt

fun main(args: Array<String>) {
    val num = 10
    val formattedString1 = """
        var a = 6
        var b = "Kotlin"
        println(a + num)
    """.trimIndent()

    val formattedString2 = """
        var a = 6
        var b = "Kotlin"
        println(a + num)
    """

    println(formattedString1)
    println(formattedString2)
}

"""를 사용하여 문자열에 특수문자가 포함된 문자열을 나타낼 수 있다.

var a = 6
var b = "Kotlin"
println(a + num)
        var a = 6
        var b = "Kotlin"
        println(a + num)

NullTest.kt

fun main(args: Array<String>) {
    var str1: String = "Hello Kotlin"
    str1 = null
    println("str1: $str1")
}

변수에 null을 할당할 수 없기 때문에, 에러가 발생한다.

fun main(args: Array<String>) {
    var str1: String? = "Hello Kotlin"
    str1 = null
    println("str1: $str1")
}

?를 사용하여 null을 허용한다.

var str1: String? = null

println("str1: ${str1.length}")		// 에러
println("str1: ${str1?.length}")	// 'null' 출력.
println("str1: ${str1!!.length}")	// 컴파일은 되지만 실행 중 NPE를 발생시킨다.

val len = if(str1 != null) str1.length else -1
println("str1: $str1 length: $len")	// str1: null length: -1

println("str1: $str1 length: ${str1?.length ?: -1}")	// 세이프 콜, 엘비스 연산 사용

다양한 방법으로 null check 가능

ValueRefCompare.kt

fun main(args: Array<String>) {
    val a: Int = 128
    val b = a
    println(a === b)    // 자료형이 기본형인 int가 되어 값이 동일하므로, true

    val c: Int? = a
    val d: Int? = a
    val e: Int? = c

    println(c == d)     // 값의 내용만 비교 true
    println(c === d)    // 값은 같지만 참조 주소가 다르므로 false
    println(c === e)    // 값과 참조 주소가 같으므로 true
}

이중 등호와 삼중 등호를 사용하여 기본형과 참조형이 실제 메모리에 어떻게 저장되는지 확인

참조형 자료형

Java에서는 int, long, float, double 등의 기본형과 String, Date 등의 참조형을 모두 사용하지만 Kotlin에서는 참조형만 사용한다.
참조형 변수는 성능 최적화를 위해 코틀린 컴파일러에서 다시 기본형으로 대체되므로, 최적화를 고려하지 않아도 된다.

int a = 77;	// 기본형
Person persion = new Persion();	// 참조형으로 person 객체를 참조하기 위해 참조 주소를 가진다.
profile
안드로이드 개발자

0개의 댓글