Char을 Int로 변환할 때 많은 실수가 생기는 이유
Kotlin은 하나의 자료형을 다른 자료형을 변환할 때 to자료형 확장함수를 제공한다. 예를 들어 String을 Int로 변환할 때는 String.toInt()를 사용하면 된다. 하지만 Char은 기본적으로 UTF-16으로 인코딩 되고 숫자로 변환될 때 해당 코드에 해당하는 숫자로 디코딩된다. 8비트 이하의 값들에 대해서는 ASCII를 따른다.
이 때문에 Char.toInt() 를 사용해 Int를 Char로 변환을 하게 되면 예상치 못한 결과가 나온다. 한 번 '1'을 toInt()를 사용해 변환해 보도록 하자.
fun main() {
val char = '1'
println(char.toInt()) // 49출력
}
위와 같이 '1'.toInt()는 49가 됨을 알 수 있다. 이유는 바로 ASCII 코드에서 49번이 1에 해당하기 때문이다.
사람들이 많이 실수하니까 Kotlin은 이를 Deprecated 시켜버리고, ASCII 코드를 표현하는 char.code를 대신 사용하도록 유도한다.
하지만, Char을 Int로 변환하는 것은 가끔 필요하다. 이때 어떻게 해야 할까?
Char을 Int로 변환하기
Char을 Int로 변환하기 위해서는 아래의 방법들을 사용할 수 있다.
- Char을 String으로 변환한 후 toInt() 사용하기
- Character.getNumericValue(char: Char) 사용하기
- ASCII 코드 활용하기
Char을 String으로 변환한 후 toInt() 사용하기
가장 연산이 많지만 가장 간단한 방법은 Char을 String으로 변환한 후 toInt()를 사용하는 방법이다.
fun main() {
val char = '1'
println(char.toString().toInt()) // 1출력
}
Character.getNumericValue(char: Char) 사용하기
Character.getNumericValue 메서드를 사용해 char의 숫자값을 얻을 수 있다.
fun main() {
val char = '1'
println(Character.getNumericValue(char)) // 1출력
}
ASCII 코드 활용하기
마지막은 ASCII코드가 0부터 9까지가 연속해서 나오는 것을 이용하는 것이다. ASCII는 '0'이 가장 낮은 값을 가지고 1씩 증가하므로 현재 코드값에서 '0'의 코드값을 빼면 현재 Char의 Int 값을 구할 수 있다.
fun main() {
val char = '1'
val int = char.code - '0'.code
println(int) // 1출력
}
정리
Char을 Int로 형변환 하는 세 가지 방법에 대해 알아보았다. 가장 직관적인 방법은 Characters.getNumericValue(char: Char)이지만, 가장 기억하기 쉬운 방법은 Char.toString().toInt() 일 것으로 보인다. ASCII 코드를 활용하는 방법은 실수할 가능성이 높으므로 웬만해서는 쓰지 않는 것이 좋을 것으로 보인다.