먼저 Call by value 와 Call by reference는 함수의 인자 전달 방식인데
Call by value - 함수의 인자를 받을때 변수에 담긴 값 자체를 Stack에 복사해서 넘겨줌
ex) 변수 a가 있고 함수 void test(a)가 있으면
void test 함수 안의 인자는 a의 주소값(자체값)이 아니라
a의 복사값임
Call by reference는 인자로 받은 변수의 주소값(자체값)을 전달해줌
그래서 함수내에서 변수를 조작하면 원본의 변수의 값도 바뀌게 되는거임
(호출자의 변수와 수신자의 파라미터과 완전히 동일한 것)
전에 배웠던 자바는 Call by value (왜? 메소드안에서 변수 조작하면 원본도 바뀌는거 아니였음?)
-> 참조 자체를 넘기는 Call by reference와는 다름(*C(포인터)랑은 다르게 메모리 주소에 직접 접근이 불가능한 언어 Java)
Main Stack Frame에 담긴 참조값이 복사되냐 주소값이 복사되냐일뿐 -> Java는 Call by value이다
* 이유? : C언어는 포인터를 이용해 주소값을 직접 가져와 전달할 수 있는데 이건 주소값을 몰래 변조하여 다른 소스 파일에서 이용되는 주소값을 가져올 수 있다는 말이며, 이를 악용하면 핵(hack)과 같은 불법 변질 프로그램이 될 수 있음
Java Script도 마찬가지
근데 솔직히 비슷한거같은데..
그럼 모든걸 객체로 판단하는 Python은 Call by value일까 Call by reference일까?
파이썬은 어떤 값을 전달하냐에 따라 둘다 가능! -> Passed by assignment
파이썬의 자료형에는 변경 불가능한 immutable 타입 객체와 mmutable 객체가 존재하는데
immutable을 넘기면 Call by value이고 mmutable를 넘기면 Call by reference임
쉽게쉽게 변경이 불가능(immutable)하니깐 복사해 새로 만드는거고
변경 가능(mmutable)하니깐 새로 값을 만들필요 없이 reference를 넘기는거임
'궁금했던거' 카테고리의 다른 글
(Spring) Maven과 Gradle? (0) | 2023.10.15 |
---|---|
요청헤더(Response Header)에 넘어오는 p3p가 머임? (0) | 2023.07.26 |