📘 1. 기본자료형과 참조자료형의 차이점
int a = 10; // 기본자료형
int b = a; // 값 자체가 복사됨
b = 20;
System.out.println(a); // 10 (영향 없음)
class MyData {
int value;
}
MyData d1 = new MyData();
d1.value = 10;
MyData d2 = d1; // 참조자료형: 주소값 복사
d2.value = 20;
System.out.println(d1.value); // 20 (같은 객체를 가리킴)
✅ 요약
기본자료형: 값을 직접 저장하고 복사 → 값만 전달
참조자료형: 객체의 주소를 저장 → 주소를 공유, 같은 객체를 가리킴
참조자료형은 값이 아닌 주소를 공유하기 때문에 하나를 수정하면 다른 변수에도 영향
📘 2. 기본형 매개변수는 값이 전달된다 (값에 의한 호출)
public class Test {
public static void change(int x) {
x = 100;
}
public static void main(String[] args) {
int num = 50;
change(num);
System.out.println(num); // 50 (변하지 않음)
}
}
✅ 요약
매개변수가 **기본자료형(int, double, char 등)**이면 값만 전달
메서드 안에서 값을 변경해도 원본에는 영향 없음
이를 값에 의한 호출 (Call by Value) 이라고 부름
📘 3. 참조변수를 선언만 하고 객체를 생성하지 않으면 에러 발생
class Person {
String name;
}
public class Test {
public static void main(String[] args) {
Person p; // 참조변수만 선언
// p.name = "홍길동"; // ❌ 컴파일 에러 (NullPointerException 발생 가능)
}
}
✅ 요약
참조변수만 선언하고 객체 생성 없이 접근하면 컴파일 에러 또는 런타임 에러
객체 주소가 없기 때문에 내부 멤버나 메서드에 접근할 수 없음
반드시 new 키워드로 객체 생성 후 사용해야 함
p = new Person();
p.name = "홍길동"; // ✅ 정상 접근 가능
📘 4. 배열은 참조형 매개변수 → 주소값 공유
public class Test {
public static void change(int[] arr) {
arr[0] = 999;
}
public static void main(String[] args) {
int[] nums = {1, 2, 3};
change(nums);
System.out.println(nums[0]); // 999 (변경됨)
}
}
✅ 요약
배열은 참조형 자료형이므로, 배열을 매개변수로 전달하면 주소값이 전달
메서드 내부에서 배열을 수정하면 원본 배열도 함께 수정
참조형 매개변수이므로 배열 원소값 공유 가능