프로그래밍 call by reference 질문입니다.

알림
|
X

페이지 정보

작성자 pinn 1.♡.18.2
작성일 2024.11.01 16:21
73 조회
0 추천
글쓰기

본문

public class Test {

    public static void main(String[] args) {

        Student s = new Student();

        s.name = "홍길동";

        m1(ref s);

        System.out.println(s.name); 

    }

    private static void m1(ref Student s) {

        s = new Student(); //***

        s.name = "아무개";

    }

}


class Student {

    public String name;

}


[상황]
위의 코드는 C#입니다.(C++ 동일)

- main에서 생성한 객체(s)를 m1 호출 시 매개변수로 전달했습니다.

- m1 내부에서 전달 받은 매개변수에 새로운 객체를 할당했습니다.(*** 친 주석 라인)

- m1 종료 후 main에서 s.name을 출력하면 당연히 "아무개"가 출력됩니다.


[질문]

그런데 main의 s와 m1의 매개변수 s는 같은 메모리 주소를 참조하고는 있지만 서로 다른 스택에 만들어진 서로 독립된 지역변수인데  m1의 s가 새로운 주소가 할당되면 어떻게 main의 s도 같은 주소로 동기화가 되는걸까요?

분명 물리적으로 main의 s와 m1의 매개변수 s는 다른 변수이지요?

자동으로 둘을 동기화하는 장치가 있는걸까요? 아니면 컴파일러가 관련 코드를 생성하는 걸까요? 둘 다 아닌거 같아서 질문합니다.

검색해도 그냥 같은 주소값을 참조한다.. 정도의 자료밖에 안나오네요.

하지만 질문은 매개변수의 주소가 바뀌면 어떤 기전으로 두 변수가 동기화가 되는지가 궁금합니다.


댓글 4 / 1 페이지

널문자님의 댓글

작성자 널문자 (121.♡.67.234)
작성일 17:11
s 라는 변수가 main에서 선언되면
메모리의 특정 위치(Memory Address)에 변수가 저장됩니다.
스택이거나 아니거나 관계없습니다.

m1을 호출할때 s라는 변수의 위치(Memory Address)를 전달합니다.
즉, m1에서 선언된 s 라는 변수에는 main 에서 선언된 s라는 변수가 저장된 위치가 들어있습니다.

m1에서 s 값을 바꿀때는 m1에서 선언된 s 라는 변수에 저장된
메모리의 위치 (Memory Address)가 가리키는 곳을 찾아서 그 값을 바꿉니다.
main의 스택과 m1의 스택은 다르지만,
m1에서 main의 스택에 저장된 s의 위치(Memory Address)를 전달 받았기 때문에 가능한것입니다.
따라서 원래 main에서 선언된 s에 저장된 값을 직접 바꾸는 것이므로 변수값 동기화 라는건 필요하지 않습니다.

값을 전달하는게 아니라 값이 저장된 위치를 전달하기 때문에 call by reference 라고 합니다.
설명하신 내용 처럼 변수값이 복사되어 전달하는 방식은 call by value 가 됩니다.

pinn님의 댓글의 댓글

대댓글 작성자 pinn (1.♡.18.2)
작성일 17:29
@널문자님에게 답글 아 물리적으로 main의 s와 m1의 s가 같은 주소값을 저장하고 있는게 아니지요?
m1의 s가 main의 s를 직접 참조하는 관계인거네요.
Alias 개념에 가까운거라고 봐도 될까요?

"값을 전달하는게 아니라 값이 저장된 위치를 전달하기 때문에 call by reference 라고 합니다."
- 결국 m1의 s는 main의 Student 객체 주소가 아닌 main의 s 변수 주소 자체를 전달 받았군요.

추측해봤던 구조이긴 한데 자료를 찾을 수 가 없었습니다;;
답변 감사합니다.

널문자님의 댓글의 댓글

대댓글 작성자 널문자 (121.♡.67.234)
작성일 17:35
@pinn님에게 답글 네, main의 s와 m1의 s는 저장된 위치가 다릅니다.

main의 s에는 스트링 값이 저장되어있고,
m1의 s에는 main에서 선언된 s 의 물리적인 주소값이 들어있습니다.

정확하게 추측 하셨네요..

pinn님의 댓글의 댓글

대댓글 작성자 pinn (1.♡.18.2)
작성일 17:48
@널문자님에게 답글 넵 감사합니다~
글쓰기
홈으로 전체메뉴 마이메뉴 새글/새댓글
전체 검색