반응형
- 함수는 입력받은 값을 가공하여 반환해줍니다. (반환을 하지 않을 수도 있음 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, 즉 불변객체이기 때문에 불가능합니다.
반응형
'Java & Spring' 카테고리의 다른 글
Java 큰 수의 표현 BigInteger 와 BigDecimal (0) | 2021.11.01 |
---|---|
Java NumberFormatException 에 대처하는 우리들의 자세 (0) | 2021.10.27 |
Java 정규표현식 - 2. 문자열에서 숫자 등 추출하기 (0) | 2021.10.25 |
Java 정규표현식 (regular expression) - 1. 개요 (0) | 2021.10.25 |
Java 문자열 빈 값 vs 공백 vs null 비교 (0) | 2021.10.23 |
댓글