본문 바로가기
Java | spring/Java Basic

call by value 값호출 VS 참조 호출 call by reference

by 워니 wony 2019. 5. 7.

둘다 메소드에서 변수를 호출 하는 경우에 이야기 하는

 

 

call by value( 호출)

  • 기본 자료형(char, byte, short, int, long, float, double, boolean)
  • 값에 의한 호출은 기본자료형을 이야기한다.(8가지)
  • 값을 복사해와서 메소드에서 변경하는 것이기 때문에 기존 변수의 값이 변경 되지 않는다.
  • 그렇기 때문에 변경된 값이 필요한 경우 메소드 실행 것은 같은 자료형의 변수에 담아서 사용하면 된다.
  •  메소드 호출시에 기본자료형이 전달되는 경우를 값에 의한 초출이라고 하고, 메소드 안에서 내용이 변경되더라도 호출한 쪽에 적용되지 않는다.
class Exam
{
	public void plusOne(int a)
	{
		a++;
		System.out.println("a : "+a);
	}
}

class CallbyValueTest 
{
	public static void main(String[] args) 
	{
		Exam e = new Exam();
		
		int n = 5;
		e.plusOne(n);
		System.out.println(n);
	}
}

 

 

call by reference(참조호출)

  • 메서드를 호출 참조변수가 기억하고 있는 주소가 그대로 메소드에게 복사된다. 그래서 메소드와 실제 참조변수가 같은 주소를 가지고 있다. 그렇기 때문에 복사된 주소를 가지고 있더라도 실제 바라보는 메모리가 동일하기 때문에 메소드에서 해당 값을 수정하면, 실제 참조변수가 바라보고 있던 값이 수정되는 것이기 때문에 직접적인 영향을 받는다.
  • 쉽게 말해서 매개변수로 참조자료형을 전달하면 참조값을 전달하게 되기 때문에 메소드 안에서 내용이 변경되면 호출한 쪽에서 변경된 내용이 적용된다.
  • 참조자료형(배열/객체 class)
import java.util.Arrays;
class Exam
{
	public void plusOne(int[] n)
	{
		n[1] = 100;
		System.out.println(n[1]);
	}
}

class CallbyReferenceTest01
{
	public static void main(String[] args) 
	{
		int []a = {1,2,3,4,5};
		
		Exam e = new Exam();

		e.plusOne(a);
		System.out.println(a[1]);
	}
}

 

 

 

[참고] Varargs(Variable Arguments)

새롭게 추가된 기능, 메서드 호출 메서드에 정해 놓은 인자의 수가 다르면 함수를 호출할 오류가 발생했다.

메서드를 호출하는데 있어 인자의 수가 정해져 있지 않고 가변적 인자를 제공하는 인자 전달 방식

 

public void argTest(String ...n);

 

반응형

댓글