다들 Java로 개발하다보면, 가끔 int, long과 같은 기본 타입을 사용해야할지, Integer, Long과 같은 박싱된 기본 타입 사이에서 고민해본 적이 있을 것이다. 나는 NPE 예방과, 객체를 생성하지 않아 메모리의 효율성 때문에, 기본 타입을 쓰는 것을 선호했지만, 개발하다보니 모두가 박싱된 원시타입을 사용하길래 나도 그렇게 살아왔다. 그랬던 전 날들을 반성하고있다.
이 글은 기본 타입과 박싱된 기본 타입 중 선택하는 가이드 라인을 제시하는 것을 목표로 한다.
두 타입의 차이는 무엇일까?
이펙티브 자바에서 말하는 차이는 3가지가 있다.
1. 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성(identify)이란 속성을 갖는다. 박싱된 기본 타입은 값이 같아도, 서로 다르다고 판단될 수 있다.
2. 기본 타입의 값은 언제나 유효하지만 박싱된 기본 타입은 유효하지 않은 값, null을 가질 수 있다.
3. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다.
차이라고 적어뒀지만, 필자의 의도를 생각하면, 그냥 기본 타입이 더 좋다고 말하고 있다.
과연 박싱된 기본 타입에는 단점만 있는 것일까?
이펙티브 자바 저자가 기본타입 편을 드니, 나는 박싱된 기본 타입의 편을 들어보겠다.
1. 더 객체지향적이다.
값을 비교하는 것을 a이름의 객체에 메시지를 보내서 비교하기 때문에 더 객체지향적이라고 볼 수 있다.
2. 제네릭과의 일관성을 지킬 수 있다.
자바로 개발하다보면 제네릭(Collection 프레임워크, ...)을 사용하는 것은 필연적이다. 그렇기에 어느 부분에서는 기본타입이 쓰이고, 어느 부분에서는 박싱 기본 타입이 사용되는 것보다는 박싱 기본타입만 사용하는 것이 코드의 일관성을 유지할 수 있다.
3. NULL 처리를 할 수 있다.
값을 DB에 저장하다보면, null이 들어올 수도 있고, 그렇기에 DB에서 값을 가져와서 객체를 생성할 때, 필드에 null이 들어갈 수도 있다. 그렇기 때문에, 박싱된 객체 타입이 필요할 때가 있다. 그런데, nullable만 박싱된 객체 타입을 사용하고, 나머지는 다 기본 타입을 사용한다면, 코드의 일관성을 지킬 수 없게 된다.
내 생각엔...
아주 주관적인 의견이다. 나는 박싱된 기본 타입을 사용하는 편이 더 낫다고 생각한다.
물론 기본 타입이 더 빠르다.
실수 타입을 제외하면, 시간차이가 크게 차이 나지도 않을 뿐더러, 조금의 성능을 챙긴다고 기본 타입, 박싱된 기본 타입을 번갈아 사용하다가 생기는 오토 박싱 비용이 훨씬 크다고 생각한다. 그리고, NULL 혹은 제네릭이 필연적이라서 코드의 일관성을 유지하기도 훨씬 좋아보인다.
메모리 값에도 차이가 있지만, 현대의 컴퓨터에서 크게 고려할만한 수치인지도 의문이다.
여러명이 개발하는 환경, 혼자서 오랜시간 개발하는 환경에서는 코드의 일관성이 중요하다. 일관성이 깨지면, 상상하지도 못한 곳에서 오류가 발생할 수도 있다. 그렇기에 피할 수 없는 박싱된 개발 타입을 모든 곳에서 사용하는 것이 개발자에게 좋아보인다. (개발자는 메모리보다 비싸다!!)
여기까지가 제 생각입니다. 다르게 생각하는 부분이 있다면 정말 주저하지 않고 말해주세요!!!!!!!
'기술고민' 카테고리의 다른 글
스프링 시큐리티를 쓰지 맙시다. (feat. JWT) (4) | 2024.04.13 |
---|---|
SonarCloud, Qodana 둘중 무엇을 골라야할까? (1) | 2024.04.05 |
???: 빌더 패턴은 필수 값을 받지 못하잖아요. (3) | 2024.03.26 |
정팩메, 생성자 고를 때 무엇을 고려해야 할까? (2) | 2024.03.25 |
낙관적 락으로 동시성 이슈 해결하기 (0) | 2024.03.21 |