Boost Course

[코틀린 프로그래밍 기본 1] 2장. 변수와 자료형

kldaji 2021. 7. 17. 17:20

2-1 기본 자료형과 변수 선언방법 (1) 불변형, 기본형

1) val (value) : Immutable

2) var (variable) : mutable

 

※ 변수 선언 예시

a) val name = "KLDAJI" // Type 추론 가능 = 사용 가능

b) var name // 자료형을 지정해주어야 함. = 사용 불가능

c) val name: String // 사용 전 or 생성자 시점에서 반드시 초기화를 해주어야 함 = 사용 가능

 

3) 자료형

a) 기본형 : int, float, ...

b) 추론형 : Int, Float, ... (객체)

 

2-1 기본 자료형과 변수 선언방법 (2) 정수형과 실수형

1) Type 추론

- Short, Byte, Float는 직접 Type을 명시해주어야 한다.

fun main() {
    val num1 = 127 // Int
    val num2 = -32768 // Int
    val num3 = 2147483647 // Int
    val num4 = 9223372036854775807 // Long

    val exp1 = 123 // Int
    val exp2 = 123L // Long
    val exp3 = 0x0F // Int -> 16진수
    val exp4 = 0b00001011 // Int -> 2진수
}

 

2) 지수 표현

fun main() {
    val exp1 = 3.14E-2 // 왼쪽으로 소수점 2칸 이동, 0.0314
    val exp2 = 3.14e2  // 오른쪽으로 소수점 2칸 이동, 314
}

 

2-1 기본 자료형과 변수 선언방법 (3) 크기 범위와 기타 자료형

1) 자료형의 최댓값 최솟값

fun main() {
    println("MAX : ${Int.MAX_VALUE}, MIN : ${Int.MIN_VALUE}")
}

 

2) 문자열

- String은 String Pool에 저장된다.

fun main() {
    val str1: String = "Hello"
    val str2 = "Kotlin"
    val str3 = "Hello"

    // == : 값만 비교
    // === : 값과 참조주소 비교 연산자
    println("str1 === str2 : ${str1 === str2}")
    println("str1 === str3 : ${str1 === str3}")
}

 

2-2 나를 괴롭히는 널(Null)!

1) 기본적으로 코틀린 변수 선언은 null을 허용하지 않는다.

fun main() {
    var str1: String
    str1 = "Hello"
    println(str1) // Hello
    
    str1 = null
    println(str1) // NPE
}

 

2) null 허용 변수 선언

fun main() {
    var str1: String?
    str1 = "Hello"
    println(str1) // Hello

    str1 = null
    println(str1) // null
}

 

3) safe call

fun main() {
    var str1: String? // nullable String
    str1 = "Hello"
    println(str1?.length) // 5

    str1 = null
    println(str1?.length) // null
}

 

4) 엘비스 연산자

fun main() {
    var str1: String? // nullable String
    str1 = "Hello"
    var len = str1?.length ?: -1
    println(len) // 5

    str1 = null
    len = str1?.length ?: -1
    println(len) // -1
}

 

 

2-3 검사와 자료형을 변환해보기

1) 자료형 변환 함수

- 기본형을 사용하지 않고 참조형만 사용하기 때문에 자료형을 변환하고 싶다면 내장된 함수를 사용해야 한다.

fun main() {
    val a: Int = 1
    val b: Double = a // Error
    val c: Int = 1.1 // Error
}
fun main() {
    val a: Int = 1
    val b: Double = a.toDouble()

    // 표현식에서의 자료형은 자동으로 변환된다.
    val result = 1L + 3 // Long
}

 

2) 이중 등호와 삼중 등호

- Int는 참조형 변수이지만, 컴파일 시에 기본형으로 간주되기 때문에 stack에 저장된다.

- Int?는 객체가 되어 heap 영역에 저장된다.

fun main() {
    val a: Int = 1 // stack
    val b: Int = 1 // stack
    println(a == b) // true
    println(a === b) // true

    val c: Int = 2 // stack
    val d: Int? = 2 // heap
    println(c == d) // true
    println(c === d) // false
}

 

3) 스마트 캐스트

- Number로 선언된 변수는 숫자 Type으로만 casting이 가능하다.

fun main() {
    var test: Number = 12.2 // Double
    test = 1 // Int
    test = 120L // Long
    test = 10.0f // Float
}

 

4) Any

- 모든 Type으로 casting이 가능하다.

fun main() {
    var test: Any = 12.2 // Double
    test = 1 // Int
    test = 120L // Long
    test = 10.0f // Float
    test = "Hello" // String
}

 

 

2-4 연산자를 조합해 다양한 식 만들기 (2) 비트연산자

/*
 * num.shl(bitCount) -> 항상 logical
 * num.shr(bitCount) -> arithmetic
 * num.ushr(bitCount) -> logical
 * num.and(bitCount)
 * num.or(bitCount)
 * num.xor(bitCount)
 * num.inv()
 */