국비교육(22-23)

74일차(1)/Android App(25) : Kotlin 연산자 / apply / when

서리/Seori 2023. 1. 20. 14:11

74일차(1)/Android App(25) : Kotlin 연산자 / apply / when

 

 

- 새 코틀린파일

package com.example.kotlin_test

/*
    - 비교 연산자
    == 와 === 의 구분
    == 는 값이 같은지 비교
    === 는 참조값이 같은지 비교

    != 같이 다른지 비교
    !== 는 참조값이 다른지 비교

    - 3항 연산자가 없다. 대신 대체할 수 있는 문법이 있다.

    - Elvis 연산자
    ?:
 */

fun main(){
    /*
        names와 names2 는 참조값은 다르지만 안에 저장된 값은 같다.
     */
    val names = listOf("kim","lee","park")
    val names2= listOf("kim","lee","park")

    println(" names === names2 : ${names === names2}")
    println(" names == names2 : ${names == names2}")

    val a="kim"
    val b="kim"

    println("a===b : ${a===b}")
    println("a==b : ${a==b}")

    var isRun = true
    //var result = isRun ? "달려요" : "달리지 않아요"
    //위의 코드는 삼항 연산자가 없기 때문에 동작하지 않는다.
    var result = if(isRun) "달려요" else "달리지 않아요"

    val result2 = if(isRun){
        println("어쩌구...")
        println("저쩌구...")
        "이걸 남기자... 달려요"
    }else{
        "달리지 않아요"
   }

    //null이 가능한 변수가 있다고 가정하자
    var myName:String?=null

    if(myName == null){
        myName = "바나나"
        println("이름:"+myName)
    }else{
        println("이름:"+myName)
    }
    // ?: 연산자의 좌측에 있는 값이 null 이면 ?: 연산자의 우측에 있는 값이 남는다.
    // 이 값을 알 수가 없으면(null이면) ?: 이 값을 써라
    var result3 = myName ?: "기본이름"
    println("이름: ${myName ?: "기본이름"}")
}

 

==

- 비교연산자. 이 연산자로 안에 저장된 내용이 같은지 비교 가능하다.

- list, map도 비교가능하다. 안에 저장된 내용이 같은지 비교한다.

 

 

=== 

- 이 연산자로는 참조값이 같은지 비교한다!

 

- 순서가 다르면 false이다.

 

- java에서 사용했던 이 연산자는 코틀린에서는 3개짜리로 사용해야한다.

 

- 문자열이 같으면 참조값도 같게 나온다.

 

 [ 비교 연산자 ]
- == 는 값이 같은지 비교
- === 는 참조값이 같은지 비교

- != 같이 다른지 비교
- !== 는 참조값이 다른지 비교

 

- ${ } : 코틀린에서 이 기호는 문자열을 이어붙일 때 문자열 안에다가 쓸 수 있다. 코틀린 코드도 넣을 수 있다.

- javascript에서 `` 백틱으로 작성하던 방식처럼 쓸 수 있다.

 


 

- kotlin 3항연산자

 

var result = if(isRun) "달려요" else "달리지 않아요"

- 코틀린에서는 ? : 형태의 3항연산자는 쓸 수 없다. 대신 이렇게 if~else문을 쓸 수 있다.

 

- if문이 이 위치에 어떤 값을 남기기 때문에, 이 값이 result에 대입되는 것이다.

 

- 값을 남기기 전에 어떤 코드를 수행할 수도 있다.

- 코드가 수행되고 분홍색으로 표시된 부분이 result2에 들어간다.

- 삼항연산자 대신 if~else문으로 대신할 수 있다. 특이한 문법...

 


 

- Elvis 연산자 ?:

- null이 가능한 변수는 if문에서 좀 신경써주어야 할 때가 있다.

 

- 변수가 null이면 ?: 우측에 있는 값이 남는다.

 

- 이렇게 있을 때, 왼쪽의 값을 알 수가 없으면 우측에 있는 값 사용하기! 라고 기억해도 된다.

 

