'김영한의 실전 자바' 강의를 보고 정리하였습니다.
기본형 vs 참조형
기본형(Primitive Type)
- 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입
- ex) int, long, double, boolean 등 👉🏻 소문자로 시작 !
- 실제 사용하는 값을 변수에 담아 사용할 수 있다.
- 기본형은 개발자가 새로 정의할 수 없다.
참조형(Reference Type)
- 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입
- ex) Student student1, int[ ] students 등 👉🏻 객체 또는 배열에 사용
- 실제 사용하는 값을 변수에 바로 담는 것 ❌, 실제 객체의 위치(참조, 주소)를 저장한다.
- 객체는 . (dot)을 통해서 메모리 상에 생성된 객체를 찾아가야 사용할 수 있다.
- 배열은 [ ]을 통해서 메모리 상에 생성된 배열을 찾아가야 사용할 수 있다.
- 참조형인 클래스는 직접 정의할 수 있다.
📌 Tip !
기본형을 제외한 나머지는 모두 참조형 !
✋🏻 여기서 잠깐 ! - String은 왜 대문자로 시작할까 ❓
String은 사실 클래스다.
String은 참조형이지만 기본형처럼 문자 값을 바로 대입할 수 있다. 문자는 매우 자주 다루기 때문에 자바에서 특별하게 편의 기능을 제공하는 것 !
기본형 vs 참조형 - 변수 대입
⭐ 자바는 항상 변수의 값을 복사해서 대입한다. 👉🏻 중요 !
기본형 대입
변수에 들어 있는 실제 사용하는 값을 복사해서 대입한다.
int a = 10;
int b = a;
참조형 대입
변수에 들어 있는 참조값을 복사해서 대입한다.
Data dataA = new Data(); // dataA = x001
dataA.value = 10;
Data dataB = dataA; // dataB = x001
기본형 vs 참조형 - 메서드 호출
메서드 호출도 마찬가지이다.
메서드를 호출할 때 사용하는 매개변수(파라미터)도 결국 변수일 뿐이다. 따라서 메서드를 호출할 때 매개변수에 값을 전달하는 것도 위와 동일하게 값을 복사해서 전달한다.
기본형 메서드 호출
public class MethodChange1 {
public static void main(String[] args) {
int a = 10;
System.out.println("메서드 호출 전: a = " + a);
changePrimitive(a);
System.out.println("메서드 호출 후: a = " + a);
}
static void changePrimitive(int x) {
x = 20;
}
}
메서드를 호출할 때 매개변수 x에 변수 a의 값을 전달한다. 따라서 변수 a, x 각각 숫자 10을 가지고 있다.
메서드 안에서 x = 20으로 새로운 값을 대입한다.
결과적으로 x의 값만 20으로 변경되고, a의 값은 10으로 유지된다.
메서드 종료 후 출력해보면 a는 10이라는 값을 변함없이 그대로 가지고 있다는 것을 확인할 수 있다. 메서드가 종료되면 매개변수 x는 제거된다.
참조형 메서드 호출
public class MethodChange2 {
public static void main(String[] args) {
Data dataA = new Data();
dataA.value = 10;
System.out.println("메서드 호출 전: dataA.value = " + dataA.value);
System.out.println("dataA = " + dataA);
changeReference(dataA);
System.out.println("메서드 호출 후: dataA.value = " + dataA.value);
}
static void changeReference(Data dataX) {
System.out.println("dataX = " + dataX);
dataX.value = 20;
}
}
변수 dataA는 참조값 x001을 가지고 있으므로 참조값을 복사해서 전달했다. 따라서 변수 dataA, dataX 둘 다 같은 참조값 x001을 갖게 된다.
메서드 안에서 dataX.value = 20으로 새로운 값을 대입한다.
참조값을 통해 x001 위치에 존재하는 인스턴스에 접근하고, 그 안에 있는 value의 값을 20으로 변경했다.
dataA, dataX 둘 다 같은 x001 인스턴스를 참조하기 때문에 dataA. value와 dataX.value는 둘 다 20이라는 값을 가진다.
메서드 종료 후 dataA.value의 값이 20으로 변경된 것을 확인할 수 있다.
기본형과 참조형의 메서드 호출
자바에서 메서드의 매개변수(파라미터)는 항상 값에 의해 전달된다. 그러나 이 값이 실제 값인지, 참조(메모리 주소)값인지에 따라 동작이 달라진다.
- 기본형(Primitive Type): 해당 값이 복사되어 전달된다. 메서드 내부에서 매개변수(파라미터)의 값을 변경해도, 호출자의 변수 값에는 영향이 없다.
- 참조형(Reference Type): 참조값이 복사되어 전달된다. 메서드 내부에서 매개변수(파라미터)로 전달된 객체의 멤버변수를 변경하면, 호출자의 객체도 변경된다.
'Java' 카테고리의 다른 글
[JAVA] 3. 객체 지향 프로그래밍 (1) | 2024.07.12 |
---|---|
[JAVA] 2-3. 기본형과 참조형 - null (0) | 2024.07.12 |
[JAVA] 2-2. 기본형과 참조형 - 멤버 변수, 지역 변수와 초기화 (0) | 2024.06.28 |
[JAVA] 1. 클래스와 데이터 (0) | 2024.06.26 |