티스토리 뷰

call by ..?? 

평가 전략(Evaluation Strategy)은 프로그래밍 언어에서 함수 호출의 아규먼트(argument)의 순서를 언제 결정하고 함수에 어떤 종류의 값을 통과시킬지 결정하는 것. 

 

(참고)

- 아규먼트란? 전달값, 전달인자, 여기서 int a, int b를 의미 

public void change(int a, int b){
	...
}

 

 

 

1. 값에 의한 호출(Call by value)

- 함수를 호출시 단순히 값을 전달하는 형태의 함수 호출

- JAVA의 경우 call by value 

  1. arguments로 이 넘어온다.
  2. 값이 넘어올 때 복사된 값이 넘어온다.
  3. caller(호출하는 녀석)가 인자를 복사해서 넘겨줬으므로 callee(호출당한 녀석)에서 변경하여도 caller는 영향을 받지 않는다.
  4. 원본의 내용을 함수 내부에서 변경하는 것이 불가능하다. 
public void change(int a, int b){
    System.out.println(System.identityHashCode(a)); // 969692468
    System.out.println(System.identityHashCode(b));  // 152018490
    a = 11;
    b = 12; 
    System.out.println(System.identityHashCode(a)); //398844024
    System.out.println(System.identityHashCode(b)); // 1006146619
    System.out.println(a); // 11
    System.out.println(b); // 12
}

public static void main(String[] args) {
    int a = 1;
    int b = 2;
    System.out.println(System.identityHashCode(a)); // 969692468
    System.out.println(System.identityHashCode(b)); // 152018490
    change(a,b);
    System.out.println(a); // 1
    System.out.println(b); // 2 
    return true;
}

 

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

- 메모리의 접근에 사용되는 주소값을 전달하는 형태의 함수 호출 

-  C++ 

  1. arguments로 **reference(값에 대한 참조 주소, 메모리 주소를 담고있는 변수)**를 넘겨준다.
  2. reference를 넘기다 보니 해당 reference가 가리기는 값을 복사하지는 않는다.
  3. caller(호출하는 녀석)가 인자를 복사해서 넘기지 않았으므로 callee(호출당한 녀석)에서 변경하면 caller는 영향을 받는다.
  4. 원본의 내용을 함수 내부에서 변경하는 것이 가능하다. 

 

 

3. Call by Object 

- Python

- Call by Value, Call by Reference가 아닌 Call by Object 즉,  객체 참조(Object Reference) 에 의한 호출을 의미한다. 

 

def change(a,b):
    a = 11
    b = 12
    print(f"a:{a}, b:{b}") #a:11, b:12
    print(f"a.id:{id(a)}, b.id:{id(b)}") #a.id:140316426895920, b.id:140316426895952

a = 1
b = 2
print(f"a.id:{id(a)}, b.id:{id(b)}") # a.id:140316426895600, b.id:140316426895632
change(a,b);

 

 

4. Call by Sharing 

- javascript의 경우

- 함수에 문자열, 숫자 등의 기본 형태의 인자를 넘기면 값을 복사한 지역변수로 사용

- 함수에 객체 형태의 인자를 넘기면 속성은 공유하지만, 새로 객체를 할당할 수는 없음

- call by sharing is a hybrid of the “call by value” and “call by reference” evaluation strategies that are implemented by other languages.

var change = function(a,obj1, obj2){
    a = 10;
    obj1.item = "changed";
    obj2 = {item : "changed"};
}

let a = 1;
let obj1 = {item : "unchanged"};
let obj2 = {item : "unchanged"}; 
change(a, obj1, obj2)
console.log(a); // 1
console.log(obj1); // { item: 'changed' }
console.log(obj2); //  { item: 'unchanged' }

 

 

 

 

 

함수의 호출 방식

 

코딩언어마다 immutable(불변)인지, mutable(가변)인지 확인을 잘 하여 코딩을 해야한다. 할당되는것에 따라 달라지기 떄문이다. 

- mutable(가변)객체를 넘기면 call by reference, 리스트와 딕셔너리는 변경이 가능하다.  

- immutable(불변)객체를 넘기면 call by value

 

  python  javascript 
가변(mutable) list, set, dict array, object, function RefExp, Map ... 
불변(immutable) int, float, bool, tuple, string, unicode Number, String, Boolean, Symbol, null, undefined
불변을 유지하기 위해? spread연산자, immer라이브러리 사용  

 

 

 

Python  주소값 참조 

 

값 복사

- 1차원 곱하기는 참조가 복사되지 않고 다른 주소값으로 만들어진다

b = [False] * 3  # False 를 10개 만든것
print(b); #[False, False, False]

b[0] = True;
print(b) #[True, False, False]

 

- 하지만 2차원 리스트의 경우 리스트는 참조로 복사되어 a[0][0] = True로 값을 변경하면 a[0][0], a[1][0], a[2][0] 값이 다 똑같이 변하여 동일한 값을 가짐을 알 수 있다. * 주의해서 list를 만들어야 한다. 

a = [[False] * 3] * 3  #"동일한" 리스트를 10개 만든것
print(a);  # [[False, False, False], [False, False, False], [False, False, False]]

a[0][0] = True;
print(a) #[[True, False, False], [True, False, False], [True, False, False]]

 

이를 방지하기 위해서 list comprehension을 사용해서 데이터를 만들어야 한다. 

list comprehension으로 만들면 값이 살아 있다. 

a = [[False for _ in range(3)] for _ in range(3)] # 다른 리스트를 10개 만든것 주소값을 다른 것으로 만든것
a[0][0] = True
print(a) #[[True, False, False], [False, False, False], [False, False, False]]

 

 

 

출처 

1. https://perfectacle.github.io/2017/10/30/js-014-call-by-value-vs-call-by-reference/ 

 

(자알쓰) call by value vs call by reference

자알쓰란?자바스크립트 알고 쓰자. (잘 쓰자는 의미도 담겨있다.)자바스크립트라는 언어 자체는 내 기준에서는 설계 상 미스가 참 많다.함수 단위의 스코프, 호이스팅, 동적 타입 등등자바와 같

perfectacle.github.io

2.https://www.pymoon.com/entry/Python-%EC%9D%80-callbyvalue-%EC%9D%BC%EA%B9%8C-callbyreference-%EC%9D%BC%EA%B9%8C

 

Python 은 call-by-value 일까 call-by-reference 일까

파이썬 call-by-value 일까 call-by-reference 일까 (Python call by value vs call by reference) 결론부터 말하자면 passed by assignment 라고 한다. 즉, 어떤 값을 전달하느냐에 따라 달라지는 것이다. 파이..

www.pymoon.com

3. http://milooy.github.io/TIL/JavaScript/call-by-sharing.html

4. https://bambielli.com/til/2016-02-15-javascript-call-by-sharing/#:~:text=TIL%20that%20there%20is%20a,are%20implemented%20by%20other%20languages.

5. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함