240411 TIL #370 Call By Value / Call By Reference

김춘복·2024년 4월 10일
0

TIL : Today I Learned

목록 보기
370/543
post-custom-banner

Today I Learned

면접 대비용 cs 복습 시작!


함수 호출 방법

1. Call By Value

  • 함수 호출 시 전달되는 변수의 을 복사한다.

  • 인자의 값이 변경되어도 원본 값이 변하지 않아 안전하다.

  • 메모리의 사용량이 늘어난다.

  • 아래의 코드에서처럼 함수 내에선 6으로 증가하지만 호출한쪽의 변수 num의 값은 변경되지 않는다.

public class CallByValueExample {
    public static void main(String[] args) {
        int num = 5;
        System.out.println("함수 호출 전: " + num);
        increment(num);
        System.out.println("함수 호출 후: " + num);
    }

    public static void increment(int x) {
        x++;
        System.out.println("함수 내부: " + x);
    }
}

/* 출력
함수 호출 전: 5
함수 내부: 6
함수 호출 후: 5
*/

2. Call By Reference

  • 함수 호출 시 인자로 받은 값의 메모리 주소를 참조한다.

  • 복사하지 않고 직접 참조를 하기 때문에 빠르다.

  • 함수 내에서 인자의 값을 변경하면 원본 변수도 영향을 받는다.

  • 아래의 코드에서 함수내에서 list에 원소를 추가하면 호출한 측의 list도 같이 변경된다. 리스트가 참조로 전달됐기 때문이다.

import java.util.ArrayList;

public class CallByReferenceExample {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        System.out.println("함수 호출 전: " + list);
        modifyList(list);
        System.out.println("함수 호출 후: " + list);
    }

    public static void modifyList(ArrayList<Integer> list) {
        list.add(4);
        System.out.println("함수 내부: " + list);
    }
}

/* 출력
함수 호출 전: [1, 2, 3]
함수 내부: [1, 2, 3, 4]
함수 호출 후: [1, 2, 3, 4]
*/

in Java

  • 자바에서는 기본적으로 call by value로 동작한다.
    엄밀하게 따지면 자바에서는 모든 것이 call by value다.
    기본형은 값 자체가 복사되어 전달되고, 참조형은 메모리 주소가 value기 때문에 주소값이 복사되어 전달된다.

  • 메서드에서 인자 값을 변경하더라도 원래의 변수 값에는 영향을 미치지 않는다.

  • 전달한 참조 값을 통해서 객체의 필드를 변경하면 원래의 객체도 영향을 받는다.
    하지만 메소드 내에서 참조 자체를 변경하는 것은 원래의 참조에 영향을 끼치지 않는다.(메모리 주소 자체를 바꿀 수는 없다.)

  • 따라서 자바에서는 Call By Reference를 완전히 지원하는 것이 아니라 call by value 방식으로 참조를 전달하는 것이다.

profile
Backend Dev / Data Engineer
post-custom-banner

0개의 댓글