본문 바로가기
알고리즘

[python] 함수 호출 방법

by KBS 2021. 8. 15.
728x90
  • 알고리즘을 공부하며 조원들과 함께 메모리에대해 이야기를 하던중 파이썬 함수에서 리스트를 받는것과 문자형 정수형을 받는것이 무슨 차이가 있을까? 라는 이야기가 나와 공부해 보았습니다.

함수 호출방법

  • 함수 호출방법에는 크게 두 가지가 있습니다. call by valuecall by reference가있는데 Call by value(값에 의한 호출)는 인자로 받은 값을 복사하여 처리를 한다. Call by reference(참조에 의한 호출)는 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 줍니다. 간단히 말해 값을 복사를 하여 처리를 하느냐, 아니면 직접 참조를 하느냐 차이인 것입니다.
  • 프로그래밍 구조상 Call by value(값에 의한 호출)를 하면 복사가 되기 때문에 메모리량이 늘어난다. 요즘에는 기기의 성능이 좋아져서 상관이 없다지만 많은 계산이 들어간다면 과부하의 원인이 됩니다. 하지만 복사처리가 되기 때문에 원래의 값은 영향을 받지 않아서 안전합니다.

'Call by value'와 'Call by reference'의 차이

  • Call by value : 변수를 복사한 값을 전달하는 방식
    • 함수의 인자(argument)를 받을 때, 변수에 담긴 값 자체를 stack에다가 복사하여 넘겨줍니다. 예를 들어 변수 a가 있고 함수 def1가 있을 때, def1(a)에서 전달받은 aa 자체(주소 값)가 아니라 a의 복사 값, 레플리카입니다. 따라서 함수 내에서 해당 인자를 조작하여 바꾸었다고 해도 원본 변수 a는 변하지 않습니다. 원본을 건드리지 않아 안전하지만, 함수의 사용으로 해당 전역 변수를 바꾸고 싶을 때는 리턴 값을 다시 전역 변수로 집어넣어야 하는 번거로움과 시간 사용의 단점이 있습니다.
    • 장점 : 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존됩니다.
    • 단점 : 복사하기 때문에 메모리 사용량이 증가합니다.
  • Call by reference : 인자로 받은 변수의 주소값을 전달받는 것
    • 함수의 인자를 받을 때, 변수가 가리키는 주소 값을 전달한다. 예를 들어 변수 a가 있고 함수 def2가 있을 때, def2(a)에서 전달받은 a는 원본 전역 변수 a의 주소 값입니다. 따라서 함수 내에서 해당 인자를 조작하면 원본 변수의 주소 값으로 타고 들어가 해당 값 자체를 바꿔버립니다.. 이를 통해 전역 변수의 즉각적 변경이 가능하지만, 부주의하면 변수를 잘못 조작해 프로그램에 문제를 야기할 수 있습니다.
    • 장점 : 복사하지 않고 직접 참조하기 때문에 빠릅니다.
    • 단점 : 직접 참조를 하기 때문에 원래의 값이 영향을 받습니다.

그렇다면 파이썬은?

  • 파이썬에서의 함수 전달방식은 Call by assignment입니다. 파이썬의 경우는 위의 경우처럼 주소 값 참조나, 값 복사와 조금 다르다. 이유는 python은 모든 것을 "객체"로 판단한다는 데에 있습니다. 파이썬은 넘겨지는 객체의 종류에 따라서 Call by valueCall by reference가 나뉘어 집니다. 
    • Call by value에 해당되는 값은 immutable Object int, str, float, tuple 등 단일 값이거나 static속성을 가지는 객체입니다.
    • Call by reference에 해당되는 값은 mutable Object list, dict, set이 있습니다.
728x90

댓글