ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] isUpperCase 함수 사용 시 주의사항: String, Char 타입
    Programming Language/Kotlin 2024. 3. 31. 13:55

     

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

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

     

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

    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() 이런 함수들 아직 낯설지만 다양한 케이스에서 쓰다보면, 적재적소에 잘 사용하게 될 것 같다!

     

    댓글

Designed by Tistory.