Java - Primitive 타입과 Reference 타입

청포도봉봉이·2023년 11월 10일
1

java

목록 보기
3/20
post-thumbnail

Primitive 타입과 Reference 타입의 차이점은 무엇인가요?

Primitive 타입과 Reference 타입은 자바에서 변수 데이터 타입의 종류이며 기본형과 참조형이라고 한다.
변수란 데이터를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미한다.
데이터 타입은 이 변수에 적재될 데이터가 메모리에 어떻게 저장되고 프로그램에서 어떻게 처리해야할지 명시적으로 알려주는 키워드이다.


기본형 (Primitive)


기본형은 계산을 위해 실제 값이 저장된다.
종류에는 논리형 boolean, 문자형 char, 정수형 byte, short, int, long, 실수형 float, double 이 있다.

종류1 byte2 byte4 byte8 byte
논리형boolean
문자형char
정수형byteshortintlong
실수형floatdouble

특징


  • 모두 소문자로 시작된다.
  • 변수의 선언과 동시에 메모리에 할당된다.
  • 모든 값의 타입은 스택에 저장된다.
  • 저장공간에 실제 값을 가지고 있다.
public class Primitive {
    boolean boolean_result = false;

    byte byte_min = Byte.MIN_VALUE; // -128
    byte byte_max = Byte.MAX_VALUE; // 127

    short short_min =  Short.MIN_VALUE; // -32768
    short short_max =  Short.MAX_VALUE; // 32767

    int int_min = Integer.MIN_VALUE; // -2147483648
    int int_max = Integer.MAX_VALUE; // 2147483647

    long long_min = Long.MIN_VALUE; // -9223372036854775808L
    long long_max = Long.MAX_VALUE; // 9223372036854775807L

    float float_min = Float.MIN_VALUE; // 1.4E-45f
    float float_max = Float.MAX_VALUE; // 3.4028235E38f

    double double_min = Double.MIN_VALUE; // 4.9E-324
    double double_max = Double.MAX_VALUE; // 1.7976931348623157E308
    char c = 'A';

}

위의 코드를 통해 범위를 찍어보았다. 기본형은 데이터를 찍었을때 실제 값이 나타난다.


참조형 (Reference)


참조형은 객체의 주소를 저장한다.
또한 위의 기본형 타입을 제외한 나머지를 말한다. 기본적으로 제공하는 클래스, 프로그래머가 직접 만든 클래스, 배열, 열거, 인터페이스 등이 있다.

특징


  • 기본형과 다르게 실제 값이 저장되지 않고값의 주소가 저장된다.
  • 즉, 실제 값은 다른 곳에 있으며 값을 가지는 주소를 저장하고 있어 그 주소를 참조하여 값을 가지고 온다.
  • 메모리의 힙 영역에 저장하며, 그 참조값을 갖는 변수는 스택에 저장한다.
  • 참조형 변수는 null로 초기화할 수 있다.
public class Person {
    private String name;
    private int age;

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

    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void sayHello() {
        System.out.println("안녕하세요. 제 이름은 " + this.name + "이고, 제 나이는 " + age + "살입니다.");
    }
}
public class Main {
    public static void main(String args[]) {
        Person person = new Person("hmmini", 28);

        System.out.println("person = " + person);

        String name = person.getName();
        int age = person.getAge();
        System.out.println("이름 : " + name);
        System.out.println("나이 : " + age);
        person.sayHello();

        person.setName("mini");
        person.setAge(29);
        person.sayHello();
    }
}
person = Person@28a418fc
이름 : hmmini
나이 : 28
안녕하세요. 제 이름은 hmmini이고, 제 나이는 28살입니다.
안녕하세요. 제 이름은 mini이고, 제 나이는 29살입니다.

위의 코드를 살펴보면, Person이라는 객체를 만들고 실제로 그 값을 찍었을때는 Person@28a418fc와 같이 실제 값이 아닌 객체의 주소 값이 찍힌다.

객체의 값을 가져오려면 객체의 주소값을 참조해서 실제 값을 가져와야 한다.

profile
서버 백엔드 개발자

0개의 댓글