자바에서 primitive type과 래퍼 클래스 중 무엇을 사용하나요?

2013-01-17 20:35

http://www.slipp.net/questions/59 글에 대한 답변에서 나온 질문입니다. 저도 프로그래밍할 때 무엇을 사용하는 것이 좋을지 고민하다가 매번 사용하는 방식이 다른 부분입니다. 다른 분들은 어떤 방식으로 구현하고 있는지 궁금하네요.

http://www.slipp.net/questions/59#answer-317 에서 lark님은 다음과 같이 답변을 주셨네요.

질문1) 래퍼 클래스 사용여부 일반적인 경우에 primitive type을 사용합니다. 물론 초를 다루는 시스템이 아니면 상관 없겠지만 별도의 객체를 생성하지 않기 때문에 메모리 효율측면에서도 좋겠구요. 값을 비교할 때도 직관적으로 == 로 비교가 가능합니다. 래퍼클래스의 경우 equals를 사용하거나 아니면 위 코드처럼 intValue()로 가져와서 비교를 해야하니 비용이 더 들어가겠죠. 보통 제가 래퍼 클래스를 사용하는 경우는 null 을 반환할 이유가 있을 때나 객체로 필요할 경우에 사용합니다. (제너릭 등)

자바가 처음 등장할 때 primitive type을 제공해서 편안한 부분도 있었지만 지금에 와서는 오히려 독이 되는 듯 싶네요.

BEST 의견 원본위치로↓
2013-01-18 14:44

앗 질문으로 올라왔네요. 덧붙이자면, Wrapper Class 이용시 Caching 관련 이슈에서도 주의해야할 것 같아요. autoboxing으로 인해 무심코 Wrapper Class에서 == 비교를 한적이 있는데요.

Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;


System.out.println(a==b);
System.out.println(c==d);

출력결과는 어떨까요? . . . . . . true false

입니다.

Integer.java 소스를 까보시면 IntegerCache라는 static class로 자주 쓰는 범위에 대한 값들을 caching을 하고 있더군요. 기본값은 -128~127 까지입니다. (소스상 주석으로 해당 범위는 VM 옵션으로 조절이 가능하다고 합니다)

Integer i2 = Integer.valueOf(2);

위와 같이 object를 생성한다면 이미 해당 범위의 숫자까지는 내부적으로 Integer[] cache 에 담아 놓은 상태라 cached object를 반환합니다. 동일한 object를 반환받았으니 객체비교인 == 에서 true가 나온 이유죠.

쓰다 보니 길어졌네요-_-; 결론은 기본적으로 객체에서 ==는 reference 비교이니 주의하자였습니다.ㅎㅎ

3개의 의견 from SLiPP

2013-01-18 10:41

@자바지기 웁스. 게을러서 질문을 못하고 있었는데 질문을 하셨네요 ㅎㅎ; @lark님의 답변에 전적으로 동의 합니다. 저도 일반적으로 primitive type을 사용합니다. (사실 1.5로 넘어오면서 오토박싱 해주다보니 거의 관심을 안가지고 사용하고는 있네요 ㅎㅎ;;) 얼마 안되는 경험이지만 경험상 일반적으로 primitive type 을 랩핑하는 경우는 거진 그 코드를 가져다쓰는 클라이언트 코드 이슈가 큰 것 같습니다. 그 클라이언트 코드들이 앞으로 랩핑하는 경우외엔 없을 것이다라면 래퍼클래스를 쓰는것이 맞겠지만 그렇지 않다면 primitive type 을 가는게 좋지 않을까 싶은게 제 생각입니다^^;; 이런 면에서 모든게 객체인 다른 언어들이 편하긴 하구나라는 생각을 간혹 하네요 ㅎ

2013-01-18 14:44

앗 질문으로 올라왔네요. 덧붙이자면, Wrapper Class 이용시 Caching 관련 이슈에서도 주의해야할 것 같아요. autoboxing으로 인해 무심코 Wrapper Class에서 == 비교를 한적이 있는데요.

Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;


System.out.println(a==b);
System.out.println(c==d);

출력결과는 어떨까요? . . . . . . true false

입니다.

Integer.java 소스를 까보시면 IntegerCache라는 static class로 자주 쓰는 범위에 대한 값들을 caching을 하고 있더군요. 기본값은 -128~127 까지입니다. (소스상 주석으로 해당 범위는 VM 옵션으로 조절이 가능하다고 합니다)

Integer i2 = Integer.valueOf(2);

위와 같이 object를 생성한다면 이미 해당 범위의 숫자까지는 내부적으로 Integer[] cache 에 담아 놓은 상태라 cached object를 반환합니다. 동일한 object를 반환받았으니 객체비교인 == 에서 true가 나온 이유죠.

쓰다 보니 길어졌네요-_-; 결론은 기본적으로 객체에서 ==는 reference 비교이니 주의하자였습니다.ㅎㅎ

2015-08-25 23:26

좋은글 잘 읽었습니다. 여러글을 찾아보니 Context에 따라 다르다는 답변이 절대적이군요. 성능에 대한 이야기도 있었지만, 자바특성상 크게 신경쓸 부분은 아닐것 같구요.

@김문수 @lark 님에서 말씀하신것처럼 특별한 이유가 없다면(제네릭, null처리) 별 생각없이 Primitive 타입을 사용해왔는데요.

다음과 같은 고민이 생기네요. 다른분들은 어떻게 생각하시나요? 1. 자바 최상위객체 Object의 메서드를 사용해야하는 이유가 있는가 2. 객체화(추상화)를 통해 얻을 수 있는 이점은 무엇인가 3. 혹시 기계관점(메모리, 컴파일러)에서 설명할 수 없는지

1) Wrapper 클래스에 대한 재밌는 비유 : http://way2java.com/java-lang/wrapper-classes/ 2) 왜 자바 제네릭은 Primitive type을 지원하지 않는가? : http://stackoverflow.com/questions/2721546/why-dont-java-generics-support-primitive-types

의견 추가하기

연관태그

← 목록으로