개발_웹/Java

Java | Java에서 Swap 함수 구현 (Java의 call-by-reference)

zuyo 2021. 2. 17. 01:45
반응형

Call-by-Value Call-by-Reference

 

1. call-by-value

 

메소드의 파라미터로 호출자(caller)가 제공한 값을 전달하는 방식입니다.

 

파라미터 값이 복사되어 전달되므로, 호출자의 값은 수정되지 않습니다.

 

자바는 call-by-value 방식을 따릅니다.

 

 

2. call-by-reference

 

메소드의 파라미터로 호출자(caller)가 제공한 값의 위치를 전달하는 방식입니다.

 

파라미터로 값의 참조가 전달되므로, 호출자의 값이 수정될 수 있습니다.

 

 

 


포인터가 없는 Java에서 Swap 함수를 구현하기

 

Java는 항상 call-by-value 를 사용한다. 메소드는 파라미터로 전달된 기본자료형의 값을 변경할 수 없다. C와는 다르게 포인터를 쓸 수 없었기 때문에 Java를 처음 공부할 땐 두 값을 서로 바꾸는 Swap 함수를 구현하기가 쉽지 않았다

 

그러나 파라미터로 전달된 객체의 필드값이나 배열의 요소들은 call-by-reference이기 때문에 값 변경이 가능하다.

 

1. 배열 레퍼런스 이용한 방법

public class Swap {
    public static void swap(int[] arr) {
        int temp = arr[0];
        arr[0] = arr[1];
        arr[1] = temp;
    }

    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int[] arr = {a, b};

        swap(arr);

        System.out.println(arr[0] + " " + arr[1]);
    }
}


2.
연산 우선순위를 이용한 방법

public class Swap2 {
    private static Integer trickSwap(Integer original, Integer willBeChanged) {
    	return original;
    }
    public static void main(String args[]) {
        Integer a = new Integer(10);
        Integer b = new Integer(20);

        // 호출 시 전달인자에서 a = b, 바뀌기 전의 a를 반환하므로 b = a
        b = trickSwap(a, a = b);

        System.out.println(a + " " + b);
    }
}

 

반응형