Java 변수 타입 기본형, 참조형
변수의 데이터 타입은 크게 두 가지로 분류될 수 있다.
- 기본형(Primitive Type): 변수에 직접 사용하는 Value을 삽입하는 타입
- 대표적인 변수: int, long, double, boolean
- 참조형(Reference Type): 변수에 저장된 메모리 Address를 삽입하는 타입
- 대표적인 배열 또는 객체: int[], double[], new ArrayList<>()
기본형은 직접 값을 넣고 사용할 수 있지만, 참조형 변수는 위치(참조값)만 알고 있기 때문에 사용하려면 실체가 있는 위치로 이동해야 한다.
값 할당
- 기본형: 리터럴 10, 20 와 같은 값을 직접 할당할 수 있다.
- 참조형: 사용하는 리터럴 값을 변수에 담을 수 없다. 실제 객체의 참조 주소를 저장하고, 참조 주소로 사용하는 것은 객체와 배열이 있다.
- 객체는 dot(.) 을 통해서 메모리에 생성된 객체를 찾아간다.
- 배열은 []를 통해 메모리에 생성된 배열을 찾아간다.
값 계산
- 기본형: 변수에는 값을 가지고 있고, 그대로 사용하고 계산할 수 있음
- 참조형: 변수에는 참조 주소만 가지고 있고, 참조 주소로 계산할 수 없음
- 참조 주소로 직접 가야 계산이나 사용할 수 있다.
값 계산 코드 예시
기본형
int x = 10, y = 11;
int sum = x + y;
- 기본형은 실제 사용하는 값이 담겨 있어서 연산이 가능하다.
참조형
String[] s1 = new String[10];
String[] s2 = new String[10];
s1 + s2; // 오류 발생
- 참조형은 객체의 주소만 담겨 있기 때문에, 참조값은 계산에 사용할 수 없으므로 오류가 발생한다.
연산이 필요하다면 객체의 기본형 멤버 변수에 접근하여 계산을 하도록 한다.
int[] ss = new int[10];
ss[0] = 100; // 배열의 객체에 접근하여 100 갑 할당
System.out.println(ss[0]); // 배열의 객체에 접근하여 100 갑 출력
기본형, 참조형 변수 이름 짓기
개발 스타일을 일관되게 해야 이것이 참조형인지 기본형인지 분간할 수 있다.
- 기본형 변수는 앞글자가 소문자로 시작해야한다.
- 참고로 기본형 int, long, double, boolean 변수와 같이 사용자 지정 타입을 만들 수 없다.
- 참조형 변수는 앞글자가 대문자로 시작해야한다.
- 참조형은 Student, ProductOrder 와 Java에서 제공 안되는 것을 개발자가 사용자 정의 타입으로 정의를 내려 사용할 수 있게 한다.
이해하기 쉬운 팁
자바는 변수의 값을 복사해서 대입한다.
기본형은 실제 그 값을 복사하여 다른 곳에서도 그 값을 나타내지만, 참조형은 변수에 들어간 참조 주소를 복사하여 대입하게 된다.
- 기본형 대입
int x = 100;
int y = x;
- 참조형 대입
Student student1 = new Student();
Student student2 = student1;
대입 과정에서 중간에 변수의 값을 변경하게 된 경우 어떻게 출력되는지 확인해보도록 한다.
- 기본형 대입, 할당 후 값 수정
int x = 100;
int y = x;
x = 200; // x 의 값을 200으로 변경하였다.
System.out.println(x); // 200 출력
System.out.println(y); // 100 출력
- 참조형 대입, 할당 후 값 수정
public static class point{
int x = 100;
}
public static void main(String[] args) {
point a = new point();
point b = a;
System.out.println(a.x); // 100 출력
System.out.println(b.x); // 100 출력
a.x = 200;
System.out.println(a.x); // 200 출력
System.out.println(b.x); // 200 출력
}
기본형 대입은 변경 된 경우 y 의 값은 변화되지 않는다.
참조형 대입은 수정 전에는 a, b 둘다 멤버 접근자 x 값이 100 이 출력되는 것을 확인할 수 있다.
그리고 a.x 를 200으로 변경하였으나, b.x 도 같이 변경된 것을 볼 수 있다. 이러한 현상이 발생되는 이유는 a, b 변수는 실제 값을 들고 있지 않고 주소만 갖고 있으며, a, b 변수 모두 같은 주소를 갖고 있다. 이로 인해 어느 한쪽이 멤버를 접근하여 설정하게 되면 다른 변수에도 영향을 끼칠 수 있게 된다.