자바의 자료형 시스템
· 기본 자료형 : int, double, boolean..
· 참조 자료형 : String, List..
모든 자료형에는 대응되는 참조 자료형이 존재한다.
· int, double, boolean → Integer, Double, Boolean
이 둘 사이에는 실질적인 차이가 있으므로 신중하게 결정해야 한다.
차이점
· 기본 자료형은 값만 가지지만 객체화된 기본 자료형은 값외에 신원(identify)를 가진다.
· 기본 자료형에 저장되는 값은 전부 기능적으로 완전한 값이지만, 객체화된 기본 자료형에 저장되는 값에는 그 외에 아무기능도 없는 값, null이 하나 있다.
· 기본 자료형은 객체 표현형보다 시간이나 공간 요구량이 효율적이다.
예시 1
// 잘못된 반복자
Comparator<Integer> naturalOrder = new Comparator<Integer>(){
public int compare(Integer first, Integer second)
return first < second ? -1 : (first == second ? 0 : 1);
}
}
naturalOrder.compare(new Integer(42), new Integer(42))를 출력할 시 0이 나와야하는데 1이 나오게 된다.
문제는 first == second에 있다.
연산자 == 는 두 객체의 신원(identity)를 비교하게 되고 서로다른 신원을 반환하는 Integer는 false값 즉 1을 반환하게 된다.
따라서 객체화된 자료형에 == 연산자를 사용하는 것은 거의 항상 오류라고 봐야 한다.
// 수정된 반복자
Comparator<Integer> naturalOrder = new Comparator<Integer>(){
public int compare(Integer first, Integer second)
int f = first; //Auto-unboxing
int s = second; //Auto-unboxing
return f < s ? -1 : (f == s ? 0 : 1); //No unboxing
}
}
예시 2
//매우 느린 프로그램, 어디서 객체가 생성되는가?
public static void main(){
Long sum = 0L;
for (long i = 0 ; i < Integer.MAX_VALUE ; i++){
sum += i;
}
system.out.pringln(sum);
}
변수가 계속해서 객체화와 비객체화를 반복하기 때문에 느려지게 된다.
언제 객체화된 기본 자료형을 사용해야 하나?
·컬렉션의 요소, 키, 값으로 사용할 때
·형인자 자료형의 형 인자
ㄴ ThreadLocal<int>와 같은형태는 안된다.
결론
·가능하다면 기본자료형을 사용하라.
·기본자료형이 더 단순하고 빠르다.
·객체화된 기본 자료형을 사용해야 한다면 주의해라!
·자동 객체화는 번거로운 일을 줄여주지만, 성능 및 오류가 발생하는건 개발자 책임이다.
'IT > Programming' 카테고리의 다른 글
<Effective Java> RULE 47 어떤 라이브러리가 있는지 파악하고, 적절히 활용하라 (0) | 2023.04.26 |
---|---|
<Effective Java> RULE 48 정확한 답이 필요하다면 float와 double은 피하라 (0) | 2023.04.26 |
<Effective Java> RULE 50 다른 자료형이 적절하다면 문자열 사용은 피하라 (0) | 2023.04.26 |
<Effective Java> RULE 51 문자열 연결 시 성능에 주의하라 (0) | 2023.04.26 |
<Effective Java> RULE 52 객체를 참조할 때는 그 인터페이스를 사용하라 (0) | 2023.04.26 |