Backend/Java

[Java] Primitive Type, Reference Type의 개념과 차이점

누구세연 2024. 1. 13. 16:13

자바에서는 기본 데이터 타입(Primitive type)과 참조 데이터 타입(Reference type)으로 분류됩니다.

각각의 특징과 주요 데이터 타입에 대해 설명하겠습니다.

 

Primitive Type (기본 데이터 타입)

Primitive Type은 단일 값만을 가지고 있는 간단한 데이터를 나타냅니다.

이러한 타입들은 스택 메모리에 직접 값을 저장하며, 객체의 참조가 아닌 값을 저장합니다.

 

정수 타입(Integer Types)

  • byte : 8비트, -128~ 127
  • short: 16비트, -32,768 ~ 32,767
  • int: 32비트, -2^31 ~ 2^31-1
  • long: 64비트, -2^63 ~ 2^63-1
byte byteValue = 120; 
short shortValue = 30000;  
int intValue = 2000000000; 
long longValue = 9000000000000000000L;

실수 타입(Floating-point Types)

  • float: 32비트, 부동 소수점
  • double: 64비트, 부동 소수점(기본값)
float floatValue = 3.14f; 
double doubleValue = 3.141592;

문자타입(Character Type)

  • char: 16비트, 유니코드 문자
char charValue = 'A';

불리언 타입(Boolean Type)

  • boolean: 참(true) 또는 거짓(false)
boolean booleanValue = true;

 

 

Reference Type(참조 데이터 타입)

Reference Type은 객체를 참조하는 데 사용되며, 객체는 힙(Heap) 메모리에 할당됩니다.

객체의 주소를 변수에 저장하고, 실제 데이터는 힙에 저장됩니다.

 

클래스(class)

  • 사용자가 직접 정의한 타입
Person person = new Person("seyeon", 20);

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

인터페이스(Interface)

  • 클래스와 마찬가지로 사용자가 정의하며, 다중 상속이 가능한 타입
Animal dog = new Dog("Buddy");

interface Animal {
    void makeSound();
}

class Dog implements Animal {
    private String name;

    public Dog(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

배열(Array)

  • 동일한 타입의 여러 값을 담을 수 있는 자료구조
int[] intArray = {1, 2, 3, 4, 5};

열거형(Enumeration)

  • 서로 관련 있는 상수의 집합
DayOfWeek day = DayOfWeek.MONDAY;

enum DayOfWeek {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}

기타(Custom Types)

  • 라이브러리나 프레임워크에서 제공하는 다양한 타입
java.util.List<String> stringList = new java.util.ArrayList<>();
stringList.add("Apple");
stringList.add("Banana");

 

 

Primitive Type vs Reference Type

기본 데이터 타입(Primitive Type)과 참조 데이터 타입(Reference Type) 사이의 주요 차이점은 다음과 같습니다

 

값의 저장 방식

  • 기본 데이터 타입: 실제 값을 직접 저장합니다.
  • 참조 데이터 타입: 객체의 주소(참조)를 저장하고 해당 객체는 힙(heap) 메모리에 저장됩니다.

메모리 위치

  • 기본 데이터 타입: 스택(stack) 메모리에 값을 저장합니다.
  • 참조 데이터 타입: 힙(heap) 메모리에 객체가 동적으로 할당되어 저장되고, 참조 변수는 해당 객체의 주소를 저장합니다.

초기화

  • 기본 데이터 타입: 초기화하지 않으면 해당 타입의 기본값으로 자동 초기화됩니다.
  • 참조 데이터 타입: 초기화하지 않으면 null로 자동 초기화됩니다.

크기 및 범위

  • 기본 데이터 타입: 크기와 값의 범위가 각 타입에 따라 정해져 있습니다.
  • 참조 데이터 타입: 객체의 크기는 유연하게 동적으로 할당되어 변할 수 있습니다.

불변성(Immutability)

  • 기본 데이터 타입: 한 번 값이 할당되면 변경할 수 없습니다.
  • 참조 데이터 타입: 참조하는 객체의 상태를 변경할 수 있습니다.

Null 허용

  • 기본 데이터 타입: null을 허용하지 않습니다.
  • 참조 데이터 타입: null을 허용하며, 초기화되지 않은 경우에는 null로 자동 초기화됩니다.

메모리 사용

  • 기본 데이터 타입: 스택 메모리에 저장되어 메모리 사용이 고정적입니다.
  • 참조 데이터 타입: 힙 메모리에 동적으로 할당되어 메모리 사용이 유연합니다.

변경 가능한 상태

  • 기본 데이터 타입: 값이 변하지 않아 불변성이 있습니다.
  • 참조 데이터 타입: 객체의 상태를 변경할 수 있습니다.

복잡한 연산

  • 기본 데이터 타입: 간단한 산술이나 비교 연산이 가능합니다.
  • 참조 데이터 타입: 객체에 대한 다양한 연산이 가능하며, 메서드 호출이나 다른 객체와의 상호작용이 가능합니다.

 

이러한 차이점들은 자바 프로그래밍에서 데이터를 다룰 때 타입 선택에 영향을 미치며, 적절한 상황에서 각 타입을 사용하는 것이 중요합니다.