본문 바로가기
Programming Language/Kotlin

[Kotlin] isUpperCase 함수 사용 시 주의사항: String, Char 타입

by Baest 2024. 3. 31.

 

코틀린으로 코드 구현을 시작한지 얼마되지 않아서 기초적인 부분부터 알고리즘 문제를 풀고 있었다.

코틀린 인 액션이라는 책을 절반 정도 읽었지만, 컨셉과 같은 부분 외에는 와닿는 부분이 적어서 직접 에러를 만나며 해결하는게 더 빠르고 오래 기억에 남을 것 같았다.

 

각설하고, 알고리즘 문제는 매우 간단한 알파벳 대소문자 변환이었다.

https://school.programmers.co.kr/learn/courses/30/lessons/181949

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

String 문자열이 주어진다.

해당 문자가 대문자면 소문자로 소문자면 대문자로 변경해야하는 문제이다.

split 함수를 사용해서 문자열을 배열로 바꾸고 앞 뒤로 빈 값이 생기는 부분을 isNotEmpty()로 제외시켰다.

 

이후 일단 로그를 출력하려고 했는데, 에러 발생.

 

/Solution0.kt:6:19: error: unresolved reference. None of the following candidates is applicable because of receiver type mismatch:

public inline fun Char.isUpperCase(): Boolean defined in kotlin.text println(it.isUpperCase())

 

 

그 이유는 filter { it.isNotEmpty() } 로 처리하게되어 List<String>이 되는데, isUpperCase()의 경우 Char 타입에 적용된다.

따라서 String을 Char로 변환하여, 대소문자 여부를 확인해야한다.

 

fun main(args: Array<String>) {
    val s1 = readLine()!!
    val strArr = s1.split("").filter { it.isNotEmpty() }

   val results = strArr.map {
       println(it.isUpperCase())
    }
}

 

위와 같이 접근했으나 아래와 같이 toList()를 사용해서 char로 바꿔주어야 isUpperCase()를 사용하여 접근할 수 있다.

fun main(args: Array<String>) {
    val s1 = readLine()!!
    val strArr = s1.toList()

   val results = strArr.map {
       println(it.isUpperCase())
    }
}

 

 

toList()

- return type: Char

- 내부 구현: 코틀린의 String 타입은 문자의 시퀀스로 CharSequence 인터페이스를 구현한다. toList()는 확장 함수로 컬렉션의 요소들을 새로운 리스트로 복사한다. 문자열에 대해 사용될 때, 문자열의 각 문자를 순회하며 Char 요소로 구성된 새로운 리스트(List)를 생성한다.

public fun CharSequence.toList(): List<Char> = this.map { it }

 

 

 

isNotEmplty(), toList() 이런 함수들 아직 낯설지만 다양한 케이스에서 쓰다보면, 적재적소에 잘 사용하게 될 것 같다!