Operator - Safe calls
?. : safe call operator
- nullable 타입 변수 속성에 접근 가능
var userName: String? = null
if(userName.isEmpty() // Error : userName이 null이므로 isEmpty() 호출 불가능
{
println("사용자 이름을 다시 입력해주세요.")
}
if(userName?.isEmpty() == true)
{
println("사용자 이름을 다시 입력해주세요.")
}
if(userName?.isNullOrEmpty()) // 공백을 여러 번 입력하는 경우 처리가 되지 않음
println("사용자 이름을 다시 입력해주세요.")
}
if(userName?.isNullOrBlank()) // 빈 문자열 입력 대응
{
println("사용자 이름을 다시 입력해주세요.")
}
Conditions and loops - If expression
1) 선언 시 변수 값을 초기화 하지 않는 경우 : 이후 발생 가능한 모든 경우에 대해 초기화
var max: Int
if(a>b){
max = a
}else{
max = b
}
2) if 는 값을 반환하는 식
block의 마지막 값을 반환해 변수에 할당
val max = if(a>b){
print("Choose a")
a
}else {
print("Choose b")
b
}
Operator - Elvis
- if 식 대신에 사용 가능
var userName = readLine() // nullable string 타입으로 반환
if(userName == null) // 값을 사용할 때 null 여부를 판단해야함
{
userName = ""
}
Elvis 연산자 사용 시
입력 받은 값이 null 인 경우 -> 연산자 이후의 코드 실행
입력 받은 값이 null이 아닌 경우 -> 입력 받은 값 반환
var userName = readLine()?:""
Operator - not null assertion
- null이 가능한 경우가 존재 하더라도 컴파일 가능하도록 함
- Runtime에 NullPointerException 발생 가능
Conditions and loops - When expression
- if, else 와 서로 대체 가능
- when은 여러개의 branch로 조건식을 정의
var userName: String = readLine() ?: ""
if(userName.length < 4)
{
println("사용자 이름은 4자 이상으로 만들어주세요")
}
else if(userName.length > 16)
{
println("사용자 이름은 16자 이하로 만들어주세요")
}
else
{
println("사용할 수 있는 이름입니다.")
}
var userName: String = readLine() ?: ""
when
{
userName.length < 4 ->
println("사용자 이름은 4자 이상으로 만들어주세요")
}
userName.length > 16 -> {
println("사용자 이름은 16자 이하로 만들어주세요")
}
else -> {
println("사용할 수 있는 이름입니다.")
}
}
Operator - Type check & smart cast
- is / !is : type check operator
- 스마트 캐스트 : type 검사 이후에 해당 type으로 자동 변환
when(x)
{
is Int -> print(x+1)
is String -> print(x.lenght+1)
is IntArray -> print(x.sum())
}
Operator - Type cast
1. as : Unsafe cast operator
- int 타입을 string 타입으로 변경할 수 없어 오류 발생
val number = 1
val text: String = number as String // Error
2. as? : Safe cast operator
- int 타입을 string 타입으로 변경하는 것에 실패하여 text에는 null이 할당 됨
val number - 1
val text: Stirng? = number as? String
for loop
val names: Array<String> = arrayOf("Bob", "Jen", "Amy")
for(name in names)
{
println("이름 : ${name}")
}
val nameSize = names.size
for(index in 0 until nameSize)
{
println("이름 : ${names[index]}")
}
for(index in (nameSize-1) downTo 0 step 2)
{
println("이름 : ${names[index]}")
}
loop - break
- break : 가장 가까운 loop 종료
- break@레이블 : 실행 지점을 @레이블 위치로 이동
val matrix = arrayOf(
intArrayOf(1,2,3),
intArrayOf(4,5,6)
)
loop@ for(row in matrix)
{
for(col in row)
{
if(col == 2) break@loop
print("$col ")
}
println()
}
1) 첫 번째 for 문 진입 시 row는 첫 번째 행인 (1,2,3)
2) 두 번째 for 문 진입 시 col은 1 -> 2 (col == 2 이므로 break@loop 수행)
3) 출력 값은 1
두 개 for문 종료 시, 2개의 for문 종료 조건 판단 없이 break@레이블을 통해 종료 가능
loop - continue
- continue : 가장 가까운 loop 다음 step 진행
- continue@레이블 : 실행지점을 @레이블 위치로 이동
val matrix = arrayOf(
intArrayOf(1,2,3),
intArrayOf(4,5,6)
)
outer@ for(row in matrix)
{
for(col in row)
{
if(col == 2) continue@outer
print("$col ")
}
println()
}
1) 첫 번째 for 문 진입 시 row는 첫 번째 행인 (1,2,3)
2) 두 번째 for 문 진입 시 col은 1 -> 2 (col == 2 이므로 continue@loop 수행)
3) 첫 번째 for 문 진입 시 row는 두 번째 행인 (4,5,6)
4) 두 번째 for 문 진입 시 col은 4 -> 5 -> 6
5) 출력 값은 1 4 5 6
'Android > Kotlin' 카테고리의 다른 글
[Kotlin] Package, 가시성 변경자(public,private,internal,protected) (0) | 2022.09.11 |
---|---|
[Kotlin] 클래스 toString/equals/hashCode, data class (0) | 2022.09.10 |
[Kotlin] 함수, Superclass, Subclass (0) | 2022.09.10 |
[Kotlin] 클래스 상속, 추상화, 인터페이스 (0) | 2022.09.09 |
[Kotlin] Variables & Types (0) | 2022.09.06 |