Wrapper Class

int 와 Integer의 차이

  1. int (Primitive 자료형)
    • '자료형' 을 의미한다. (int, float, long, double 와 같은 하나의 primitive 자료형을 의미합니다.)
    • '산술 연산'이 가능합니다.
    • null 로 초기화 불가능합니다. (0으로 초기화 가능합니다.)
  2. Integer (Wrapper 클래스-객체)
    • Wrapper 클래스입니다.
    • Unboxing 을 하지 않으면 산술 연산이 불가능하지만, null값은 처리할 수 있습니다.
    • null값 처리가 용이해서 SQL 과 연동할 경우 처리가 용이. 직접적인 산술연산은 불가능합니다.

Wrapper 클래스란?

Wrapper 클래스란 자바 기본형을 클래스화 시킨 것으로 기본 데이터형을 값이 아닌 객체로 사용할 수 있는 방법을 제공한다.

Java는 데이터를 클래스와 객체 외에 기초 타입을 가집니다. 그렇기 때문에 Java는 기본형 타입(위에서 말한 primitive 자료형)과 객체 참조(클래스) 같은 두 가지 타입의 관리 데이터를 가집니다. 경우에 따라서 기본형 타입을 객체로 사용하는 경우가 있으며, 이러현 경우 기본형 타입 값을 객체로 표현해야합니다.

이때 Wrapper 클래스를 사용하는데, 특정 기본형 타입으로 나타냅니다. 예를 들어 Integer 클래스는 간단한 정수 값을 나타내며 객체는 하나의 int값을 저장할 수 있습니다.

그래서!!

Integer a = new Integer(10);

Double b = new Double("4.57");

Long c = new Long(111);

Class 이기 때문에 새롭게 객체를 생성해서 값을 넣어줘야 하는데 .. 그 대신

Long c = 111L;

이렇게 뒤에 L 붙이나보다.. 이제 이해함 ㅎㅎ

✔️ Wrapper Class의 메소드 중 parse로 시작하는 메소드는 객체형이 아닌 기본 데이터형을 반환한다.

int numInt = Integer.parseInt("8");

🗯️🗯️🗯️🗯️🗯️ 잠깐! 🗯️🗯️🗯️🗯️🗯️🗯️

JPA에서 Entity Id는 왜 Long일까?

null을 사용할 수 있기 때문에 사용하고 있다. 프리미티브 타입은 기본값이 0인데 그럼 실제로 id 값이 0인건지, 값이 없는건지 사실 구분하기 어렵다. id가 0일 수도 있는거니까요. 그런데 Wrapper 타입인 Long이나 Integer를 쓰면 id가 없는 경우엔 확실히 null이고, 그 자체로 id가 없다는걸 보장할 수 없기 때문. 

➡️ 숙제 속 내용..

Class wrapperClass = ClassUtils.resolvePrimitiveIfNecessary(f.getType());

f.getType()의 자료형을 wrapperClass로 만들어주는 classUtils

  • f.getType().isPrimitive() == true
  • wrapperClass.isPrimitive() == false
if(Number.class.isAssignableFrom(wrapperClass)){
    NumberUtils.parseNumber(value, wrapperClass);
    //wrapperClass 대신 f.getType()(int)는 들어가면 안된다.) int는 class가 아닌 자료형! 
}

.
.
.

public static <T extends Number> T parseNumber(String text, Class<T> targetClass) {
    //String text를 targetClass인 T로 return 시켜주는 메소드
    //<T extends Number> T는 Number를 상속 받은 Class만 가능하다. 
    //여기서 WrapperClass는 Integer이므로 Number를 상속받는 Class이기 때문에 가능. 
    //String --> Integer 

}

⚠️ instanceof와 Class.isAssignableFrom의 차이점⚠️

  • instanceof 는 특정 Object가 어떤 클래스/인터페이스를 상속/구현했는지를 체크하며
  • Class.isAssignableFrom() 은 특정 Class가 어떤 클래스/인터페이스를 상속/구현했는지 체크합니다.
// instanceof
MacPro obj = new MacPro();
if (obj instanceof Computer) {
  ...
}

// Class.isAssignableFrom()
if (Computer.class.isAssignableFrom(MacPro.class)) {
  ...
}

☑️ ENUM일 경우..

result = Enum.valueOf((Class<Enum>) wrapperClass, value);
result = Enum.valueOf((Class<Enum>) f.getType(), value);

//둘 중에 뭐가 맞을까..?
//class가 들어와야 하는 건 똑같은데.. 둘 다 가능
.
.
.

public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) {

}

ENUM의 경우 f.getType()이 enum이란 자료형이 없기 때문에 class를 그대로 가져오는 거 같음.

(자바에서는 enum을 참조자료형 이라고 한다고 함..)

그렇기 때문에 둘다 넣어도 같은 결과가 나오는 거 같다!!!!