함수(메소드)의 (인자)호출 방식은 

Call by value

Call by reference

두 개가 있다. 말그대로 '값에 의한 호출' , '참조에 의한 호출' 이다. 

기본 타입이 인자로 전달되는 경우

byte, char, int double 등 자바의 기본 타입이 인자로 전달되는 경우에는 호출자가 건네는 인자의 값을 복사하여 메소드의 인자에 전달한다. 

public class Test {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int num1 = 10, num2 = 20;
		
		System.out.println("num1 = " + num1);
		System.out.println("num2 = " + num2);
		swap(num1, num2);
		System.out.println("swap");
		System.out.println("num1 = " + num1);
		System.out.println("num2 = " + num2);
	}
	
	static void swap(int num1, int num2) {
		int temp;	
		temp = num1;
		num1 = num2;
		num2 = temp;
	}
}

결과는

num1 = 10
num2 = 20
swap
num1 = 10
num2 = 20

메소드 swap을 썻음에도 불구하고 num1,2값은 변화가 없다. 메소드 안에서 위치를 바꾼다고 해서 원본 데이터가 바뀌는 것이 아니라는 것을 알 수 있다. 위 코드 메소드 내에서 두 수를 바꾸는 것은 단지 복사된 값을 바꾸는 것이다. 따라서 자바는 기본 데이터 타입이 인자로 전달되는 경우는 Call by value(값에 의한 호출)로 처리된다.

Call by value(값에 의한 호출)

Call by value(값에 의한 호출)는 메소드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값을 복사하여 보낸다.

객체 레퍼런스가 인자로 전달되는 경우

메소드 인자로 객체에 대한 레퍼런스가 전달되는 경우 객체가 통으로 전달되는 것이 아니고 레퍼런스 값만 복사되어 전달된다. 이런 경우는 커스텀 클래스를 사용한다.

public class Test {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		NumberClass num1 = new NumberClass(10);
		NumberClass num2 = new NumberClass(20);
		
		System.out.println("num1 = " + num1.num);
		System.out.println("num2 = " + num2.num);
		swap(num1, num2);
		System.out.println("swap");
		System.out.println("num1 = " + num1.num);
		System.out.println("num2 = " + num2.num);
	}
	
    
	static void swap(NumberClass num1, NumberClass num2) {
		int temp;	
		temp = num1.num;
		num1.num = num2.num;
		num2.num = temp;
	}
}

class NumberClass {
	int num;
	
	NumberClass (int num) {
		this.num = num;
	}
}

결과는

num1 = 10
num2 = 20
swap
num1 = 20
num2 = 10

위 코드에서는 참조값을 직접 바꾼것이 아니라 객체의 참조값을 통해 그 객체의 멤버변수에 접근해 값을 바꾼것이다. 힙영역에서 참조 되어지는 값 자체를 바꾸어 call by reference 처럼 보이게 한것이다. 중요한 것은 자바에서 메소드 호출 시 객체가 전달되는 경우 객체에 대한 레퍼런스만 복사되지 객체가 통째로 복사되지 않는다는점이다.

Call by reference(참조에 의한 호출)

Call by reference(참조에 의한 호출)는 메소드 호출 시 사용되는 인자 값의 메모리에 저장되어 있는 주소를 복사해 보낸다.

배열이 인자로 전달되는경우

배열이 메소드의 인자로 전달되는 경우도 객체 레퍼런스가 인자로 전달되는 경우와 동일하다. 배열이 통째로 전달되는 것이 아니라 배열에 대한 레퍼런스만 전달된다.

 

결론은 자바는 기본형 타입 변수와 참조형 타입 변수 둘 다 Call by value 방식으로 받는다. 하지만 기본형 타입은 그 값을 복사해서 넘겨주지만 참조형 타입은 레퍼런스를 복사해서 넘겨주는 차이가있다.

+ Recent posts