진짜 개발자
본문 바로가기

Cloud 교육/웹프로젝트

3일차 (값 참조와 주소 참조) - 수정중

728x90

Swap 함수를 만들어보자

1. IN Python 불가능

def swap(num1, num2):

temp = num1

num1 = num2

num2 = temp


num1 = 10

num2 = 20

swap(num1, num2)


result ?


2. IN C언어에서는 가능

void swap(int &num1, int &num2){

int temp = *num1;

*num1 = *num2;

*num2 = temp;



값참조(Call by value)

- 메모리상에 존재하는 주소에있는 "값"을 참조

- 때문에 넘겨받은 함수의 인자값을 아무리 변경해도 외부에서 그값은 변경되지 않는다


*오해 할만한 것

- 아래의 내용은 p라는 객체를 함수의 인자로 전달했다

  함수내에서는 값을 전달받아 그값(객체)의 내부 값을 변경한 것이지

  넘겨받은 값을 변경한것은 아니다

class Person:
name = ""
def __init__(self, name):
self.name = name

def changeName(person):
person.name = "galid"

p1 = Person("jjy")
print(p1.name)
changeName(p1)
print(p1.name)

- 값참조의 경우 함수의 인자로 값만을 넘기므로 함수내에서 

  그값을 변경하더라도 변경이 일어나지 않는다

class Person:
name = ""
def __init__(self, name):
self.name = name

def changeName(person):
person = Person("galid")

p1 = Person("jjy")
print(p1.name)
changeName(p1)
print(p1.name)



주소 참조(Call by reference)

- 메모리상에 존재하는 주소값을 참조

- C언어의 *(포인터)

- C언어의 포인터는 주소참조를 제공하므로 그 주소에 접근하여 값을 변경할 수 있다

void swap(*int num1, *int num2){

temp = *num1;

*num1 = *num2;

*num2 = temp;

}

- 파이썬의 함수에 인자로 리스트등을 넘겨주는 것은 해당 리스트를 참조할수 있는 주소를 넘겨주는 것




파이썬의 가변타입 불가변타입

1. 불가변수

- int, str, float, double

- 함수에 전달될 때 메모리에 할당된 그값만을 복사해 보낸다

- 불 가변수이므로 주소값을 주지 않는다

- A = 1

  B = A 의 경우 A의 값만을 복사

 따라서 B의 값을 바꾸더라도 A는 그대로


2. 가변수

- list, dict, set, instance 등

- 함수에 전달될 때 참조값(메모리위치를) 전달한다