본문 바로가기
개발 지식/Kotlin

[Kotlin] Kotlin 기초 - 05 (문자열)

by 에르주 2022. 8. 21.
반응형

이번장 에서는 문자열과 객체의 동일성에 대해 정리 해보고자 한다.

 

  • 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에서 제공하는 문자열 함수를 이용한다. 

 

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/StringUtils.html

 

StringUtils (Spring Framework 5.3.22 API)

Check whether the given CharSequence contains actual text. More specifically, this method returns true if the CharSequence is not null, its length is greater than 0, and it contains at least one non-whitespace character. StringUtils.hasText(null) = false S

docs.spring.io

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())

kotlin null


변수의 동일성은 두가지가 있다.

 

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로 표현되는 것을 볼 수 있다.

 

끝.

반응형

댓글