티스토리 뷰
call by ..??
평가 전략(Evaluation Strategy)은 프로그래밍 언어에서 함수 호출의 아규먼트(argument)의 순서를 언제 결정하고 함수에 어떤 종류의 값을 통과시킬지 결정하는 것.
(참고)
- 아규먼트란? 전달값, 전달인자, 여기서 int a, int b를 의미
public void change(int a, int b){
...
}
1. 값에 의한 호출(Call by value)
- 함수를 호출시 단순히 값을 전달하는 형태의 함수 호출
- JAVA의 경우 call by value
- arguments로 값이 넘어온다.
- 값이 넘어올 때 복사된 값이 넘어온다.
- caller(호출하는 녀석)가 인자를 복사해서 넘겨줬으므로 callee(호출당한 녀석)에서 변경하여도 caller는 영향을 받지 않는다.
- 원본의 내용을 함수 내부에서 변경하는 것이 불가능하다.
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++
- arguments로 **reference(값에 대한 참조 주소, 메모리 주소를 담고있는 변수)**를 넘겨준다.
- reference를 넘기다 보니 해당 reference가 가리기는 값을 복사하지는 않는다.
- caller(호출하는 녀석)가 인자를 복사해서 넘기지 않았으므로 callee(호출당한 녀석)에서 변경하면 caller는 영향을 받는다.
- 원본의 내용을 함수 내부에서 변경하는 것이 가능하다.
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
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
5.
'Programming > JAVA&JAVASCRIPT비교' 카테고리의 다른 글
[JAVA,C#,Python 코드 비교] 6. 배열과 컬렉션 (0) | 2022.04.24 |
---|---|
[JAVA,C#,Python 코드 비교] 10. 상속과 interface (0) | 2020.09.11 |
[JAVA,C#,Python 코드 비교] 8. 익명클래스와 람다 (0) | 2020.09.11 |