Kotlin 기초정리 - 반복문,Nullable,클래스

seoyoon jungseoyoon jung
4 min read

책만 보다가 다시 강의도 이어 보면서 정리 시작!
확실히 책으로 글만 쭉쭉 보다가 따라 쓰면서 정리하니 더 확 와닿는다.

아무튼 시작~

🔁 For / While 반복문

1. 기본 for

Java의 for (String name : list) 와 비슷하지만, Kotlin은 for (item in collection) 형식만 쓰면 됨.

fun forAndWhile() {
    val students = arrayListOf("sy", "hihi", "momo")
    for (name in students) {
        println(name)
    }
}

2. 범위 지정 반복

var sum: Int = 0
for (i in 1..10) {//1부터 10까지 포함
    sum += i
}
println(sum) // 55

3. step 키워드로 증가 간격 조절(홀수만 더하기)

var sum: Int = 0
for (i in 1..10 step 2) {
    sum += i
}
println(sum) // 1,3,5,7,9 가 더해질거라서 25

4. downTo로 감소 반복

var sum: Int = 0
for (i in 10 downTo 1) {//10부터 1까지..
    sum += i
}
println(sum)

5. until은 마지막 숫자 제외

var sum: Int = 0
for (i in 1 until 100) {//100을 포함하지 않는 1부터99번만 포함
    sum += i
}
println(sum)

6. while 문 기본 사용법

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

7. index와 값 함께 출력: withIndex()

val students = listOf("sy", "hihi", "momo")
for ((index, name) in students.withIndex()) {
    println("${index}번째 학생 : $name")
    //sy,hihi,momo순서대로 노출됨.
}

🔒 Null Safety (Nullable vs Non-null)

자바의 대표적인 예외 중 하나인 NullPointerException(NPE)을 컴파일 타임에 미리 방지해준다!

// npe : null point exception → 자바는 런타임 때 잡히는데,
// 코틀린은 컴파일 시점에서 잡을 수 있음 → ? 를 사용해서 방지

var name: String = "sy"           // null이면 안 됨
var nullName: String? = null      // ? 붙이면 nullable

var nameInUpperCase = name.toUpperCase()

// 아래는 에러 → nullName이 null일 수 있어서 경고 뜸
var nullNameInUppercase = nullName.toUpperCase()

// 안전하게 사용하려면
var nullNameInUppercase = nullName?.toUpperCase()
// null이 아니면 uppercase, null이면 null 반환됨
var name = "sy"
var nullName : String? = null //?붙여야해서 타입 생략하면 안됨
var nameInUpperCase = name.toUpperCase()

var nullNameInUppercase = nullName.toUpperCase()
//위와 같이 쓰면 빨간줄이 뜨는데 nullName가 Null인지 아닌지 몰라서 toUpperCase를 사용해야될지 모르겠다는 경고 뜸
var nullNameInUppercase = nullName?.toUpperCase() //그래서 ?를 붙여서 Null아니면 uppercase하고 nullName이 null이면 null을 반환함.
//이때 nullNameInUppercase는 string타입으로 추론이됨!

엘비스 연산자 (?:) - 디폴트 값 주기

val lastName: String? = null // null일 수 있다.
var fullName = name + " " + (lastName ?: "no lastName") // null이면 no lastName

val lastName2: String? = "jung"
var fullName2 = name + " " + (lastName2 ?: "no lastName") // jung 사용됨

!! - 컴파일에게 "null 아님!" 보장

확실하게 Null아님을 보장할 때 사용하는걸 추천!

fun ignoreNulls(str: String) {
    val mNotNull: String = str!! // 절대 null 아님 보장
    val upper = mNotNull.toUpperCase() // ? 안 써도 됨
}
//확실할 때만 쓰는 게 좋음!

let 사용 예시

kotlin복사편집var email: String? = "test@naver.com"
email?.let {
    // 이메일이 null이 아니면 실행됨
    println("my email is ${email}")
}

🧱 클래스와 생성자

기본 클래스

class Human {
    val name = "sy"
    fun eatingCake() {
        println("yummy~")
    }
}
fun main() {
    val human = Human() // Java와 달리 new 키워드 불필요
    human.eatingCake() // yummy~
    println("this human's name is ${human.name}") //human.name에 sy가 출력됨.
}

생성자 정의(constructor)

// Java였다면 이런식으로 작성했을테지만..
class Human {
    Human() {
        println("yummy2~")
    }
}

// Kotlin 기본 생성자는 이렇게 만든다.
class Human constructor(name: String) {
    val name = name
}

→ 프로퍼티인 name과 constructor에서 쓰이는 name이 같아서 축약이 가능하다:

class Human constructor(val name: String){
}
//위에꺼 한번 더 줄이면 아래과 같이 constructor 생략해서 사용가능!
class Human(val name: String)

→ 디폴트 값도 가능!!:

class Human (val name: String="test"){
    fun eatingCake(){
        println("yummy~")
    }
}

→ 디폴트 값을 넣음으로서 Human() 처럼 빈생성자도 생성 가능!

init 블록

class Human (val name: String="test"){
    fun eatingCake(){
        println("yummy~")
    }
}

위의 코드에서는 생성자에서 코드블럭으로 실행할수가 없는데 코드블럭을 넣고싶으면 다음과 같이 한다.

class Human(val name: String = "test") {
    init {
        // 생성될 때 어떤 동작을 하고 싶은지 정의 가능
        println("wow~")
    }

    fun eatingCake() {
        println("yummy~")
    }
}

부 생성자

constructor로 부생성자 생성이 가능하다.

class Human(val name: String = "test") { //이쪽 부분이 주 생성자

    constructor(name: String, age: Int) : this(name) {
        println("my name is ${name}, ${age} years old")
    }

    init {
        println("wow~")
    }

    fun eatingCake() {
        println("yummy~")
    }
}

꼭 this 라는약어를 써서 생성자의 위임을 받아야함.

0
Subscribe to my newsletter

Read articles from seoyoon jung directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

seoyoon jung
seoyoon jung