파이썬 self란 무엇인가?
파이썬으로 개발하다 보면 반드시 마주치게 되는 것이 바로 self입니다. 이 글에서는 파이썬 클래스에서 self가 어떤 역할을 하는지, 내부적으로 어떻게 동작하는지 흥미로운 포인트들과 함께 자세히 알아보겠습니다.
참고 − self는 파이썬의 예약어(키워드)가 아닙니다.
self의 가장 일반적인 용도
self는 클래스 내부에서 객체의 인스턴스 자기 자신을 나타내는 데 사용됩니다. 하나의 클래스로 여러 개의 인스턴스를 생성할 수 있으며, 각 인스턴스는 서로 다른 값을 가질 수 있습니다. 이때 self 덕분에 클래스 내부에서 해당 인스턴스의 속성 값에 접근할 수 있습니다.
다음 예제를 통해 확인해 보겠습니다.
예제
# 클래스 정의
class Laptop:
# init 메서드
def __init__(self, company, model):
# self
self.company = company
self.model = model
위 코드처럼 self.[속성명] 형태로 클래스의 속성을 정의합니다. 그러면 인스턴스를 생성할 때마다 self는 해당 인스턴스 자신을 가리키므로, 각 인스턴스는 서로 독립적인 속성 값을 유지하게 됩니다.
두 개의 인스턴스로 self 동작 확인하기
Laptop 클래스의 인스턴스 두 개를 만들어 self가 실제로 어떻게 작동하는지 살펴보겠습니다.
예제
# 클래스 정의
class Laptop:
# init 메서드
def __init__(self, company, model):
# self
self.company = company
self.model = model
# Laptop 클래스의 인스턴스 생성
laptop_one = Laptop('Lenovo', 'ideapad320')
laptop_two = Laptop('Dell', 'inspiron 7000')
# 인스턴스 속성 출력
print(f"Laptop One: {laptop_one.company}")
print(f"Laptop Two: {laptop_two.company}")
실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Laptop One: Lenovo Laptop Two: Dell
같은 속성(company)에 대해 서로 다른 값이 출력되었습니다. 그 이유를 자세히 살펴보겠습니다.
self의 내부 동작 원리
파이썬은 인스턴스의 메서드나 속성에 접근할 때 기본적으로 해당 인스턴스에 대한 참조(reference)를 전달합니다. 그리고 이 참조가 self에 담기는 것입니다. 따라서 인스턴스마다 참조가 다르기 때문에, 각 인스턴스에 맞는 속성 값을 얻을 수 있는 것입니다.
self는 키워드가 아니다
앞서 언급했듯이 self는 파이썬의 키워드가 아닙니다. 인스턴스의 속성이나 메서드에 접근할 때 굳이 직접 전달하지 않아도 되는, 일종의 자동으로 채워지는 인수(argument)에 가깝습니다. 파이썬이 인스턴스에 대한 참조를 자동으로 넘겨주기 때문입니다.
즉, 이 참조는 어떤 변수 이름으로 받아도 상관없습니다. 아래 코드를 실행해 결과를 직접 확인해 보세요.
예제
import inspect
# 클래스 정의
class Laptop:
# init 메서드 (self 대신 다른 이름 사용)
def __init__(other_than_self, company, model, colors):
# 사실 self지만 이름만 다를 뿐
other_than_self.company = company
other_than_self.model = model
other_than_self.colors_available = colors
# 메서드 (역시 self 대신 다른 이름 사용)
def is_laptop_available(not_self_but_still_self, color):
# 지정한 색상의 노트북이 있는지 여부 반환
return color in not_self_but_still_self.colors_available
# 클래스 인스턴스 생성
laptop = Laptop('Dell', 'inspiron 7000', ['Silver', 'Black'])
# is_laptop_available 메서드 호출
print("Available") if laptop.is_laptop_available('Silver') else print("Not available")
print("Available") if laptop.is_laptop_available('White') else print("Not available")
실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Available Not available
self라는 이름을 전혀 다른 이름으로 바꾸었는데도 코드는 이전과 똑같이 정상적으로 동작했습니다. 차이점이 전혀 없다는 뜻입니다. 이것이 바로 self가 키워드가 아니라는 증거이며, self라는 이름은 마음대로 변경해도 무방하다는 것을 보여줍니다. 결국 self는 하나의 인수에 가까운 것입니다.
참고 − 그럼에도 불구하고 가장 좋은 방법은 관례대로 self를 사용하는 것입니다. 모든 파이썬 개발자가 따르는 표준 컨벤션이기 때문입니다.
마무리
지금까지 파이썬 클래스에서 self의 역할과 내부 동작 원리를 살펴보았습니다. 핵심을 정리하면 다음과 같습니다.
- self는 클래스 인스턴스 자기 자신을 가리키는 참조입니다.
- 메서드 호출 시 파이썬이 인스턴스 참조를 자동으로 전달합니다.
- self는 키워드가 아니므로 이름을 바꿔도 동작하지만, 가독성과 관례를 위해 self 사용을 권장합니다.
글을 읽으면서 궁금한 점이 있다면 댓글로 남겨주세요.