본문 바로가기

카테고리 없음

Call by value와 Call by reference 그리고 Call by object Reference(Call by assignment)

반응형

인자를 전달하는 방식에는 기본적으로 두 가지가 있다. Call by value와 Call by reference 

그리고 파이썬에서는 그 외의 방법인 Call by object reference로 인자를 전달하게 된다.

 

 

Call by value

  • 함수에서 값을 복사해서 전달하는 방식으로  자바 같은 경우는 Call by value방식으로 인자를 전달한다
public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		int a = 3;
		int b = 5;

		System.out.println("a: "+a+", b :"+b);
	
		temp(a, b);
		
		System.out.println("a: "+a+", b :"+b);
	}

	static void temp(Integer first, Integer second) {
		Integer temp = first;
		first = second;
		second = temp;
		System.out.println("first: "+first+", second :"+second);
	}
    
    
    //출력된 값
    
a: 3, b :5

first: 5, second :3

a: 3, b :5

보면 알겠지만 temp 내부에서 값의 변동이 일어나도 외부의 변수 값에는 영향을 미치지 않는다

 

Call by reference

  • call-by-reference 참조에 의한 호출방식은 함수 호출시 인자로 전달되는 변수의 레퍼런스를 전달한다. (해당 변수를 가르킨다.)
  • `따라서 함수 안에서 인자의 값이 변경되면, 아규먼트로 전달된 객체의 값도 함께 변경된다.
#include <stdio.h>
 
void swap(int &num1, int &num2)
{
    int temp = num1;
    num1 = num2;
    num2 = temp;
}
void main()
{
    int a = 20, b = 60;
    swap(a, b);
    printf("a: %d, b: %d", a, b);
}

#출력 된 값
a: 60
b: 20

 

call by object reference

  • 파이썬에서는 모든 것이 객체이고, 객체에는 2가지 종류가 있다.
  1. immutable object
    • int, float, str, tuple
    • immutable 객체가 함수의 arguments로 전달되면 처음에는 call by reference로 받지만, 값이 변경되면 call by value로 동작한다.
      즉 함수 내에서 formal parameter 값이 바뀌어도, actual parameter에는 영향이 없다.
  2. mutable object
    • list, dict, set
    • mutable 객체가 함수의 argument로 넘어가면 call by reference로 동작한다. 즉, object reference가 전달되어 actual parameter의 값에 영향을 미칠 수 있다.
>>> a = 1
>>> b = 2
>>>
>>> def temp(a,b):
...     temp = a
...     a = b
...     b = temp
...
>>> a

## 스왑 하기 전 값
1    
>>> b
2
>>> temp(a,b)

## 스왑 한 후의 값
>>> a
1
>>> b
2

## 함수 안에서 값을 변경한다고 해도 그대로 이다
>>> def add(a):
...     a = 5
...
>>> add(a)
>>> a
1

보면 값이 달라지지 않은 것을 볼 수 있다

 

리스트를 함수 내에서 변경 했을 때 함수 밖의 값도 달라지는 것을 볼 수 있다.

>>> list_a = [1,2,3]
>>> def append(a):
...     a.append(5)
...

##리스트의 값이 변화 한 것을 볼 수 있다.
>>> append(list_a)
>>> list_a
[1, 2, 3, 5]

 

 

리스트는 reference로 작동하여 값이 무조건 변화 할 줄 알았지만....

>>> list_a = [1,2,3]
>>> list_b = [4,5,6]

>>> def swap(a,b):
...     temp = a
...     a = b
...     b = temp
...
##이럴수가!!! 값의 변화가 없다
>>> swap(list_a, list_b)
>>> list_a
[1, 2, 3]
>>> list_b
[4, 5, 6]

이럴수가!!!!!!!!!!!!!!!!!!!!!!!!!! 변화가 없다

mutable object는 reference 처럼 동작하여 무조건 변화하는게 아니었던가!

 

이 부분에 대해서 아직까지 명확한 답을 찾지는 못 해서 앞으로 공부를 하면서 더 알아가려고 한다.

 

 

 

 

 

 

참고

 

생활코딩

 

참조 - 생활코딩

복제 전자화된 시스템의 가장 중요한 특징은 복제다. 현실의 사물과 다르게 전자화된 시스템 위의 데이터를 복제 하는데는 비용이 거의 들지 않는다. 바로 이러한 특징이 소프트웨어를 기존의 산업과 구분하는 가장 큰 특징일 것이다. 프로그래밍에서 복제가 무엇인가를 살펴보자. package org.opentutorials.javatutorials.reference; public class ReferenceDemo1 { public static void runVal

opentutorials.org

python 함수 인자 전달 방식

 

Python 함수 인자 전달 방식, Call by object Reference

...

lee-seul.github.io

초보 몽키의 개발 블로그

반응형