[Kotlin] 변수/타입/Null

박진성·2023년 6월 2일
0
post-custom-banner

변수


→ 변수이름 지정 : Camel case

  • 소문자, 이어지는부분에만 대문자
  • 명사, 명사구로 지정

var 과 val

→ val : 변경 불가능한 변수 (immutable)

  • 한번 선언된 값을 변경하지 못함
  • 값의 읽기만 혀용
  • java의 final 특성과 같음
  • val이 가리키는 객체의 내부는 변경 가능하다

→ var : 변경 가능한 변수 (mutable)

  • 한번 선언된 값을 변경할 수 있음
  • 값의 읽기와 쓰기 모두 허용
  • 하지만, 선언시 사용한 타입으로만 변경 가능


변수 타입 (생략도 가능)

→ Type 지정

  • val name: String = “”

→ Type 생략

  • val name = “”


const val

  • const는, var에쓸수 없고, val에만 쓸수 있다

  • const val : 값이 컴파일 시에 결정되는 상수

    • 함수, 클래스 생성자로 할당 불가!!
  • val: 값이 런타임 시에 결정되는 상수. 불완전한 불변성


변수의 늦은 초기화



lateinit

  • lateinit var 변수명 : 타입명
  • 늦은 초기화 기법.
  • 변수의 첫 상태를 정의하기 어렵고, 나중에 정의할때 사용!!
    • 나중에 어떻게 정의할지 상관 없음
    • 초기화 이후 값이 계속 바뀔수 있을때
fun main() {
    lateinit var text: String

    val result1 = 30
    text = "Result : $result1"
    println(text)

    
    val result2 = 50
    text = "Result : ${result1 + result2}"
    println(text)
}
  • 무조건 var 과 함께 사용!
  • 원시타입 (Int, Float, Double, Long, Short, Boolean, Byte, Char) 에는 사용불가



by lazy

  • val 변수명 : 타입명 by lazy{ 값 }
  • 늦은 초기화 기법.
  • 변수의 첫 상태를 정의하기 어렵고, 나중에 정의할때 사용!!
    • 나중에 어떻게 정의할지 미리 정해놓음
    • 초기화 이후 읽기전용 값으로 사용할때
fun main() {
    lateinit var text: String

    val textLength: Int by lazy {
        text.length
    }

    text = "asdfsdf"
    println(textLength)
}
  • 무조건 val 과 함께 사용!



타입



type check operator (is)

  • 좌항변수가 우항타입인지 Boolean 으로 반환
val test = 0 
val test2 = "0"

val result = test is Int 
print(result)
// true

val result2 = test2 is Int
print(result)
// false

기본타입 (String 제외 원시타입임)

  • Int / Long / Short
    • Long 은 숫자끝에 L 붙임
  • Double / Float
    • Float 는 숫자끝에 F 붙임
  • Boolean
    • true or false 값 가짐
  • String
    • ‘ ’ 안되고 “ ” 로만 입력
    • “”” “”” : 여러줄에 걸쳐 문자열 저장
    • $ 로 변수값 문자열로 저장 가능.
    • ${변수.substring(0,6)} : 문자열 잘라오기 가능
  • Char
    • “ ” 안되고 ‘ ’ 로만 선언



형변환

→ 명시적 형변환

  • .toByte(): Byte
  • .toShort(): Short
  • .toInt(): Int
  • .toLong(): Long
  • .toFloat(): Float
  • .toDouble(): Double
  • .toChar(): Char

→ 암시적 형변환

  • 자료형 두개 연산시, 결과값 큰 자료형으로 변환됨
val l = 1L + 3 // Long + Int => Long

→ Unsafe cast operator (as)

  • 좌항변수를 우항타입으로 형변환
val text : String = 123 as String 
  • type 변경 실패시, exception 발생

→ Safe cast operator (as?)

  • 좌항변수를 우항타입으로 형변환
val text : String? = 123 as? String 
  • type 변경 실패시, null 반환
    • 따라서 무조건 반환값 담는 변수도 nullable type 이어야 한다



Null



Non-null type vs Nullable types

  • kotlin 모든 기본타입들은 Non-null type → null 할당 불가
  • Type 뒤에 ? 를 붙여서, nullable 임을 선언해야한다.
    var userName: String? = 'ivy'
    userName = null

Null safe operator (?.)

  • 좌항이 null 이면 null 반환.
    • 앞의 변수가 null 이 아닐때만 오른쪽 함수가 실행됨

    • 앞의 변수가 null 일때는 null 을 반환

      var text : String? = null
      print(text?.uppercase())
      // 결과 = null
      
      var text : String? = "asdf"
      print(text?.uppercase())
      // 결과 = asdf
  • 함수 뿐만 아니라, class 의 property 접근시에도 활용 가능
  • null safe operator 를 쓰지 않으면, null 값일 경우 NullPointerException 이 발생되어 프로그램이 터지므로, 꼭 사용해줘야한다



Elvis operator (?:)

  • 좌항이 null 이면 설정된 deafult 값 반환
    fun getName(str: String?) {
        val name = str ?: "Unknown"
    		print(str)
    }
    
    var text = readLine()?: "default"
    • readLine() ?: “default” 하게되면

      → 입력받은값 있을때, 그대로 반환

      → 입력받은값 없을때 (null 일때) “default” 반환



Not null assertion operator (!!)

  • 좌항이 절대 null이 아닐것이라고 명시
  • 절대 null이 들어가지 않는곳에 선언!!
    fun ignoreNulls(s: String?) {
        val sNotNull: String = s!!
        println(sNotNull.length)
    }
    • ignoreNulls(null) 하면 NPE 발생됨!
    • 하지만 어디서 NPE 발생했는지 명확히 알 수 있음

문자열 처리

→ isEmpty() / isNullOrEmpty()

  • 특정 문자열이 “” 빈 문자열인지 확인
  • null 과 다르다!
val s1 = ""
s1.isEmpty() // true
val s2 = "  "
s2.isEmpty() // false
  • isNullOrEmpty() 사용시, Null 까지 검사

→ isBlank() / isNullOrBlank()

  • 특정 문자열이 “” 이거나 “ ” 인지 확인
  • 공백까지 확인한다
val s1 = ""
s1.isBlank() // true
val s2 = "  "
s2.isBlank() // true
  • isNullOrBlank() 사용시, Null 까지 검사!
profile
Android Developer
post-custom-banner

0개의 댓글