![[java data type 1.png]]
변수의 데이터 타입은 크게 *기본형(Primitive type)* 과 *참조형(Non-Primitive type/Reference type)* 으로 구분된다.
- 기본형 : `boolean`, `char`, `byte`, `short`, `int`, `long`, `float`, `double` 처럼 변수에 직접적으로 값을 입력 할 수 테이터 타입.
- 참조형 : `Array`, `String`, `class`, `Interfaces` ... 처럼 데이터에 접근하기 위해 해당 주소를 저장하는 테이터 타입.
## 변수 대입
##### 기본형 대입
```JAVA title:"기본형 대입"
int a = 10;
int b = a;
int a = 20;
System.out.println(a) // 출력:20
System.out.println(b) // 출력:10
```
변수의 기본형은 값 자체를 저장한다. `b = a`를 하면 `a`의 값(10)이 복사되어 `b`에 들어가, `b`도 10의 값을 가진다. 하지만 `b`와 `a`는 독립적인 값을 가진 변수다. 즉 `a`의 값을 바꾸더라도 `b`의 값은 변하지 않는다.
##### 참조형 대입
```java title:"참조형 대입"
int[] arr1 = {1,2,3};
int[] arr2 = arr1;
arr1[0] = 99;
System.out.println(arr2[0]); // 출력:99
```
참조형 변수는 값이 아닌 주소를 저장한다. `int[] arr2 = arr1;`에서 `arr1`이 가르키는 배열의 주소를 `arr2`에 복사하여 이 둘은 같은 객체를 참조하게 된다. 때문에 `arr1`을 바꾸면 `arr2`도 영향을 받아 값이 바뀌게 된다.
## 정리
##### 기본형
기본형은 값 자체를 변수에 직접 저장하며, 메모리의 스택 영역에 저장된다. 변수에 값을 대입하면 값이 복사되어 각 변수는 독립적으로 작동하고, 서로 영향을 주지 않는다. 메소드 호출 시에도 값이 그대로 복사되어 전달되기 때문에 메소드 내에서 변수의 값을 변경하더라도 원래 변수에는 아무런 영향이 없다.
##### 참조형
참조형은 객체의 주소(참조값)를 변수에 저장하고, 실제 객체는 힙 영역에 저장된다. 변수에 다른 참조형 변수를 대입하면 주소가 복사되어 같은 객체를 함께 참조하게 된다. 메소드 호출 시에도 참조값이 복사되어 전달되므로, 메소드 내부에서 객체의 속성을 변경하면 원래 객체에도 그 변화가 반영된다. 하지만 메소드 내에서 새로운 객체를 만들어 변수에 재할당하더라도 이는 메소드 내부에서만 적용되고 원래 변수에는 영향을 미치지 않는다.
| 구분 | 기본형 (Primitive Type) | 참조형 (Reference Type) |
| :-------: | :------------------------: | :-------------------------------: |
| 저장내용 | 값 자체 | 객체의 주소(참조값) |
| 대입 시 | 값이 복사됨 | 주소가 복사됨 |
| 변경 시 | 서로 영향 없음 | 서로 영향 있음(같은 객체 참조 시) |
| 저장 위치 | 스택(stack) | 주소는 스택(stack), 객체는 힙(Heap) |
| 메소드 호출 시 | 값이 복사되어 전달 -> 원본은 변하지 않음 | 참조값이 복사되어 전달 -> 객체 내부 변경시 원본도 변경됨 |
| 메소드 내 재할당 | 영향 없음 -> 새로운 값은 호출자에 반영 안됨 | 새로운 객체 할당해도 호출자에는 영향 없음 |
#### Reference
- http://btechsmartclass.com/java/java-data-types.html
- 김영한의 자바 강의 기본편