-
[Kotlin] isUpperCase 함수 사용 시 주의사항: String, Char 타입Programming Language/Kotlin 2024. 3. 31. 13:55
코틀린으로 코드 구현을 시작한지 얼마되지 않아서 기초적인 부분부터 알고리즘 문제를 풀고 있었다.
코틀린 인 액션이라는 책을 절반 정도 읽었지만, 컨셉과 같은 부분 외에는 와닿는 부분이 적어서 직접 에러를 만나며 해결하는게 더 빠르고 오래 기억에 남을 것 같았다.
각설하고, 알고리즘 문제는 매우 간단한 알파벳 대소문자 변환이었다.
https://school.programmers.co.kr/learn/courses/30/lessons/181949
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() 이런 함수들 아직 낯설지만 다양한 케이스에서 쓰다보면, 적재적소에 잘 사용하게 될 것 같다!