자바에서 변수 대입과 메서드 호출은 기본형(Primitive Type)과 참조형(Reference Type)의 동작이 다르다. 기본형은 값을 직접 저장하고, 참조형은 객체의 메모리 주소를 저장하는 특성이 있기 때문이다.
기본형 변수를 대입하면 값 자체가 복사되어 대입된다. 이는 대입 후 두 변수가 독립적으로 값을 유지한다는 뜻이다.
public class Main {
public static void main(String[] args) {
int x = 10; // x에 10을 할당
int y = x; // x의 값(10)을 y에 복사
System.out.println("초기 값: x = " + x + ", y = " + y); // x = 10, y = 10
// x의 값을 20으로 변경
x = 20;
System.out.println("값 변경 후: x = " + x + ", y = " + y); // x = 20, y = 10
}
}

참조형 변수를 대입하면 객체의 참조값(메모리 주소)이 복사된다. 따라서 두 변수는 같은 객체를 가리키며, 한 변수를 통해 객체의 값을 변경하면 다른 변수도 그 변화를 공유한다.
public class Main {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = c1; // c1의 참조값이 c2로 복사됨
c1.speed = 100;
System.out.println(c1.speed); // 출력: 100
System.out.println(c2.speed); // 출력: 100
}
// static으로 선언된 내부 클래스
static class Car {
int speed;
}
}

참조형 변수는 같은 객체를 공유하게 된다.
기본형을 메서드에 전달하면, 값이 복사되어 전달된다. 메서드 내에서 값을 변경해도, 호출자의 변수는 영향을 받지 않는다.
public class Main {
public static void main(String[] args) {
int num = 10;
changeValue(num);
System.out.println(num); // 출력: 10
}
static void changeValue(int x) {
x = 20;
}
}

메서드 내부에서 x의 값이 20으로 바뀌었지만, 원래 변수 num은 그대로 10을 유지한다.
이는 값 자체가 복사되어 전달되기 때문이다.
참조형을 메서드에 전달하면, 참조값이 복사되어 전달된다. 메서드 내에서 객체의 값을 변경하면, 호출자의 객체에도 그 변화가 반영된다.
class Car {
int speed; // 자동차의 속도를 저장하는 필드
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car(); // Car 객체 생성
myCar.speed = 50; // 초기 속도를 50으로 설정
changeSpeed(myCar); // myCar의 속도를 변경하는 메서드 호출
System.out.println(myCar.speed); // 출력: 100
}
static void changeSpeed(Car car) {
car.speed = 100; // 참조형 객체의 필드 값을 변경
}
}



이 경우, myCar의 참조값이 메서드에 전달되어 메서드 내에서 speed 값이 변경되면, 호출자의 객체에도 그 값이 반영된다.
기본형은 값 자체가 복사되어 전달되기 때문에, 메서드 내에서 값이 변경되어도 원래 변수에는 영향을 미치지 않는다.
참조형은 참조값이 복사되어 전달되기 때문에, 메서드 내에서 객체의 값이 변경되면 호출한 쪽의 객체에도 그 값이 반영된다.