본문 바로가기
Mobile/Kotlin

[Kotlin] #2 : 변수, 함수, null, 세이프콜, 엘비스 연산자, 스마트 캐스트 230213

by haheehee 2023. 2. 13.

++ 변수 ++

- Int, Short, Long, Double, Float, Byte, Boolean : 기초 타입 객체

- Char, String : 문자와 문자열

   String 타입의 데이터는 문자열을 큰따옴표(“)나 삼중 따옴표(“””)로 감싸서 표현 String Pool이라는 공간에 구성

 

- 코틀린의 표현식은 $기호

   ex) $a 혹은 중괄호 이용 ${a+2}

 

- Any : 모든 타입 가능, 들어오는 데이터에 제약을 받지 않음

- Unit : 반환문이 없는 함수, 자바의 반환형 void 와 비슷 (기본형)

 

++ for 구문 ++

- of 예약어 : 반복 가능한 객체(iterable)를 순회

- in 예약어 : 객체의 모든 '열거할 수 있는 속성들'을 순회

 

++ null ++

- null을 허용한 변수 검사

- NPE(NullPointerException) : 사용할 수 없는 null인 변수에 접근하면서 발생하는 예외

- 코틀린에서는 기본적으로 null을 허용하지 않는다.

- 하지만 자바기반이므로 융통성을 발휘해 변수형 선언 뒤에 ?를 붙이면 null을 허용해줌

   val a: Int? = null

   var b: String? = null

- Int형과 Int?형은 형이 다르다!!! 들어가는 값의 형태만 같을 뿐, 저장공간은 다름!

 

세이프 콜과 엘비스 연산자를 활용해 null을 허용

str1?.length ?: -1

- 삼항연산자의 간략화

- .length가 조건도 되고 참일경우에도 해당되는것. -1은 거짓일때 반환하는 것!

 


fun someFun() {
    var data1: Int = 10
    var data2: Int? = null
    data1 = data1 + 10
    data1 = data1.plus(10)
}

- null 대입 가능

- 객체의 메서드 이용 가능

 

package com.example.p14

val a1: Byte = 0b00001011

val a2: Int = 123
val a3: Short = 123
val a4: Long = 10L
val a5: Double = 10.0
val a6: Float = 10.0f

val a7: Boolean = true

val a: Char = 'a'
/*
if (a == 1) {

}*/

fun main() {
    var str11: String = "Hello"
    var str2 = "World"
    var str3 = "Hello"

    println("str === str2: ${str11 === str2}")
    println("str === str3: ${str11 === str3}")
}

 

package com.example.p15

fun main() {
    fun sum(no: Int): Int {
        var sum = 0
        for(i in 1..no) {
            sum += i
        }
        return sum
    }

    val name: String = "kkang"
    println("name: $name, sum: ${sum(10)}, plus: ${10+20}")
}

 

package com.example.`p15-2`

fun main() {
    var a = 1
    val str1_15 = "a = $a"
    val str2_15 = "a = ${a+2}"
    println("str1 : \"$str1_15\", str2 : \"$str2_15\"")
}

 

package com.example.p16

val data1: Any = 10
val data2: Any = "hello"

class User
val data3: Any = User()

val data1_2: Unit = Unit
fun som(): Unit {
    println(10 + 20)
}

fun some() {    // 반환타입 생략
    println(10+20)
}

fun main() {
    som()
    some()
}

 

package com.example.p17

fun main() {
    var str1 : String = "Hello Kotlin"
    //str1 = null // null을 허용하지 않으므로 오류 발생
    var str2 : String? = "Hello Kotlin"
    str2 = null

    println("str1: $str1")
    println("str2: $str2")
}

 

package com.example.p18

fun main() {
    var str1 : String? = "Hello Kotlin"
    str1 = null
    // 조건식을 통해 null 상태 검사
    val len = if(str1 != null) str1.length else -1
    println("str1: $str1 length: ${len}")
}

 

package com.example.p19

fun main() {
    var str1: String? = "Hello Kotlin"
    str1 = null
    println("str1: $str1 length: ${str1?.length ?: -1}") // 세이프 콜과 엘비스 연산자
}

 

 


++ 코틀린의 자료형 변환 ++

- 기본형을 사용하지 않고 참조형만 사용

- 서로 다른 자료형은 변환 과정을 거친 후 비교

- 변환 메서드의 이용(toDouble과 같은)

- 표현식에서 자료형의 자동 변환

 

++ 변환 메서드의 종류 ++

- toByte: Byte

- toLong: Long

- toShort: Short

- toFloat: Float

- toInt: Int

- toDouble: Double

- toChar: Char

 

++ 코틀린에서의 등호 ++

- 값만 비교하는 경우 : ==

- 값과 참조 주소를 비교할 때 : ===

- 코틀린에서는 참조형으로 선언한 변수의 값이 -128~127 범위에 있으면 캐시에 그 값을 저장함

 

**?가 붙은 형은 객체형이기 때문에 기본형과 차이를 두어야 한다.

 

 


package com.example.p20

val a: Int = 1
// val b: Double = a // 자료형 불일치
// val c: Int = 1.1 // 자료형 불일치

val b: Double = a.toDouble()    // 변환 메서드 사용

// (: Any)가 생략되어 있는 것. Any는 기본형이니까~
val result = 1L + 3 // Long + Int -> result 는 Long

 

package com.example.p22

val a: Int = 128
val b: Int = 128

val a2: Int = 128
val b2: Int? = 128
fun main() {
    println(a == b)
    println(a === b)
    println()
    println(a2 == b2)
    println(a2 === b2)
}

**** 다시 체크하기..

val a2: Int? = 128
val b2: Int = 128

물음표를 반대로 체크하면 또 원래 개념대로 출력이 나온다...

 

package com.example.p23

fun main() {
    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
}

 

 


++ 스마트 캐스트 ++

- 구체적으로 명시되지 않은 자료형을 자동 변환

- 값에 따라 자료형을 결정

- Number형은 숫자를 저장하기 위한 특수한 자료형으로 스마트 캐스됨

 

++ is 키워드 ++

- is키워드로 검사

if( num is Int) {,,,} => num형이 Int 형일 때

 

++ Any ++

- 자료형이 정해지지 않은 경우

- 모든 클래스의 뿌리

- Int나 String은 Any형의 자식 클래스

- Any는 언제든 필요한 자료형으로 자동변환(스마트 캐스트)

 

 


package com.example.p24

fun main() {
    var test: Number = 12.2
    println("$test")

    test = 12
    println("$test")

    test = 120L
    println("$test")

    test += 12.0f
    println("$test")
}

 

package com.example.p25

fun main() {
    val num = 256
    if(num is Int) {
        print(num)
    } else if(num !is Int) {
        print("Not a Int")
    }
}

 

package com.example.p27

fun main() {
    var a: Any = 1
    a = 20L
    println("a: $a type: ${a.javaClass}")
}

- Any형 a는 1로 초기화될 때 Int형이 됨

- Int형이였던 a는 변경된 값 20L에의해 Long이 됨

- a의 자바 기본형을 출력하면 long이 나옴

 

package com.example.p28

fun main() {
    checkArg("Hello")
    checkArg(5)
}

fun checkArg(x: Any) {
    if(x is String) {
        println("x is String: $x")
    }
    if(x is Int) {
        println("x is Int: $x")
    }
}

 

댓글