Call By Value와 Call By Reference

Lys·2023년 9월 8일

개발상식

목록 보기
8/15

메서드를 호출할 때 파라미터를 전달하는 방법

  • Call by value

  • Call by reference

Java 는 오직 Call by Value 로만 동작한다.
Java 에서 변수를 선언하면 Stack 영역에 할당됩니다.
원시 타입 (Primitive Type) 은 Stack 영역에 변수와 함께 저장되며
참조 타입 (Reference Type) 객체는 Heap 영역에 저장되고 Stack 영역에 있는 변수가 객체의 주소값을 갖고 있습니다.

  • 원시타입이란?

    • 정수,실수,문자,논리 리터럴 등 실제 데이터 값을 저장하는 타입으로 불변성을 가지고 있다.
  • 참조타입이란?

    • 원시타입을 제외 한 나머지 배열,객체,함수,클래스,인터페이스 등을 참조타입이라고 한다. 변수의 크기가 동적으로 변하기 때문에 데이터 자체가 별도의(Heap) 메모리 공간에 저장되며 그 주소를 가지고 변수의 값에 접근할 수 있다.

Call by value

  • 값에 의한 호출
  • 메서드를 호출할 때 값만을 전달하기 때문에 수신자의 파라미터를 수정해도 호출자의 변수에는 아무런 영향이 없다.
  • 메서드를 호출 할 때 값을 넘겨주기 때문에 Pass by Value라고도 부른다.
  • 장점 : 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존이 된다.
  • 단점 : 복사를 하기 때문에 메모리가 사용량이 늘어난다.
public class CallbyValue { 
	public static void change(int x, int y) { 
    	x = 3; 
        y = 4; 
    } 
    
    public static void main(String [] args) { 
    	int a = 1;
        int b = 2; 
        System.out.println("a = " + a + ", b = " +b);  
        
        change(a,b); 
        System.out.println("a = " + a + ", b = " +b); 
    } 
}
//코드 결과 - 바뀌지 않음
a = 1, b = 2
a = 1, b = 2

Call by reference

  • 참조에 의한 호출이기 때문에 변수와 수신자의 파라미터는 완전히 동일한 변수이다.
  • 메서드 내에서 파라미터를 수정하면 그대로 원본 변수에도 반영된다.
  • Pass By Reference라고도 부른다.
  • 장점 : 복사하지 않고 직접 참조를 하기에 빠르다.
  • 단점 : 직접 참조를 하기에 원래 값이 영향을 받는다.
public class CallbyReference { 

	public static void change(Test test) { 
    	test.value = 10; 
	} 
    
    public static void main(String [] args ) { 
    	Test test = new Test(); 
		System.out.println("test's value : "+test.value); 
        
        change(test); 
        System.out.println("test's value : "+test.value); 
	} 
}
//코드 결과 - 바뀜
test's value : 0 
test's value : 10
  • Call by value와 Call by reference의 차이로는
    값을 복사해서 처리하는지(call by value) 직접 참조를(call by reference) 하는지의 차이이다.



🙇‍♀️참고 사이트🙇‍♀️

https://bcp0109.tistory.com/360
https://sudo-minz.tistory.com/91
https://devlog-wjdrbs96.tistory.com/44
https://velog.io/@sinclebear/Javascript-Call-by-Value-vs.-Call-by-Reference-%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%AC-vs.-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%AC
https://jminc00.tistory.com/8

0개의 댓글