문자 타입인 '1'를 int형으로 바꾸려고 합니다.
val num1='1'
println(num1.toInt())
예상했던 1이 아닌 49가 출력이 됩니다. 1의 아스키 코드인 49가 출력된 겁니다. 기본형 타입인 char는 내부적으로 아스키 코드에 맞는 숫자로 치환되어 저장되기 때문입니다. 그렇기에 toInt() 호출하면 컴퓨터는 치환되었던 아스키 코드인 숫자를 반환하라고 이해하기 때문에 49가 출력됩니다. 이에 대한 실수를 줄이기 위해 기존의 char에서의 toInt()가 deprecated 되었습니다.
char에서의 toInt()는 아스키 코드를 출력해주는 메소드입니다. 하지만 종종 착각하여, 숫자로 변환하려 사용하기 때문에 좀 더 명시적으로 바뀌었습니다.
그저 char 변수에 code 프로퍼티를 사용하면 됩니다.
val num2='2'
println(num2.code)
아스키 코드에서 char으로 변화하려면 Char()를 사용하면 됩니다.
val ch=49
println(Char(ch))
그럼 이번에는 원래 의도하려던 char와 int를 서로 변환하는 방법도 함께 보도록 하겠습니다.
val num3='3'
println(num3.toString().toInt())
String은 char과 달리 객체이므로 문자열이 객체로 저장됩니다. 그러니 toInt()를 하면 아스키 코드가 아닌 실제 문자열의 내용을 int형으로 변환됩니다. 물론 String으로 변환하는 과정이 별도로 필요하지만 이러한 방법도 있다는 것을 참고하시길 바랍니다.
Character에서 제공하는 getNumericValue()입니다. 단지 문자를 매개변수로 전달하면 됩니다.
val num4='4'
println(Character.getNumericValue(num4) )
digitToInt() 메소드를 사용하는 방법도 있습니다.
val num5='5'
println(num5.digitToInt())
이 경우에는 진수 변환과 null 처리가 가능합니다. 매개변수로 변환할 진수를 받지만 지정된 진법보다 작은 경우에만 사용 가능합니다. 기본 진수는 10이며 범위는 2..36입니다.
println('5'.digitToInt(15))
//println('5'.digitToInt(3)) //오류 발생. 3진수에서는 5를 표현 불가능하기 때문
println('5'.digitToIntOrNull(3)) //null 리턴
println('9'.digitToInt())//기본 10이기에 사용 가능
println('0'.digitToInt(1))//오류 발생. 진수 범위는 2부터 가능하기 때문
알파벳의 경우 this.code - 'A'.code + 10 또는 this.code - 'a'.code + 10 으로 계산됩니다. 10부터는 A로 표시하는 16진수로 생각하면 쉽습니다. 알파벳 첫문자 A 또는 a로 부터 몇 번째로 떨어졌는지 알기 위해 this.code - 'A'.code하고 10을 더합니다. 9까지는 숫자로 표현하고 10부터 알파벳 A로 변환하기 때문에 시작 숫자인 10을 더합니다.
println('b'.digitToInt(15))//11 리턴
println('B'.digitToInt(15))//11 리턴
아스키 코드는 문자에 숫자 코드를 부여한 것으로 모든 문자의 아스키 코드를 외우는 것은 어려운 일입니다. 다만 숫자 문자끼리는 일련된 코드를 부여 받습니다. 즉 0~9의 코드는 48~57입니다. 이를 이용하여 숫자 문자에 '0'을 뺍니다. 5의 아스키 코드는 53, 0의 아스키 코드는 48입니다. 5는 0에서 5만큼 떨어졌고 53은 48에서 5만큼 떨어졌습니다. 일련된 코드를 받았기 때문입니다.
println('5'-'0')
println('7'-'0')
알파벳의 경우 3번처럼 'a' 또는 'A'를 빼고 10을 더하면 됩니다.
println('B'-'A'+10)
println('b'-'a'+10)
단순히 toChar() 호출하면 됩니다.
println(65.toChar())
digitToInt()와 반대일 뿐 원리는 똑같습니다. 기본 진수는 10이며 범위는 2..36입니다. 단 digitToIntOrNull()같이 null로 변환해주는 메서드는 없습니다.
println(5.digitToChar(15))
//println(5.digitToChar(3)) //오류 발생. 3진수에서는 5를 표현 불가능하기 때문
println(9.digitToChar())//기본 10이기에 사용 가능
println(0.digitToChar(1))//오류 발생. 진수 범위는 2부터 가능하기 때문