CS/면접

Call By Value와 Call By Reference

태태코 2025. 9. 1. 17:34
반응형

Call By Value와 Call By Reference

 

특정 메서드를 호출하는 경우 인자로 전달하는 방법은 값에 의한 호출( Call BY Value )  참조에 의한 호출( Call by Reference )이 있다.

 

 

값에 의한 호출( Call BY Value) 

메서드를 호출할 때 값자체를 넘기는 방식이다. 호출하는 함수의 변수와 호출된 함수의 파라미터는 다른 변수이다.

 

참조의 의한 호출( Call by Reference

메서드를 호출할 때, 참조를 직접전달하는 방식이다.  참조값을 직접 전달하기 때문에 호출하는 함수의 변수와 호출된 함수의 파라미터는 동일한 변수이다.

 

 

자바는 어떤 방식을 채택하는가?

 

자바는 값에 의한 호출만 존재한다.

 

자바의 변수는 스택영역에 할당된다.

변수의 타입이 원시타입일 경우에는 값 또한 스택영역에 저장되고, 참조 타입인 경우에는 힙영역에 저장되고, 스택 영역에 존재하는 변수가 객체의 주소를 가지고 있다.

 

참조 타입의 변수를 인자로 전달하여 호출하는 경우에는 원본이 수정될 수 있다.

호출된 메서드의 스택 프레임에 참조 타입 변수를 중복하여 생성하기 때문에 값에 의한 호출로 판단된다. 

 

즉 값을 넘기기는 하는데 주소값이 같아서 값에 의한 호출이라고 보는 것이다.

public void h1(){
 Hello hello = new Hello();
 h2(student);
}

public void h2(Hello hello){
 hello.hi();

}

 

 

 

즉 자바가 call by value인 이유는

 

참조값을 보냈을 경우 재할당시 원본이 바뀌냐의 여부이다.

 

 

class Box {
    int v;
    Box(int v) { this.v = v; }
}

public class Demo {
    static void mutate(Box b) { // 참조값의 '복사본'을 받음
        b.v = 99;               // 같은 객체의 필드 변경 → 호출자도 보임
    }

    public static void main(String[] args) {
        Box b = new Box(1);
        mutate(b);
        System.out.println(b.v); // 99
    }
}



class Box {
    int v;
    Box(int v) { this.v = v; }
}

public class Demo {
    static void reassign(Box b) { // 참조값의 '복사본'을 받음
        b = new Box(123);         // 파라미터 변수만 새 객체로 바뀜
    }

    public static void main(String[] args) {
        Box b = new Box(1);
        reassign(b);
        System.out.println(b.v); // 1 (여전히 원래 객체)
    }
}

 

즉 재할당이 안되기때문에 call by value인것이다.

반응형

'CS > 면접' 카테고리의 다른 글

URI URL URN차이  (0) 2025.09.05
해시 충돌  (0) 2025.09.04
교착상태  (1) 2025.08.29
태태코딩 - 시스템 간의 비동기 연동방식(백엔드 질문)  (6) 2025.08.25
캐시 스템피드  (1) 2025.08.22