Primitive type(원시타입) vs. Reference type(참조타입)

Jay Jang·2022년 5월 22일
7

Java

목록 보기
1/5

자바에서 데이터 타입은 크게 두 가지로 나눌 수 있다. Primitive Type(원시 타입)Reference Type(참조 타입) 이 그것이다.

원시 타입 은 정수, 실수, 문자, 논리 리터럴 등의 실제 데이터 값을 저장하는 타입이고,

  • int, long, double, float, boolean, byte, short, char

참조 타입 은 객체(Object)를 참조(주소를 저장) 하는 타입으로 메모리 번지 값을 통해 객체를 참조하는 타입이다.

  • Integer, Long, Double, Float, Boolean, Byte, Short, Char

최근 자바는 오토박싱, 언박싱이 잘 되어 있어, 원시 타입과 참조 타입을 코드 구현 상에서 같이 사용해도 큰 불편함이 없다.

int i = Integer.valueOf(1);
Integer integer = i;
// 오토박싱 언박싱이 되기 때문에, 이런식으로 사용해도 컴파일 오류가 발생하지 않는다.

AutoBoxing(오토 박싱) & UnBoxing(언박싱)

Primitive type(원시 타입)


int, long, double, float, boolean, byte, short, char 총 8 가지의 primitive type을 Java 에서 미리 정의하고 제공한다.

Java에서 기본 자료형은 반드시 사용하기 전에 선언(Declared) 되어야하며, 자료형의 길이는 운영체제에 독립적이며 변하지 않는다.

스택(stack) 메모리 에 저장된다.

Reference Type(참조 타입)


원시 타입을 제외한 타입들*(문자열, 배열, 열거, 클래스, 인터페이스)*을 말한다.

즉, 참조 타입(Reference type 은 Java에서 최상위 클래스인 java.lang.Object 클래스를 상속하는 모든 클래스들을 말한다.

Java에서 실제 객체힙(heap) 메모리에 저장되며 참조 타입 변수스택 메모리 에 실제 객체들의 주소를 저장하여, 객체를 사용할때 마다 참조 변수에 저장된 객체의 주소를 불러와 사용하는 방식이다.

이후 Garbage Collector가 돌면서 메모리를 해제한다.

출처 : Primitive type & Reference type | 👨🏻‍💻 Tech Interview (gyoogle.dev)

힙 메모리에 생성된 인스턴스는 메소드나 각종 인터페이스에서 접근하기 위해 JVMStack 영역에 존재하는 에 참조값을 가지고 있어 이를 통해 인스턴스를 핸들링한다.

원시 타입 vs. 참조 타입


원시 타입과 참조 타입의 기능적 차이는 크게 2가지가 있다.

  1. Null을 담을 수 있는가?

    원시 타입은 null을 담을 수 없다. 반면에 참조 타입은 null을 입력값으로 받을 수 있다.

int i = null; // 불가능
Integer integer = null; // 가능
  1. 제네릭 타입에서 사용할 수 있는가?

    원시 타입은 제네릭 타입에서 사용할 수 없다. 반면에 참조 타입은 제네릭 타입에서 사용할 수 있다.

    List<int> i; // 불가능
    List<Integer> integer; // 가능

성능


원시 타입스택 메모리에 존재하고, 참조 타입스택 메모리에는 참조 값만 있고, 실제 값은 힙 영역에 존재한다.

참조 타입은 최소 2번 메모리 접근을 해야하며, 일부 타입의 언박싱 과정을 거쳐야 하므로 원시 타입과 비교해 접근 속도가 느리다.

String class


클래스형에서도 String 클래스는 조금 특별하다. 이 클래스는 참조형에 속하지만 기본적인 사용은 기본형
처럼 사용한다. 그리고 불변(immutable)하는
객체이다. String 클래스에는 값을 변경해주는 메소드들이 존재하지만 해당 메소드를 통해 데이터를 바꾼다 해도 새로운 String 클래스 객체를 만들어내는 것이다. 일반적으로 기본형 비교는 == 연산자를 사용하지만 String 객체간의 비교는 .equals() 메소드를 사용해야 한다.

Reference


Section 3.3 Primitive Types vs. Reference Types - Java™ How To Program (Early Objects), Tenth Edition [Book] (oreilly.com)

java - What's the difference between primitive and reference types? - Stack Overflow

Primitive type & Reference type | 👨🏻‍💻 Tech Interview (gyoogle.dev)

원시타입, 참조타입(Primitive Type, Reference Type) (velog.io)

Java에서 원시타입 vs 참조타입 어떤 걸 사용해야 할까? (tistory.com)

[Java] 원시 타입 vs 참조 타입 (tistory.com)

profile
그때는맞고지금은틀리다

0개의 댓글