클론코딩을 하던 중 primitive type과 reference type이 달라서 오류가 발생했다.
- Object 타입에서 신경쓸게 더 많다. ->실수할 여지가 많다.NPE나 반복적인 Object를 새로 생성해서 할당하거나
메모리를 훨씬 많이 사용한다
1. 자바 타입 시스템
Java에는 int , boolean 과 같은 기본 형식과 Integer , Boolean 과 같은 참조 형식 으로 구성된 이중 형식 시스템이 있습니다. 모든 기본 유형은 참조 유형에 해당합니다.
모든 객체에는 해당 기본 유형의 단일 값이 포함됩니다. 래퍼 클래스는 변경할 수 없으며(객체가 생성되면 상태를 변경할 수 없도록) 최종 클래스입니다(이 클래스에서 상속할 수 없음) .
내부적으로 Java는 실제 유형이 선언된 유형과 다른 경우 기본 유형과 참조 유형 간의 변환을 수행합니다.
Integer j = 1; // autoboxing
int i = new Integer(1); // unboxing
기본 유형을 참조 유형으로 변환하는 프로세스를 오토박싱이라고 하고 반대 프로세스를 언박싱이라고 합니다.
2. 장단점
어떤 개체를 사용할지 결정하는 것은 달성하려는 애플리케이션 성능, 사용 가능한 메모리 양, 사용 가능한 메모리 양 및 처리해야 하는 기본값을 기반으로 한다.
우리가 그 중 어느 것도 직면하지 않으면 이러한 고려 사항을 알 가치가 있지만 무시할 수 있다.
3.1. 단일 항목 메모리 풋프린트
참조용으로만 기본 유형 변수 는 메모리에 다음과 같은 영향을 미칩니다.
- 부울 – 1비트
- 바이트 - 8비트
- 짧은 문자 – 16비트
- int, float - 32비트
- long, double – 64비트
실제로 이러한 값은 가상 머신 구현에 따라 다를 수 있다. 예를 들어 Oracle VM에서 부울 유형은 int 값 0과 1에 매핑되므로 여기에 설명된 대로 32비트가 필요하다. .
.
참조 유형은 객체이며 힙에 상주하며 상대적으로 액세스 속도가 느립니다. 그들은 원시 대응물과 관련하여 특정 오버 헤드가 있다.
오버헤드의 구체적인 값은 일반적으로 JVM에 따라 다릅니다. 여기에서는 다음 매개변수를 사용하여 64비트 가상 머신에 대한 결과를 제시합니다.
java 10.0.1 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)
객체의 내부 구조를 얻으려면 Java Object Layout 도구를 사용할 수 있다( 객체 크기를 가져오는 방법에 대한 다른 자습서 참조).
이 JVM에서 참조 유형의 단일 인스턴스는 192비트를 차지하는 Long 및 Double 을 제외하고 128비트를 차지하는 것으로 나타났다.
- 부울 – 128비트
- 바이트 – 128비트
- 짧은 문자 – 128비트
- 정수, 부동 소수점 – 128비트
- Long, Double – 192비트
Boolean 유형 의 단일 변수는 128개의 원시 변수만큼 많은 공간을 차지하는 반면 하나의 Integer 변수는 4개의 int 변수만큼 많은 공간을 차지하는 것을 볼 수 있다.
https://www.baeldung.com/java-primitives-vs-objects
위 글에 정확한 내용이 기재되어있다.
결론만 말하자면 단순 조회 비교에서도 성능이 primitive가 낫다.
이런 주된 이유를 이 글에서는 primitive type은 stack memory에 저장이 되고, reference type은 heap memory에 저장되어서라고 설명하고 있다.
primitive type은 값을 stack memory에서 바로 읽고, reference type은 stack memory에서 heap memory의 위치를 구해온 다음에 다시 heap memory에 가서 값을 읽어와야 해서 무조건 primitive type이 성능상 유리하다.
'I LEARNED > TIL' 카테고리의 다른 글
[TIL] Docker 기본 문법 및 명령 (0) | 2022.08.28 |
---|---|
[TIL] Boolean?boolean? (0) | 2022.08.21 |
[TIL] [troubleshooting] for input string"name" (0) | 2022.08.20 |
[TIL] [spring/ troubleshooting] org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL (0) | 2022.08.20 |
TIL_JsonFormat (0) | 2022.08.18 |
댓글