IT

Call by value?? Call by reference?? 알아보자

hoonylab 2025. 4. 9. 17:38
728x90
반응형

📌 Call by Value vs Call by Reference

프로그래밍 언어에서 함수나 메서드에 인자를 전달할 때, 그 방식은 크게 두 가지로 나뉩니다.

✅ Call by Value (값에 의한 호출)

  • 값 자체를 복사해서 전달
  • 함수 내부에서 매개변수의 값을 변경해도, 원본 값에는 영향이 없음
Call by Value 이미지

public class Example {
    public static void changeValue(int x) {
        x = 100;
    }

    public static void main(String[] args) {
        int num = 50;
        changeValue(num);
        System.out.println(num); // 👉 출력: 50
    }
}

설명: num50이라는 값을 가지고 있고, changeValue(num) 호출 시 50이라는 값이 복사되어 전달됩니다. 따라서 x를 100으로 바꿔도, num에는 영향이 없습니다.


✅ Call by Reference (참조에 의한 호출)

  • 참조(주소)를 전달
  • 함수 내부에서 매개변수로 전달된 객체를 변경하면, 원본 객체도 변경됨
Call by Reference 이미지

class Person {
    String name;
    Person(String name) {
        this.name = name;
    }
}

public class Example {
    public static void changeName(Person p) {
        p.name = "Chris";
    }

    public static void main(String[] args) {
        Person person = new Person("Alex");
        changeName(person);
        System.out.println(person.name); // 👉 출력: Chris
    }
}

설명: Person 객체는 참조형이기 때문에, 함수로 전달될 때 주소값이 전달됩니다. 함수 안에서 name을 바꾸면 원본 객체에도 영향을 줍니다.


🚀 Java는 Call by Value? Call by Reference?

많은 사람들이 Java는 Call by Reference라고 생각하지만, 정확히는 Java는 오직 Call by Value만 지원합니다.

📌 "값"이 객체의 참조 주소일 뿐인 경우, 그 참조값이 복사되어 전달되므로 마치 Call by Reference처럼 보일 수 있습니다.
  • 기본형 변수: 값이 복사됨 → 함수 내 변경 불가능
  • 참조형 변수: 참조값이 복사됨 → 객체의 내부 상태는 변경 가능
Java에서 참조 전달 설명 이미지

🌱 스프링(Spring)에서는 어떻게 동작할까?

Spring은 Java 기반이기 때문에 동일하게 Call by Value 방식으로 동작합니다.

예시 (Spring Service)


@Service
public class UserService {
    public void updateUser(User user) {
        user.setName("Updated Name");
    }
}

@RestController
@RequiredArgsConstructor
public class UserController {
    private final UserService userService;

    @PostMapping("/update")
    public String update() {
        User user = new User("Original Name");
        userService.updateUser(user);
        return user.getName(); // 👉 출력: Updated Name
    }
}

설명: User 객체는 참조형이고, 그 참조값이 복사되어 전달되므로 updateUser 내부에서 이름을 바꾸면 원본 객체에도 영향을 줍니다.


🔍 정리

구분 설명 Java 기본형 Java 참조형
Call by Value 값 복사 ✔️ 변경 불가 ✔️ 참조값 복사됨
Call by Reference 주소 전달 ❌ (Java 미지원) ❌ 직접 주소 전달 아님
728x90
반응형