** 변수의 데이터 타입을 가장 크게 보면 기본형과 참조형으로 분류할 수 있다.
1. 기본형
- int, long, double, boolean등 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입
- 기본형은 연산 가능, 참조형은 연산 불가능
int a = 10, b = 20;
int sum = a + b;
2. 참조형
- 객체(ex) Student student) 및 배열(int[] arr)과 같이 데이터에 접근하기 위한 참조값(주소)를 저장하는 데이터 타입
- 객체는 .(dot), 배열은 []를 통해서 메모리 상에 지정된 주소를 찾아가야 사용가능.
- 기본형을 제외한 나머지는 모두 참조형이다.
기본형 vs 참조형 - 변수 대입
** 자바는 항상 변수의 값을 복사해서 대입한다.
** 참조형의 경우 실제 사용하는 객체가 아니라 객체의 위치를 가리키는 참조값(주소)가 복사된다.
ex)
Student s1 = new Student(); // 예를들어 주소값 x001
Student s2 = s1; -> s2가 가리키는 주소값 또한 x001
참조형과 변수 대입
예시코드)
Data
public class Data {
int value;
}
VarChange2
public class VarChange2 {
public static void main(String[] args) {
Data dataA = new Data();
dataA.value = 10;
Data dataB = dataA;
System.out.println("dataA 참조값=" + dataA);
System.out.println("dataB 참조값=" + dataB);
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value);
//dataA 변경
dataA.value = 20;
System.out.println("변경 dataA.value = 20");
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value);
//dataB 변경
dataB.value = 30;
System.out.println("변경 dataB.value = 30");
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value);
}
}
실행결과
dataA 참조값=ref.Data@x001
dataB 참조값=ref.Data@x001
dataA.value = 10
dataB.value = 10
변경 dataA.value = 20
dataA.value = 20
dataB.value = 20
변경 dataB.value = 30
dataA.value = 30
dataB.value = 30
- Data dataA = new Data()를 통하여 객체를 생성하였고 dataB에 dataA를 가리키고 있는 참조값을 복사해주었다.
- 따라서 두 객체가 가리키는 주소값이 같기 때문에 둘 중 하나에 객체에 접근에 값을 바꿔주면 동일한 값이 출력된다.

기본형 vs 참조형 2 - 메서드 호출
참조형과 메서드 호출
package ref;
public class MethodChange2 {
public static void main(String[] args) {
Data dataA = new Data();
dataA.value = 10;
System.out.println("메서드 호출 전: dataA.value = " + dataA.value);
changeReference(dataA);
System.out.println("메서드 호출 후: dataA.value = " + dataA.value);
}
}
static void changeReference(Data dataX) {
dataX.value = 20;
}
실행결과)
메서드 호출 전: dataA.value = 10
메서드 호출 후: dataA.value = 20
- 위 코드에서는 메서드를 호출할 때 매게변수 dataX에 변수 dataA의 값을 전달한다.
- 메서드 호출 시 dataA는 참조값을 dataX에 전달했기 때문에 dataX를 통해서도 dataA에 있는 객체에 접근하여 값을 변경할 수 있다.
기본형과 참조형의 메서드 호출
- 기본형
- 메서드로 기본형 데이터를 전달하면, 해당 값이 복사되어 전달. 이 경우 메서드 내부에서 매개변수의 값을 변경해도, 호출자의 변수 값에는 영향이 없다.
- 참조형
- 메서드로 참조형 데이터 전달하면, 참조값이 복사되어 전달된다. 이 경우, 메서드 내부에서 매개변수로 전달된 객체의 멤버 변수를 변경하면, 호출자의 객체도 변경된다.
Null
** 값이 존재하지 않는, 없다는 뜻이다.
NullPointerException
- 이름 그대로 Null을 가리키다인데, 이때 발생하는 예외다. 결국 참조값(주소)이 없는 곳을 찾아갈 때 발생하는 예외이다.
예시코드)
public class NullMain2 {
public static void main(String[] args) {
Data data = null;
data.value = 10;// NullPointerException 예외 발생
System.out.println("data = " + data.value);
}
}
- 위 코드에서는 data가 가리키는 주소가 null이기 때문에 data안의 value에 접근할 수가 없다. 따라서 NullPointerExceoption이 발생한다.
'Java' 카테고리의 다른 글
| Java 기본 - 생성자 (0) | 2024.12.08 |
|---|---|
| Java 기본 - 객체지향 프로그래밍 (1) | 2024.12.07 |
| Java 기본 - 클래스(배열) (0) | 2024.11.19 |
| Java 기본 - 클래스, 객체, 인스턴스 (0) | 2024.11.11 |
| StringBuilder (0) | 2024.09.12 |