본문 바로가기
Java & Spring

Java 에서 swap 하는 방법

by softserve 2021. 10. 27.
반응형
  • 함수는 입력받은 값을 가공하여 반환해줍니다. (반환을 하지 않을 수도 있음 ft. void)
  • 함수가 내부에서 사용하는 변수는 지역변수 local variable 이기 때문에 그 값을 변경하더라도 함수가 종료되면서 함께 소멸됩니다.
  • 함수호출시 값을 함수에게 전달하는 방법은 두 가지가 있습니다.
  • Call by value는 값 자체 또는 변수에 담긴 값을 복사하여 매개변수로 전달합니다.
  • Call by reference는 값이 저장된 메모리 공간의 주소를 전달하여, 함수가 그 공간을 참조할 수 있게 해 줍니다.
  • Java에는 포인터가 없고, 기본적으로 call by value 이기 때문에 c언어에서는 간단히 만들 수 있는 swap을 구현하려면 짱구를 좀 굴려야 합니다.

1. 배열 이용하기

Integer[] arr = {1,2,3,4,5};

swap(arr, 0, 4);

private static <T> void swap(T[] a, int f, int r) {
	T temp;
    temp = a[f];
    a[f] = a[r];
    a[r] = temp;
}

배열과 인덱스를 인자로 넘겨주는 방법입니다.

 

 arr  에는 배열 그 자체가 아닌, 배열의 첫 번째 원소가 저장된 메모리 공간의 주소가 담겨 있습니다.

 

따라서  swap  메서드 내에서  a[f] = a[r]  같은 연산을 수행하면 실제 배열의 값이 변경되게 됩니다.

 

위 예제는  arr 의 첫 번째 원소와 마지막 원소를 서로 교환하는 것으로 결과는 다음과 같습니다.

{5, 2, 3, 4, 1}

 

2. 객체 이용하기

public class Main{
	int value;
	
	public static void main(String[] args){
		
		Main m1 = new Main(10);
		Main m2 = new Main(20);
		
		System.out.println(m1.value + " " + m2.value);
		
		swap2(m1,m2);
		
		System.out.println(m1.value + " " + m2.value);
		
	}
	
	public Main(int a) {
		this.value = a;
	}
	
	private static void swap2(Main a, Main b) {
		int temp;
	    temp = a.value;
	    a.value = b.value;
	    b.value = temp;
		
	}
}

객체를 전달, 교환하는 방법입니다.

 

객체 역시 객체가 담긴 메모리의 주소를 가지고 있고 아래에서 그 값을 확인할 수 있습니다.

System.out.println(System.identityHashCode(m1));

따라서 만약

m1 = m2;

를 수행할 경우  m1 은  m2 가 가리키는 객체와 동일한 객체를 가리키게 됩니다.

당연하게도  m1.value 를 출력하면 20이 찍히는 걸 확인할 수 있습니다.

 

 

3. 가장 간편한 꼼수

 

private static int swap3(int localA, int localB) {
	return localA;
		
}

int a = 10, b = 20;

b = swap3(a, a = b);

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

①   swap3  가 호출되면 a 에 담긴 값 '10' 을 localA에 복사합니다.

 

② 다음으로  a = b  대입연산을 수행합니다. a에는 '20'이 저장됩니다.

 

③ 그리고 그 '20'을 localB에 복사합니다.

 

④ 마지막으로 localA에 저장된 '10'을 반환하고, 그 값은 b에 저장됩니다.

 

20 10

 

* 한편, String도 참조형 변수이니 메서드에서 참조 및 수정을 할 수 있어야 하는 것 아닌가 하는 의문이 들 수 있지만

String은 immutable, 즉 불변객체이기 때문에 불가능합니다.

반응형

댓글