Primitive Type vs Wrapper Class

정미·2022년 7월 28일
0

Computer Science

목록 보기
53/81

Primitive Types

  • 기본 데이터형은 변수값의 크기와 타입을 나타낸다.
  • 메서드가 없다.

default value

type기본값
booleanfalse
byte0
short0
int (기본)0
long0L
float0.0F
double (기본)0.0
char‘\u0000’

Wrapper Classes

  • 기본형을 객체로서 사용할 수 있는 방식

default value

모두 null이다.

어떤 것을 사용해야 할까?

코드가 어떻게 동작해야하는지에 따라 다르다.

무엇을 사용해야 할지 확신이 없다면, 항상 primitive type을 사용하라.

해답 대신 질문을 이끌어내기

  • Integer 대신 int를 사용하면 무슨 일이 일어날까?
  • enum 대신 String constant를 사용하면 무슨 일이 일어날까?
  • boolean 대신 Boolean을 사용하면 무슨 일이 일어날까?
  • 등..

예시

public class ConsignmentDetail {
    private long id;
    private Float latitude;
    private Float longitude;
    private boolean isAssigned;
}
  • 경도와 위도가 실제 값이 할당되기 전에 기본값 0.0F이기보다 null이어야 한다.
public class OrderDetail {
    private long id;
    private String name;
    private int quantity;
    private boolean isActive;
    private Float weight;
}
  • isActive가 null일 수 있을까? 활동적이거나 활발하지 않은 상태만 있을 뿐 또다른 상태는 없다.
  • 상품의 무게는 0일 수가 없다. float를 사용하면 잘못된 결과를 줄 수 있다.
public interface OrderManagementService {
    Optional<ConsignmentDetail> scheduleOrder(List<OrderDetail> orderDetail, boolean isInternational, int userId);
    boolean cancelOrder(int consignmentId);
    void updateConsignment(ConsignmentDetail consignment, Integer latitude, Integer longitude) throws Exception;
}
  • 사용자 아이디 userId는 null이 아닌 유효한 값을 가져야 한다.

어플리케이션

  1. Database Models

    • 데이터베이스는 null을 포함한 모든 종류의 값을 가질 수 있다.
    • 모델 객체나 엔티티는 반드시 Wrapper 클래스여야 한다.
  2. DTOs (Request & Response)

    • API 설계가 nullable value를 가지고 있느냐에 따라서 Wrapper 클래스를 가지고 있을수도, 아닐수도 있다.
  3. Implementations

    public class OrderManagementServiceImpl implements OrderManagementService {
    
        @Override
        public Optional<ConsignmentDetail> scheduleOrder(List<OrderDetail> orderDetailList, boolean isInternational, int userId) {
            log.info("Generating consignment for user: {}", userId);
            if(isInternational) {
                ConsignmentDetail consignmentDetail = new ConsignmentDetail();
                consignmentDetail.setAssigned(true);
                float totalWeight = 0f;
                for (OrderDetail orderDetail : orderDetailList) {
                    totalWeight += orderDetail.getWeight();
                }
                consignmentDetail.setTotalWeight(totalWeight);
                return Optional.of(consignmentDetail);
            }else {
                return Optional.empty();
            }
        }
    }
    • 지역 변수는 항상 primitive 타입이어야 한다.
    • 필드 변수는 이것의 사용성에 대한 물음을 만족시키지 않는다면 primitive 타입을 사용해야 한다.

결론

  1. Wrapper 클래스를 잘못 사용하면 NullPointerException이 발생한다.
  2. Wrapper 클래스를 잘못 사용하면 추가적인 메모리를 사용한다.
  3. Primitive 타입을 잘못 사용하면 원하지 않는 디폴트 값이 들어간다.
  4. 디버깅에 많은 시간을 쏟게 된다.

출처

0개의 댓글