이번장 에서는 문자열과 객체의 동일성에 대해 정리 해보고자 한다.
- length : 문자열 길이 수
- lowerCase() : 소문자 변환
- upperCaste() : 대문자 변환
var test = "Er.Ms.Kotlin.String"
pritnln(test.length)
println(test.lowerCase())
println(test.upperCase())
// 결과
// 19
// er.ms.kotlin.string
// ER.MS.KOTLIN.STRING
- split (String args) : args 기준으로 나누기
- joinToString() : String 리스트의 합
- joinToString(String args) : args로 String list를 합
- substring(beginIndex, endIndex) : beginIndex, endIndex 분할
var test = "Er.Ms.Kotlin.String"
val test1 = test.split(".")
println(test1)
println(test1.joinToString())
println(test1.joinToString("-"))
println(test1.substring(5..10))
// 결과
// [Er, Ms, Kotlin, String]
// Er, Ms, Kotlin, String
// Er-Ms-Kotlin-String
// .Kotli
- isNullOrEmtpy() : 문자열이 Null 또는 Empty 여부 확인
- isNullOrBlank() : 문자열이 Null 도는 Blank 여부 확인
val nullString: String? = null
val emptyString = ""
val blankString = " "
val normalString = "A"
// 빈칸 여부 판단
// blank : "", empty : ""
println(nullString.isNullOrEmpty())
println(emptyString.isNullOrEmpty())
println(blankString.isNullOrEmpty())
println(normalString.isNullOrEmpty())
println(blankString.isNullOrBlank())
// 결과
// true
// true
// false
// false
// true
실무에서 사실 Spring Framework를 사용하고 있다면 Null, Empty, Blank 여부 판단을 Spring Framwork에서 제공하는 문자열 함수를 이용한다.
StringUtils.hasLength(String str)
- startsWith : 시작 문자열 체크
- endWith : 마지막 문자열 체크
- contains : 문자열 포함
val test3 = "kotlin.tving.kt"
val test4 = "java.tving.class"
println(test3.startsWith("java"))
println(test4.startsWith("java"))
println(test3.endsWith(".kt"))
println(test4.endsWith(".kt"))
println(test3.contains("class"))
println(test4.contains("class"))
// 결과
// true
// false
// ture
// false
// false
// true
java 1.8 이상에서는 optional.ofNullable()를 활용하여 null safe 할 수 있지만 kotlin에서는 null safe operator가 있다.
- ?. null safe operator : 참조 연산자를 실행하기 전에 객체가 null 인지 확인하고 객체가 null이면 두의 구문을 실행하지 않는다.
- ?: elvis operator : 객체가 null이 아니라면 그냥 사용. null 이라면 연산차 우측의 default 객체를 활용한다.
- !!. non null assertion operator : 참조 연산자를 사용할 때 null 여부를 컴파일시 확인하지 않도록 하며 런타임시 NPE가 터지도록 한다.
var a: String? = "Kotlin TVING" // run 실행
println(a?.uppercase())
println(a ?: "default".uppercase())
println(a!!.uppercase())
//nullsafe 연산자 scope함수 사용하기
a?.run {
println(uppercase())
println (lowercase())
}
// 결과
// KOTLIN TVING
// Kotlin TVING
// KOTLIN TVING
// KOTLIN TVING
// kotlin tving
변수가 null 일 때 실행해 보면 결과는 다음과 같다.
var b: String? = null;
println(b?.uppercase())
println(b ?: "b는 null 입니다".uppercase())
println(b!!.uppercase())
변수의 동일성은 두가지가 있다.
1) 내용의 동일성 : 코틀린의 모든 클래스가 내부적으로 상송 받는 Any라는 최상위 클래스의 equals() 함수가 반환하는 Boolean 값으로 판단 한다.
2) 객체의 동일성은 === 로 표현한다.
코드로 예를 들어 확인해보자.
class Product(val name: String, val location: String) {
override fun equals(other: Any?): Boolean {
if(other is Product) {
return other.name == name && other.location == location
}
else {
return false;
}
}
}
Product에서 Any 클래스의 equals 함수를 오버라이드하여 재정의 해보자. 객체의 회사명과 위치가 똑같으면 같은 객체로 판단한다.
var productA = Product("TVING", "상암")
var productB = Product("LGU+", "상암")
var productC = productA
var productD = Product("CJ ENM", "상암")
var productE = Product("CJ ENM", "상암")
println(productA == productB) // 내용의 동일성
println(productA === productB) // 객체의 동일
println(productA == productC)
println(productA === productC)
println(productA == productD)
println(productA === productD)
println(productD == productE)
println(productD === productE)
// 결과
// false
// false
// true
// true
// false
// false
// true
// false
마지막 productD와 productE는 안의 내용은 같지만 객체가 다르므로 === 비교에서는 false로 표현되는 것을 볼 수 있다.
끝.
'개발 지식 > Kotlin' 카테고리의 다른 글
[Coroutine] Coroutine Cancellation And Timeout (0) | 2022.08.29 |
---|---|
[Coroutine] Coroutine Basic (0) | 2022.08.23 |
[Kotlin] Kotlin 기초 - 04 (스코프 함수) (0) | 2022.07.17 |
[Kotlin] Kotlin 기초 - 03 (스코프 /고차 람다 함수) (0) | 2022.05.16 |
[Kotlin] Kotlin 기초 - 02 (클래스/인터페이스) (0) | 2022.04.27 |
댓글