[Kotlin] 코틀린 기본 문법 연습

yuuuzzzinzzzang·2021년 6월 29일
0

🔵 Kotlin 🟠

목록 보기
1/3
post-thumbnail

[Code with Joyce] 코틀린 3강으로 끝내기 - 1편 기본 문법
영상을 보고 코드로 익힌 코틀린 기본 문법이당 !
(아니...근데 Joyce 이 분은 다 가지셨네 진짜,, 너무 매력적이시구 영어도 잘 하시고 말도 잘 하시고 개발도 잘 해..)

package com.yuuuzzzin.kotlinpractice

/*
8. 클래스
*/
// open 예약어를 통해 상속이 가능
open class Human (val name : String = "Anonymous"){

    // 부생성자는 주생성자의 위임을 받아야 함. -> this 예약어 사용해서 name 받아옴
    constructor(name : String, age : Int) : this(name) {
        println("my name is ${name}, ${age}years old")
    }

    // 주생성자 -> 얘가 부생성자보다 먼저 생성.
    init {
        println("New human has been born !!")
    }

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

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

// 부모생성자를 부름
class Korean : Human() {
    // 오버라이딩 : 상속받은 메소드를 이 클래스에서 다르게 사용하고 싶을 때.
    override fun singASong() {
        super.singASong() // lalala
        println("라라라")
        println("my name is :${name}") // 생성자가 없으니까 anonymous
    }
}

// 시작되는 엔트리 함수
fun main() {
//    val human = Human("yuuuzzzin") // new 필요 없음
//    val stranger = Human()
//    human.eatingCake()

    val friend = Human("hayoung", 25)

    val korean = Korean()
    korean.singASong() // 라라라 출력

//    println("this human's name is ${human.name}")
//    println("this human's name is ${stranger.name}") // 디폴트 값(Anontmous) 출력
}

// 1. 함수

// return 형식이 없을 땐 Unit (void 같은 것)
// 생략 가능
fun helloWorld() {
    println("Hello World")
}

// (변수 이름, 변수 타입)
// 뒤에 : Int로 리턴 타입 지정
fun add(a : Int, b : Int) : Int {
    return a + b;
}

// 2. val vs var
// 상수 val = value. 값. (불변)
// 변수 var = variable

fun f2() {
    val a : Int = 10 // 변하지 않는 값
    var b : Int = 9 // 변할 수 있는 값

    // a = 100 는 오류
    b = 100

    val c = 100 // 타입 추론이 가능해 Int를 써주지 않아도 OK.
    var d = 100

    var name = "yuuuzzzin"

    // 값을 바로 할당하지 않는 경우엔 타입을 명시해주어야 함.
    // var e 는 오류
    var e : String
}

// 3. String Template
fun stringTemplate() {
    val name = "yuuuzzzin"
    val lastName = "Park"
    // 변수 출력 시에는 $표시 사용
    // $변수 뒤에 띄어쓰기를 하지 않으려면 ${변수} 이렇게 중괄호로 묶어줌
    println("my name is ${name + lastName}I'm good")
}

// 4. 조건문 if와 when
fun maxBy(a : Int, b : Int) : Int {
    if(a > b) {
        return a
    } else {
        return b
    }
}

fun maxBy2(a : Int, b : Int) = if(a > b) a else b
// 자바에서의 삼항연산자를 위와 같이 표현
// return (a > b) ? a : b

fun checkNum(score : Int) {
    when(score) {
        0 -> println("this is 0")
        1 -> println("this is 1")
        2, 3 -> println("this is 2 or 3")
    }

    var b = when(score) {
        1 -> 1
        2 -> 2
        else -> 3 // 변수에 값을 할당해주는 경우에는 else 꼭 써주기.
    }

    println("b : ${b}")

    when(score) {
        in 90..100 -> println("You are genius")
        in 10..80 -> println("not bad")
        else -> println("okay")
    }
}

/*
Expression vs Statement
Expression은 무언가 동작을 해서 값을 만들어내는 것
Statement는 실행만. 값을 만들진 않음.
코틀린의 모든 함수는 Expression (리턴하는 것이 없어 보여도, 사실은 Unit을 리턴)
*/

/*
5. Array and List
Array는 처음에 크기를 지정해줘야 함
List - 1. List(수정 불가) 2. Mutable List(수정 가능)
Mutable LIst의 가장 대표적인 것이 ArrayList
*/

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는 불가
    var result = list.get(0)

    // 주소값은 변하지 않으므로 val
    val arrayList = arrayListOf<Int>()
    arrayList.add(10)
    arrayList.add(20)

    // arrayList = arrayListOf() 오류
    // 새로운 객체를 생성해서 할당하는 경우는 오류
}

/*
6. 반복문 for / while
 */

fun forAndWhile() {
    val students = arrayListOf("joyce", "james", "jenny", "jennifer")
    for(name in students) {
        println("${name}")
    }

    var sum = 0
    for(i in 1..10) {
        sum += i
    }
    println(sum) // 55

    sum = 0
    for(i in 1..10 step 2) {
        sum += i
    }
    println(sum) // 25

    sum = 0
    for(i in 10 downTo 1) {
        sum += i
    }
    println(sum) // 55

    sum = 0
    for(i in 1 until 100) { // 1..100과 다른 점? -> until 100은 100을 포함 x
        sum += i
    }
    println(sum) // 4950

    var index = 0
    while(index < 10) { // 0부터 9까지 출력
        println("current index : ${index}")
        index++
    }

    // index와 이름 같이 출력력
   for((index, name) in students.withIndex()) {
        println("${index + 1}번째 학생 : ${name}")
    }
}

/*
6. Nullable / NonNull -> 코틀린의 자바와 다른 가장 큰 특징
 */

fun nullcheck() {
    // NPE : Null Pointer Exception
    // 자바는 컴파일 시점에서 잡을 수 없고, 런타임 시점에서만(돌려봐야만) 알 수 있음

    var name : String = "yuuuzzzin"
    // var nullName : String = null 오류
    var nullName : String? = null // ?를 붙여 Nullable 타입이 됨. 타입생략하면 안 돼 !

    var nameInUpperCase = name.toUpperCase()
    // ?연산자를 통해 null이 아니면 실행, null이면 null 반환을 간단히 표현 가능
    var nullNameInUpperCase = nullName?.toUpperCase()

    // ?:연산자 - 디폴트값을 주고 싶을 때
    val lastName : String? = null
    val fullName = name + " " + (lastName?: "NO lastName")
    println(fullName) // yuuuzzzin NO lastName
}

// !! 연산자 -> 절대 null일 일이 없을 때. null이 아닌 것을 보증해 줄 때.
// 사용을 지양. 이유 -> 확실하게 null이 아닌 이상 사용을 지양
fun ignoreNulls(str : String?) {
    // val mNotNull : String = str -> 오류
    val mNotNull : String = str!!
    val upper = mNotNull.toUpperCase()

    val email : String? = "yuuuzzzin@yj.com"
    email?.let { // email이 null이면 수행되지 않기 때문에 safe
        println("my email is ${email}")
    }
}
profile
yuuuzzzin의 개발 블로그

0개의 댓글