java

java는 call by reference 일까 call by value 일까?

malangcow 2022. 7. 13.

처음 파라미터에 전달에 대해서 알게될 때는 call by reference는 주소값을 전달하는 것이고

call by value는 값만 전달하여 파라미터로 전달 받으면 값을 수정해도

호출한 메소드에서는 영향이 없는 것으로 어렴풋이 알고 있었어서 헷갈렸다.

 

자바는 알다시피 primitive type이 아닌 reference type의 데이터를 보낼 때는 주소값을 전달해서 전달한 데이터의 주소값에 접근하면 얼마든지 수정이 가능하다.

 

그럼 자바는 call by reference도 되는거 아닌가? 라고 헷갈릴 수 있다.

 

그럼 reference는 뭐고 value는 뭘까?

  • reference : 참조,참조자 라는 의미이고 말 그대로 변수를 참조하는 녀석이고, 변수에 별명을 붙인다고 표현한다.
  • value는    : 말그대로 데이터 값이고 참조 타입의 경우는 주소 값이 되겠다.

 

자바에서 객체를 선언할 때로 보면

 

Member member = new Member();

member는 reference이고 new Member()가 value가 되는 것이다.

new 키워드로 Member객체가 메모리에 올라가고 그 주소값을 반환할 것이다.

 

 

자바에서 함수에 매개변수를 전달해보자.

 

    public static void function(Member member) {
    	System.out.println(member.name);   // 멤버 출력
        member = new Member("새멤버");
    }

    public static void main(String[] args) throws IOException {
        Member member = new Member("멤버");
        function(member);
        System.out.println(member.name); // 멤버 출력
    }

function 파라미터로 member 객체의 주소값을 전달해서 main함수에서 생성된 객체에 접근해 원래 값이 출력된다.

하지만 member reference에 다른 value를 할당해도 main함수에 member reference에는 영향이 없다.

두 함수는 서로 다른 reference를 사용중인거고 자바는 결국 call by value라는 걸 알 수 있다.

 

c나 c++의 경우 call by reference를 사용할 수 있다.

 

C++의 경우

기본적으론 call by value이나, &키워드로 reference를 전달할 수 있다.

 

void function(Member &member){
    cout << member.name; 	// 멤버 출력
    
    Member newMember;
    newMember.name = "새멤버";
    
    member = newMember;
}

int main()
{
    Member member;
    member.name = "멤버";
    
    function(member);
    
    cout << member.name; 	// 새멤버 출력

    return 0;
}

function에서 member에 새 객체를 할당하니 호출함수인 main에서 member reference의 값이 변경된 걸 볼 수 있다.

 

 

장단점?

Call by value

  • 장점 : 값을 복사하여 전달하기 때문에 값에 변경에 대해 안전하다.
  • 단점 : 복사를 하기 때문에 메모리가 사용량이 늘어난다.

Call by reference

  • 장점 : 복사하지 않고 직접 참조를 하기 때문에 더 빠르다.
  • 단점 : 직접 참조를 하기 때문에 값 변경에 위험성이 있다.

'java' 카테고리의 다른 글

Optional의 올바른 사용 방법  (0) 2022.07.25

댓글