- null 값을 다루는데 좀더 펀리한 연산자라고 생각하면 된다.

 


 

Step13_apply_with

package com.example.kotlin_test

class MachineGun{
    //총알을 발사하는 메소드
    fun fire():MachineGun{
        println("빵~")
        return this
    }
}

class MyGun{
    fun fire(){
        println("빵야~")
    }
}

class YourWeapon{
    var name:String?=null
    fun prepare(){
        println("무기 작동을 준비해요")
    }
    fun move(){
        println("무기를 움직여요")
    }
    fun use(){
        println("무기를 사용해요")
    }
}

fun main(){
    val g1=MachineGun()
    g1.fire().fire().fire()

    val g2=MyGun()
    //특정 참조값을 블럭 안에서 여러번 사용할 수 있다.
    with(g2){
        fire()
        fire()
        fire()
    }

    val w1=YourWeapon()
    with(w1){
        name="잠수함"
        prepare()
        move()
        use()
    }

    //val w2:Unit=YourWeapon().prepare()
    val w2 = YourWeapon().apply{
        name="전투기"
        prepare()
        move()
    }

    w2.use()
}

 

- Gun() 메소드를 만약에 연속으로 호출하고 싶다면?

 

- java에서는 return type을 this 로 해서 void 대신 적어주었다. 하지만 kotlin에서는 이렇게 쓸 수 없다.

- 타입을 : 다음에 적는 것

 

- 이렇게 함수의 타입을 :MachineGun 이라고 작성하면 아래 코드로 여러번 호출 가능하다.

 

- 굳이 return this 라고 구조를 바꾸지 않아도 with를 사용하면 연속호출 가능!

- with는 특정 참조값을 가지고 블럭 안에서 여러번 사용할 수 있다.

 

- name 필드 : String type이 들어가고 null 값이 가능한 필드

- 참조값을 가지고 .동작().동작().동작() 으로 사용해야 할 일이 있을 때

  with 를 사용하면 편리하게 쓸 수 있다.

 

- 이 참조값을 가지고 여러 작업을 해야 할 때, with를 쓸 수 있다.

 

- 이런 코드는 불가능하다. name값에 값을 넣어서 w2에 담으려고 한 코드이지만 잘못됨

- w2는 무슨 타입일까를 생각하며 작성해야 한다.

 

- 이런 코드가 있다고 하면, w2는 prepare() 메소드를 사용해서 참조값을 담은 상태

- 즉 w2는 prepare 메소드의 리턴값의 타입이어야 한다. 그래서 위와 같은 경우에는 Unit 타입이다.

- null은 아니지만 값은 없는 것이다.

 

 

- 만약 위와 같이 값까지 담아서 호출하고 싶다면?? apply 를 사용한다.

 

- 안에 값을 넣고 세팅을 다 해서 객체를 생성해놓고 나중에 사용할 수 있다.

 

 

- with : 참조값을 가지고 참조값과 함께 이 안의 작업을 하는 것

 

- apply : 객체에 작업을 적용한 다음 참조값을 얻어내는 것이다.

  (객체 생성과 동시에 이 작업을 적용하고 참조값을 얻어내는 것)

 


 

Step14_when

package com.example.kotlin_test

fun main(){

    var selected="gun"

    when(selected){
        "gun" -> println("총으로 공격해요!")
        "sword" -> println("칼로 공격해요!")
        else -> println("주먹(기본 무기)으로 공격해요!")
    }
}

 

- java의 switch case문을 코틀린에서는 when 으로 쓰면 된다.

- else는 위 조건들에 해당되지 않을 때 실행되는 코드

 

- 현재 selected 변수가 "gun"으로 되어있어서 콘솔창에는 "총으로 공격" 이 출력된다.

 

- 만약 이 안에서 수행할 코드가 많으면 이 부분을 { } 로 감싸서 여러 줄로 작성하면 된다.

- 한줄로 가능하면 이렇게 그냥 한줄로 입력해도 된다.