를 공부하다가 그 중에서도 integer.valueof 를 찾아보았는데 integer.parseInt 랑 비교를 하는 내용 중 연산이 안된다고 하더라고요.. 저는 몇번 연산을 한 기억이 있어서 여러 곳을 찾아다니던중에 얻은 정보들을 한번 끄적여 보도록 하겠습니다.
parseInt - primitive
valueof - object (new Integer())
Wrapper 클래스는 말 그대로 포장하는 것입니다.
기본타입을 Wrapper클래스로 객체로 포장해줍니다.
기본형 | 래퍼 클래스
byte - Byte
short - Short
int - Integer
long - Long
float - Float
double - Double
char - Character
boolean - Boolean
이렇게 8개의 기본 타입에 해당하는 데이터를 객체(Object)로 포장해주는 겁니다.
그 포장이라는 단어에서 볼 수 있듯, 포장하고 포장을 풀고 할수 있는 개념이 바로 박싱이랑 언박싱입니다.
박싱(Boxing) 기본타입 -> 래퍼클래스의 인스턴스
언박싱(UnBoxing) 래퍼클래스의 인스턴스 -> 기본타입
제가 말했던 연산은 이제 기본형으로 만들어 줘야 가능한 거죠 하지만 JDK 1.5부터는 자바 컴파일러가 자동으로 박싱과 언박싱을 처리해준다고 합니다. 그래서 제가 integer.valueof(String) 으로도 연산을 하고 값을 도출할 수 있었던 것이죠.
오토박싱의 예로는
//a
Integer number = new Integer(35); // 박싱
int n = num.intValue(); //언박싱
System.out.println(n);
//b
Character ch = 'A'; //Character ch = new Character('A') : 오토박싱
char c = ch; // char c = ch.charValue(); : 오토언박싱
System.out.println(c);
결과
a = 35
b = A
이런식으로 타입Value() 메소드를 사용하지 않아도 인스턴스에 저장된 값을 바로 참조합니다.
int r = Integer.parseInt("200"+"100");
int t = Integer.parseInt("100");
int y = Integer.valueOf("300"+"100");
System.out.println(r+t);
System.out.println(y+r);
이번에는 제가 궁금했던 API에서 Integer.valueOf(String)는 String이 Integer.parseInt(String)한거랑 똑같이 해석하는 이유에 대한 내용입니다.
원래 Integer.valueOf(String)는 new Integer() 으로 객체를 반환하고
Integer.parseInt 는 int 기본자료형을 반환하는겁니다.
어째서 객체를 반환하는 Integer.valueof(String)이 연산이 가능할까요?
정답은 이 메소드에서도 오토 언박싱이 일어나서 기본타입이 되어 연산이 가능한 것이었습니다.
요즘 공부를 하면서 디폴트 값이 설정되어 있거나 자동으로 eclipse같은 tool이나 기본 함수들의 오토기능들로 인해 작업이 편해져 있어서 제가 모르고 지나가는 개념들이나 조심해야할 것? 약간 되고 안되고의 문제에서 벗어나서 가능하게된 이유, 개발툴이나 함수가 편리하게 만들어주는 과정 같은 것도 알고 지나갈 필요가 있어 보입니다. 이 쪽은 정말 보이는 것이 전부가 아닌 것 같아요...ㅠ