when(a1) {
in 1..10 -> println("aaa")
in 11..20 -> println("bbb")
in arrayOf(10, 20, 30) -> println("array")
in listOf<Int>(40, 50, 60) -> println("list")
}
다양한 타입의 데이터에 대한 조건
fun testWhen(data: Any) {
when(data) {
1 -> println("data value is 1")
"hello" -> println("data value is hello")
is Boolean -> println("data type is Boolean")
}
}
val array = arrayOf("hello", "world")
//컬렉션 타입 이용
for (v in array) {
print("$v")
} //hello world
indices - 인덱스 값을 획득할 때
for(i in array.indices) {
print("$i - ${array[i]} ")
} // 0 - hello, 1 - world
withIndex() - 인덱스 와 값을 획득 (값, 인덱스 순서가 중요함)
for((i, v) in array.withIndex()) {
print("$i - $v ")
} //0 - hello, 1 - world
map을 예로
//반복되면서 .. Entry 객체가 item에 대입...
val map = mapOf<String, String>("one" to "hello", "two" to "world")
for(item in map) {
println("key : ${item.key}, value : ${item.value}")
}
//key : one, value : hello
//key : two, value : world
while 반복문 - 자바와 동일
break 와 continue, 그리고 라벨
라벨은 개발자가 특정 위치를 개발자 마음대로 정해 (라벨) continue나 break 문에서 해당 라벨로 지정한 반복문을 탈출 가능
연산자
연산자는 java와 동일
전개연산자 : 스프레드 연산자 (*)
vararg 의 인수로 적용
fun some(arg1: Int, vararg arg2: String) { }
//배열의 모든 데이터를 넘기고 싶다면...
some(10, *array)
List에 이용
val list = listOf<String>("hello", "world")
some(10, *list.toTypedArray())
복합 대입 연산자, 증감 연산자
논리 연산자 ( &&, || , ! )
일치 연산자
값을 비교할 때 (structural equality) : ==
객체를 비교할 때 (referential equality) : ===
//일반 객체, ==, === 모두.. 주소비교..
class User
val user1 = User()
val user2 = User()
val user3 = user1
println("${user1 == user2}, ${user1 === user2}, ${user1 == user3}, ${user1 === user3}")
//false, false, true, true
//기초 타입의 객체...
val data1: Int = 1000
val data2 = 1000
val data3 = data1
println("${data1 == data2}, ${data1 === data2}, ${data1 == data3}, ${data1 === data3}")
//true, true, true, true
연산자 재정의
클래스의 멤버로 정의할 수 있고, 확장 함수로 추가하여 사용도 가능
연산자 재정의 하려는 함수 앞에 operator 예약어를 추가해야함
Null Safety
type - nullable, non-null
operator
❓ 이해 안 된 부분 / 도움 요청
val a: Array = Array(3, {0}) 혹시 여기에서 {0} 부분도 표현식인가요?? ⇒ 호출이 되지 않았기 때문에 표현식x , 람다함수o (조금 더 자세히 이해 필요**)