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"으로 되어있어서 콘솔창에는 "총으로 공격" 이 출력된다.
- 만약 이 안에서 수행할 코드가 많으면 이 부분을 { } 로 감싸서 여러 줄로 작성하면 된다.
- 한줄로 가능하면 이렇게 그냥 한줄로 입력해도 된다.
'국비교육(22-23)' 카테고리의 다른 글
74일차(3)/Android App(27) : ViewPager 예제 (0) | 2023.01.24 |
---|---|
74일차(2)/Android App(26) : View 로 미니 슈팅게임 만들기(4) (0) | 2023.01.20 |
73일차(3)/Android App(24) : View 로 미니 슈팅게임 만들기(3) (0) | 2023.01.19 |
73일차(2)/Android App(23) : View 로 미니 슈팅게임 만들기(2) (0) | 2023.01.19 |
73일차(1)/Android App(22) : Kotlin forEach, filter, map / set, get 함수 (0) | 2023.01.19 |