[Kotlin] 02. 배열, 반복문, Nullable, 앨비스?:, 더블 뱅!!

 

4. 배열

fun array(){
    val array = arrayOf(1,2,3)
    val list = listOf(1,2,3)

    val array2 = arrayOf(1,"d",3.4f)
    val list2 = listOf(1,"d",11L)
    array[0] = 3
    //list[0] = 2 //immutable 값 변경 불가
    val arrayList = arrayListOf<Int>() //mutable한 List
    arrayList.add(10)
    arrayList.add(20)

    //arrayList = arrayListOf<Int>() //val 선언시 재할당 불가
}
  • array와 arrayList는 mutable하다 즉 값의 수정이 가능
  • list는 값의 수정이 불가능하다.

5. 반복문

fun forAndWhile(){
    val students = arrayListOf("one", "two", "three", "four")

    for (name in students) {
        println("${name}")
    }
    for ((index, value) in students.withIndex()){
        println("인덱스: ${index}, 값 : ${value}")
    }
    var sum = 0
    for (i in 1..10){ //1 이상 10 이하
        sum += i
    }
    println(sum)
    sum = 0
    for (i in 1 until 10){ //1 이상 10 미만
        sum += i
    }
    println(sum)
    sum = 0
    for (i in 10 downTo 1){ //10 이하 1이상
        sum += i
    }
    println(sum)

    var idx = 0
    while(idx < 5){
        println("현재 인덱스 : ${idx}") // 0부터 4까지 출력
        idx++
    }
}
  • for ( 원소 in 리스트 ) { } 의 경우 arrayList의 원소를 순서대로 가져온다.
  • for ((인덱스, 원소) in 리스트.withIndex()){ } 의 경우 인덱스와 원소를 동시에 가져온다
  • 조건의 범위 복습
    • 1 .. 101 이상 10 이하로 1씩 증가하는 값이 저장된 arrayList와 같다.
    • 1 until 101 이상 10 미만으로 1씩 증가하는 값이 저장된 arrayList와 같다.
    • 10 downTo 110 이하 1 이상으로 1씩 감소하는 값이 저장된 arrayList와 같다.
  • while문은 JAVA와 사용 방법이 같다.

6. Nuallable, Non-Nullable, ?: 엘비스 연산자, !! 빅뱅 연산자

fun nullCheck(){
    var name = "Kotlin" //타입 생략시 기본적으로 Non-Nullable 타입
    var nullName : String? = null //물음표를 붙여서 Nullable 타입

    var nameInUpperCase = name.uppercase()
    var nullNameInUpperCase = nullName?.uppercase() // "변수?" 사용으로 Null이 아니면 메소드를 호출, 아니면 Null을 대입
    // ?: 앨비스 연산자, Null일경우 default값을 지정
    var addName : String? = null
    var fullName = name + " "+(addName?: "has not fullName")
    println(fullName) // 변수?:기본값, 변수가 null일경우 기본값이 출력됨

    addName = "is fun"
    fullName = name + " "+(addName?: "has not fullName")
    println(fullName) // 변수가 null이 아닐경우 변수가 출력됨

    if (true){
        // null을 바로 대입하면 컴파일이 실패하므로 if문 안에서 null 대입하는 테스트코드
        addName = null
    }
    // !! 더블 뱅 연산자
    try {
        addName = addName!! //Nullable타입을 Non-Nullable 타입으로 강제로 지정함
        //절대로 Null값이 들어올 가능성이 없을때만 사용해야함.
        //코틀린은 Null safety한 언어지만 !!사용시 NullPointException 유발 가능성이 있음
        fullName = name + " ${addName.uppercase()}"
        println(fullName)
    }catch (e: Exception){
        println("오류: "+e)
    }

    var bestLanguage : String? = "kotlin"
    bestLanguage?.let{ //null이 아닐때만 작동
        println("최고의 언어는 ${bestLanguage}이다")
        println("$it 최고") // let 람다식의 객체는 it 키워드로도 호출이 가능하다
    }
    bestLanguage = null
    bestLanguage?.let{ //null이므로 작동이 되지 않음
        println("최고의 언어는 ${bestLanguage}이다")
    }
}
  • 타입을 생략할 경우 Non-Nullable타입이며 타입에 ?을 붙이면 Null을 허용한다

 

90도 회전한 엘비스 프레슬리의 머리카락과 닮았다

  • ?: 엘비스 연산자
    • 엘비스 프레슬리의 머리 모양을 닮은 연산자
    • NullableValue ?: DefaultValue
    • 만약 좌항의 변수나 상수값이 Null일 경우 기본값이 대체되어 사용됨

!!을 남용하다간 빅뱅처럼 터져버리니 주의할것

  • !! 더블 뱅 연산자
    • 변수나 상수값이 Null이 아닐것이라 확신할 경우에만 사용
    • NullableValue!!
    • NullPointException 유발 가능성이 있으므로 사용을 지양할것.
  • 값?.메서드()
    • 값이 Null이 아닐 경우에만 메서드가 작동하며 아니라면 Null값 취급됨.
  • 값?.let{ }
    • 값이 Null이 아닐 경우에만 let 중괄호 코드블럭{ }이 작동함.