[Kotlin] 코틀린 기본 문법(2) - 배열, 리스트, 반복문, null, 클래스

05_배열과 리스트(Array, List)


☾ Array

기본적으로 메모리가 할당되어 있어야 한다.

한 배열 안에 다양한 타입이 들어갈 수 있다.

값을 변경할 수 있다.

val array = arrayOf(1,2,3)
val array2 = arrayOf(1,"d",3.4f)

array[0] = 3 // 값 변경 가능

 

 

☾ List

1. List : 값을 지정하면 변경이 불가능하다.(read only)

val list = listOf(1,2,3)
val list2 = listOf(1,"d",11L)

val result = list.get(0) // 값 읽기만 가능

 

 

2. MutableList : 값을 변경할 수 있다.

val arrayList = arrayListOf<Int>() // 값을 추가해도 참조변수의 값은 그대로이므로 val 사용 가능
    arrayList.add(10)
    arrayList.add(20)
    
// val이므로 참조변수 값 변경은 불가
// arrayList = arrayListOf()

 

 

 

06_반복문(for, while)


☾ for

range의 원소들이 차례대로 변수에 들어가서 실행

💡 for (변수 in range) { }
val students : ArrayList<String> = arrayListOf("james", "tom", "henry")

for (name in students) {
    println("${name}")
}

 

 

‘a 이상 b 이하’를 표현하고 싶을 때는 a..b로 작성

var sum : Int = 0
for (i in 1..10 step 2) { // 1 이상 10 이하
    sum += i
}
println(sum)

 

 

증가하는 숫자를 변경하고 싶을 때는 step 사용

var sum : Int = 0
for (i in 1..10 step 2) { // 1 이상 10 이하 2 step씩
    sum += i
}
println(sum)

 

 

‘a 이상 b 미만’을 표현하고 싶을 때는 a until b로 작성

for (i in 1 until 10) { // 1 이상 10 미만
    print("${i} ")
}
println()

 

 

역순으로 표현하고 싶을 때는 downTo 사용

for (i in 10 downTo 1) { // 10부터 1까지
    print("${i} ")
}
println()

 

 

인덱스와 함께 출력하고 싶을 때는 withIndex 메소드 사용

val students : ArrayList<String> = arrayListOf("james", "tom", "henry")

var index = 0
for ((index, name ) in students.withIndex()) {
    println("${index+1}번쩨 학생 : ${name}")
}

 

 

☾ while

var index = 0
while (index < 10) {
    println("current index : ${index}")
    index++
}

 

 

 

07_Nullable vs NonNull


기본적으로 변수는 NonNull이다.

 

 

☾ Nullable

타입명 뒤에 ? 붙이면 null을 가질 수 있다.

var name = "jojo" // null 불가
var nullName : String? = null // null 가능

// 만약 nullName이 null이면 null 반환하고, null이 아니면 uppercase 실행
var nullNameInUpperCase = nullName?.uppercase()

 

 

  • 엘비스 연산자(Elvis Operation) ?:

: nullable 변수의 디폴트 값 만들어줄 때 사용한다.

var name = "jojo"
val lastName : String? = null
val fullName = name+ " " + (lastName?: "No lastName")
println(fullName)

 

 

  • let

자신의 receiver 객체를 람다식 내부로 옮겨서 실행한다.

null이 아닌 경우에만 실행된다.

val email : String? = "12345@gmail.com"
email?.let{ // email이 null 아닌 경우에만 실행
    println("my email is ${email}")
}

 

 

  • !!

null이 아니라는 것을 보증한다.

null이 아니라고 확신할 수 있을 때만 사용해야 한다.

fun ignoreNulls(str : String?) {
    val mNotNull : String = str!!
    val upper = mNotNull.uppercase()
}

 

 

 

08_클래스(class)


파일 이름과 클래스 이름이 반드시 일치하지 않아도 된다.

한 파일 안에 여러 클래스가 존재해도 된다.

💡 class 클래스이름 contructor(변수 선언) { }
class Human constructor(val name : String = "Annoymous") {

    fun eatingCake() {
        println("This is so yummy")
    }

    open fun singASong() {
        println("lalala")
    }
}

 

 

  • 생성자
    • 주 생성자 : 인스턴스가 생성될 때 작동
    • 부 생성자 : 반드시 주 생성자의 위임을 받아야 함
open class Human constructor(val name : String = "Annoymous") {
    // 주 생성자
    init {
        println("New human has been born")
    }

    // 부 생성자
    constructor(name : String, age :Int) : this(name) {
        println("My name is ${name}, ${age} years old")
    }
}

 

 

  • 상속

상속 받으려면 상속되는 클래스에 open 선언이 필요하다.

open class Human constructor(val name : String = "Annoymous") {

    fun eatingCake() {
        println("This is so yummy")
    }

    open fun singASong() {
        println("lalala")
    }
}

// 상속
class Korean : Human() {
    override fun singASong() {
        super.singASong()
        println("라라라")
        println("My name is ${name}")
    }
}