1. 기본형, 참조형
- 기본형 (Primitive Type)
- 사용하는 값을 변수에 직접 넣음
- int, long, double, boolean 등
- 참조형 (Reference Type)
- 객체가 저장된 메모리의 위치를 가리키는 참조값(주소)를 넣음
- 클래스(객체), 배열, String
2. 기본형 vs 참조형
2-1. 전체적인 차이점
기본형 | 참조형 | |
이름 | 모두 소문자로 시작 (int, long, double … ) | 클래스는 대문자로 시작 (Student, Person … ) |
사용자 정의 | 사용자가 정의 불가 | 클래스만 직접 정의 가능 |
2-2. 차이점 - 변수 대입
📌 자바 대원칙
"자바는 항상 변수의 값을 복사해서 대입한다"
- 변수 대입
기본형 | 참조형 | |
변수 대입 | 변수에 들어있는 실제 값을 복사해서 대입 | 변수에 들어있는 참조값을 복사해서 대입 |
Student student1 = new Student();
student1.name = "학생1";
Student student2 = student1;
System.out.println("student1 참조값 = " + student1);
System.out.println("student2 참조값 = " + student2);
/* 실행결과
student1 참조값 = week2.ch2_3.Student@a09ee92
student2 참조값 = week2.ch2_3.Student@a09ee92
*/
📌 student1의 참조값을 복사해서 student2에 대입한 것을 확인!
- 데이터 변경
Student student1 = new Student();
student1.name = "학생1";
Student student2 = student1;
student1.name = "변경학생";
System.out.println("student1.name = " + student1.name);
System.out.println("student2.name = " + student2.name);
/* 실행결과
student1.name = 변경학생
student2.name = 변경학생
*/
📌 student1과 student2의 참조값이 동일하므로 name 필드가 동일하게 변경됨을 확인!
2-3. 차이점 - 메서드 호출
- 매개변수
- 매개변수 또한 변수일 뿐
- 따라서 메서드 호출 시 매개변수에 값을 전달하는 것도 값을 복사해서 전달하는 것!
- 기본형과 메서드 호출
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;
}
/* 실행결과
메서드 호출 전 : a = 10
메서드 호출 후 : a = 10
*/
=> 매개변수에 값 전달 : 값을 복사해서 대입함 ( int x = a 라고 생각 가능!)
- 참조형과 메서드 호출
public static void main(String[] args) {
Data dataA = new Data();
dataA.value = 10;
System.out.println("메서드 호출 전 : dataA.value = " + dataA.value);
changePrimitive(dataA);
System.out.println("메서드 호출 후 : dataA.value = " + dataA.value);
}
static void changePrimitive(Data dataX) {
dataX.value = 20;
}
/* 실행결과
메서드 호출 전 : dataA.value = 10
메서드 호출 후 : dataA.value = 20
*/
=> 매개변수에 값 전달 : 참조값을 복사해서 대입함 (dataX = x001(dataA의 참조값) 라고 생각 가능!)
자바에서 메서드의 매개변수 => 항상 값에 의해 전달됨!
값이 실제 값이냐, 참조값이냐에 따라 다름
- 기본형 : 매개변수에 실제 값이 복사되어 대입(전달)
⇒ 메서드 내부에서 매개변수 값을 변경해도 호출자의 값에는 영향 없음! - 참조형 : 매개변수에 참조값이 복사되어 대입(전달)
⇒ 메서드 내부에서 매개변수로 전달된 객체의 멤버변수 변경하면 호출자의 객체도 변경됨!
'Java' 카테고리의 다른 글
[Java] 생성자 (0) | 2024.07.08 |
---|---|
[Java] 객체 지향 프로그래밍 (Object-Oriented Programming, OOP) (0) | 2024.07.08 |
[Java] 클래스 (0) | 2024.07.08 |
[Java] StringBuilder 로 출력하여 시간초과 해결 (0) | 2023.12.12 |
[Java] 메서드 오버로딩, 메서드 오버라이딩 (Method Overloading, Method Overriding) (0) | 2023.12.10 |