이 또한 지나가리

[JAVA Study01] 기본형과 참조형 본문

개발 일만시간의 법칙

[JAVA Study01] 기본형과 참조형

jjiiyoung 2026. 2. 22. 00:12

 

1. 기본형 타입(primitive type)

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

- 실제 값을 저장하며 stack 메모리에 저장된다.

- int a = 10; 이라고 선언하면 a 안에는 10이라는 값 자체가 저장된다.

- 기본값이 존재하기 때문에 Null 개념이 존재하지 않는다.

 

2. 참조형 타입(reference type)

- String, 배열, 객체 등 기본형 타입을 제외한 모든 타입

- 객체가 저장된 위치 즉, 주소값을 저장하며 heap 메모리에 저장된다.

- String s = "hello"; 라고 선언하면 s 안에는 "hello" 객체의 주소가 저장된다.

- 빈 객체를 의미하는 Null 개념이 존재한다.

- Interger는 참조형이나 -128 ~ 127 범위의 Integer는 캐싱하여 같은 객체를 사용한다.

Integer a0 = 100;
Integer b0 = 100;
System.out.println(a0 == b0); //true

Integer a1 = 128;
Integer b1 = 128;
System.out.println(a1 == b1); //false

 

3. 기본형 vs 참조형

- 기본형은 값 복사 시 값 자체가 복사된다.

- 참조형은 주소 값이 복사 된다. 그래서 참조형은 같은 객체는 가리킬 수 있다.

- '=='같은 객체인가?를 비교한다.

- 'equals()'논리적으로 같은 값인지? 비교한다. "hello"라는 리터럴과 new String("hello")는 주소는 다를 수 있으나, 논리적인 값은 같기 때문에 '=='로 비교하면 false, equals()로 비교하면 true가 된다.

 => String 리터럴은 보통 String pool에 저장되어 재사용되는데, new String()으로 선언 시 무조건 새 객체가 생성된다.

- 기본형은 빠르고 단순해야하고, 객체는 여러 변수가 같은 객체를 공유할 수 있도록 유연하게 설계되었다.

 

4. 물리적 값과 논리적 값

- 물리적 값은 메모리 관점으로 실제 저장된 값으로 기본형은 값 자체가 저장되고 객체는 주소가 저장된다.

- 논리적 값은 내용 자체를 의미한다. 예를 들어, String "hello"의 논리적 값은 문자열 내용 자체인 'hello'를 가리킨다.

public static void main(String[] args) {
    int a = 10;
    int b = a;
    a = 99;
    System.out.println(b);		// 10 (a값 변경에 영향을 받지 않음)

    int[] arr1 = {1, 2, 3};				
    int[] arr2 = arr1;			// 주소가 복사됨(같은 배열을 바라 봄)
    arr1[0] = 99;						
    System.out.println(arr2[0]);	// 99 (같은 객체를 바라봐 값에 영향 받음)
    System.out.println(arr1);		// [I@452b3a41
    System.out.println(arr2);		// [I@452b3a41
    
    System.out.println(s1 == s2); 	// true (String pool에서 값을 가져옴)
    System.out.println(s1 == s3); 	// false (같은 객체가 아니라 주소값이 다름)
    System.out.println(s1.equals(s3));	//true (값을 비교)

}