파이썬: 객체 참조에 의한 호출

왜 배워야하는가?

파이썬에서는 모든 것은 객체로 취급이 됩니다. 즉, 정수, 문자열, 클래스의 인스턴스 뿐만 아니라 함수 또한 객체로 취급이 됩니다. 파이썬에서 함수를 호출할 경우 객체의 종류에 따라 개체의 변화 양상이 결정됩니다. 따라서 객체참조에 의한 호출을 이해하게 되면 값들의 변화 흐름을 이해할 수 있고 디버깅을 하는데에 도움이 됩ㄴ다.

객체

파이썬에서는 모든 것은 객체라고 하였습니다. 한 entity가 객체라는 것은 ① 속성 ② 메서드 ③ 고유식별자 ④ 타입을 갖고 있다는 뜻입니다. 함수도 속성과 메서드를 가질 수 있습니다.

고유식별자란 메모리 상의 주소입니다. 즉, 모든 객체는 메모리 상에 고유의 주소를 갖고 있습니다.

객체는 타입을 갖고 있습니다. 함수의 타입을 조사하면 function class의 인스턴스임을 확인할 수 있습니다.

def greet():
    print("Hello, World!")

# Check the type of the function
print(type(greet))  # Output: <class 'function'>

객체 참조에 의한 호출

파이썬은 함수에 인자를 전달할 때 객체 자체가 아닌 객체 참조를 전달합니다. 즉, 객체의 주소를 인자로 전달합니다. 따라서 함수 내부에서 객체를 수정할 때 원본 객체의 종류에 따라 수정이 될 지 아니면 새로운 객체가 생성이 되어 처리 될 지 여부가 결정이 됩니다.

객체는 가변객체와 불변객체가 있습니다. 리스트, 사전이 가변객체입니다. 정수, 문자열, 실수, 튜플 등은 불변객체입니다.

가변객체를 인자로 넣을 경우에 가변객체의 내부 내용은 수정될 수 있습니다. 따라서 원본 객체에 영향이 있습니다.

def modify_list(my_list):
    my_list.append(4)  # 가변 객체를 수정

numbers = [1, 2, 3]
modify_list(numbers)

print(numbers)  # 출력: [1, 2, 3, 4]

불변객체를 인자로 전달할 경우에 불변객체에 상호작용을 하면 새로운 객체가 생성이 됩니다. 따라서 원본 객체에 영향이 없습니다.

def modify_number(x):
    x = 10  # 새로운 값을 할당 (새 객체 생성)

num = 5
modify_number(num)

print(num)  # 출력: 5

정리

  • 파이썬에서 모든 것은 객체다. 함수도 객체다.
  • 객체란 클래스의 인스턴스다. 즉, 파이썬에서 값을 가질 수 있는 모든 것은 클래스(타입)이 있다.
  • 객체는 속성, 메서드, 고유식별자, 타입을 갖는다.
  • 객체참조에 의한 호출이란 함수의 인자에 객체 참조를 전달하는 방식이다.
  • 함수 호출 시 불변객체를 전달하면 함수 내부에서 변경하더라도 외부 원본객체는 영향이 없다.
  • 함수 호출 시 가변객체를 전달하면 함수 내부에서 변경하더라도 외부 원본객체는 영향이 있다.
  • 가변객체는 사전, 리스트가 있고 불변객체는 정수, 문자열, 튜플이 있다.