본문 바로가기

Java/Java

(JAVA) Integer.parseInt 내부 뜯어보기

 

살펴볼 것은 아래 코드 한줄이다.

int k =Integer.parseInt("111");

 

parseInt(String s)의 내부

    public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
    }

parseInt(s, )는 parseInt(String s, int radix) 를 리턴하하는데 

여기서 radix는 어떤 진수의 값으로 변환할 것인지에 대한 진수 값이다.

우리는 10진수를 반환할 것이므로 10을 파라미터로 넘긴다.

 

parseInt(String s, int radix)의 내부

    public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        /*
         * WARNING: This method may be invoked early during VM initialization
         * before IntegerCache is initialized. Care must be taken to not use
         * the valueOf method.
         */

        if (s == null) {
            throw new NumberFormatException("null");
        }

        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }

        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }

        boolean negative = false;
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;

        if (len > 0) {
            char firstChar = s.charAt(0);
            if (firstChar < '0') { // Possible leading "+" or "-"
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+') {
                    throw NumberFormatException.forInputString(s, radix);
                }

                if (len == 1) { // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s, radix);
                }
                i++;
            }
            int multmin = limit / radix;
            int result = 0;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                int digit = Character.digit(s.charAt(i++), radix);
                if (digit < 0 || result < multmin) {
                    throw NumberFormatException.forInputString(s, radix);
                }
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s, radix);
                }
                result -= digit;
            }
            return negative ? result : -result;
        } else {
            throw NumberFormatException.forInputString(s, radix);
        }
    }

 

무척 복잡해보이지만 차근차근히 살펴보자

 

받아온 문자열 값이 null 인지 체크

if (s == null) {
	throw new NumberFormatException("null");
}

 

진수값은 2진수 부터 36진수 까지 있으므로 해당 범위에 있는지 확인

if (radix < Character.MIN_RADIX) {
    throw new NumberFormatException("radix " + radix +
    " less than Character.MIN_RADIX");
}

if (radix > Character.MAX_RADIX) {
    throw new NumberFormatException("radix " + radix +
    " greater than Character.MAX_RADIX");
}

한계 값을 설정 및 해당 한계값을 진수로 나눈다.

int limit = -Integer.MAX_VALUE;
int multmin = limit / radix;

해당 문자열의 길이만 큼 loop를 돈다. (현재 "111" -> 세번 루프를 돈다.)

while (i < len) {
    // Accumulating negatively avoids surprises near MAX_VALUE
    int digit = Character.digit(s.charAt(i++), radix);
    if (digit < 0 || result < multmin) {
        throw NumberFormatException.forInputString(s, radix);
    }
    result *= radix;
    if (result < limit + digit) {
        throw NumberFormatException.forInputString(s, radix);
    }
    result -= digit;
}

 

문자열각의 value 는 byte 값으로 저장되는데 각각의 문자열은 '1' 이면 아스키코드 '1'을 의미하고 이는 10진수로 변환하면 49가 된다.

 

digit의 정의

int digit = Character.digit(s.charAt(i++), radix);

Character 클래스의 digit(char ch, int radix) 을 참조한다.

 

https://meetup.toast.com/posts/185

 

[Java] Integer.valueOf(127) == Integer.valueOf(127) 는 참일까요? : TOAST Meetup

[Java] Integer.valueOf(127) == Integer.valueOf(127) 는 참일까요?

meetup.toast.com

 

https://secretroute.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%9D%98%E7%A5%9E-Vol1-%EB%B9%84%ED%8A%B8-%EC%8B%9C%ED%94%84%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90

 

자바의神 Vol.1 : 비트 시프트 연산자

비트 시프트 연산자란 말그대로 bit 를 shift 시켜주는 녀석이다. 연산자는 다음과 같이 3가지가 있다. (1) << : 왼쪽으로 이동 (2) >> : 오른쪽으로 이동 (3) >>> : unsigned, 오른쪽으로 이동 좀 더 쉽게 이해해..

secretroute.tistory.com

 

 

'Java > Java' 카테고리의 다른 글

(JAVA) 쓰레드의 실행제어 - sleep  (0) 2020.01.25
(JAVA) 데몬쓰레드  (0) 2020.01.23
(JAVA) String.equals() 내부 뜯어보기  (0) 2020.01.21
(JAVA) 쓰레드 우선순위  (0) 2020.01.21
(JAVA) 싱글쓰레드와 멀티쓰레드  (0) 2020.01.20