메뉴 닫기

파이썬 self 키워드 완벽 정리, 예제와 함께 배우는 객체지향 기초

파이썬 self 키워드 완벽 정리, 예제와 함께 배우는 객체지향 기초

🐍 파이썬 클래스가 낯선 당신을 위한 self 키워드 이해 가이드

파이썬을 배우다 보면 클래스와 객체라는 개념이 나오는데요.
이때 빠지지 않고 등장하는 것이 바로 self 키워드입니다.
많은 초보자들이 self가 도대체 뭘 의미하는지, 왜 메서드의 첫 번째 인자로 항상 들어가는지 헷갈려 하곤 하죠.
하지만 self는 자바의 this처럼 객체 자기 자신을 가리키는 중요한 키워드로, 이를 이해하면 파이썬의 객체지향 프로그래밍이 훨씬 쉬워집니다.
이번 글에서는 self의 정확한 역할부터 실전 예제까지 친절하게 설명드릴게요.
개념 정리가 필요한 분들께 꼭 도움이 되었으면 합니다 😊

클래스를 정의하면서 self를 쓰지 않으면 어떤 일이 벌어지는지, self 없이 메서드를 호출하면 왜 오류가 나는지 궁금하지 않으셨나요?
이 글에서는 self의 개념부터 실습 예제, 자주 하는 실수까지 실제 코딩 경험을 바탕으로 자세히 알려드립니다.
자바의 this와 비교해서 이해해 보면 한층 더 명확해지며, 객체지향의 본질도 자연스럽게 터득하게 될 거예요.
초보자도 이해할 수 있도록 최대한 쉽게 구성했으니 끝까지 함께 해주세요!



🐍 self 키워드는 무엇인가요?

파이썬에서 self는 클래스 내 메서드에서 반드시 첫 번째 인자로 등장합니다.
self는 해당 메서드를 호출한 객체 자신을 가리키는 예약어로, 클래스 내 속성(인스턴스 변수)이나 다른 메서드에 접근할 수 있도록 도와주는 역할을 합니다.

예를 들어 클래스를 기반으로 여러 개의 인스턴스를 만들었을 때, 각 인스턴스는 자신만의 데이터를 가지게 됩니다.
이때 self를 통해 각 인스턴스의 고유한 속성을 메서드 안에서 다룰 수 있게 되는 것이죠.

💡 TIP: self는 파이썬 키워드가 아니며, 단지 관례적으로 쓰이는 이름입니다.
원한다면 다른 이름으로 바꿀 수도 있지만 권장하지 않습니다.

다음은 간단한 self 키워드 사용 예시입니다.

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

    def greet(self):
        print("안녕하세요, 제 이름은", self.name, "입니다.")

p1 = Person("민수")
p1.greet()

위 코드에서 self.name = name을 통해 생성자 메서드인 __init__가 인스턴스 변수 name을 초기화합니다.
그리고 greet() 메서드 안에서도 self.name을 사용해 해당 인스턴스의 이름을 출력합니다.
self가 없다면 이와 같은 속성 접근이 불가능하게 됩니다.

💬 즉, self는 현재 인스턴스를 명시적으로 전달함으로써 클래스 내부에서 자신의 속성과 메서드에 접근하는 창구 역할을 합니다.

🔎 self가 필요한 이유

클래스 안에서 메서드를 정의할 때, self를 첫 번째 인자로 넣는 이유는 간단합니다.
바로 각 인스턴스(객체)마다 고유한 데이터에 접근하기 위해서입니다.
self 없이 메서드를 정의하면, 어떤 인스턴스가 해당 메서드를 호출했는지 파이썬은 알 수 없기 때문이죠.

클래스를 만들 때의 목적 중 하나는 데이터와 기능을 하나로 묶어 관리하는 것입니다.
self는 이 두 요소를 연결하는 중간 다리 역할을 하며, 메서드가 객체 자신을 인식하도록 도와줍니다.

💡 TIP: self는 메서드 호출 시 자동으로 전달됩니다.
즉, 메서드를 호출할 때 self를 직접 넘겨줄 필요는 없습니다.

아래의 예제를 보며 왜 self가 필요한지 더 구체적으로 살펴볼게요.

CODE BLOCK
class Dog:
    def __init__(self, name):
        self.name = name

    def bark(self):
        print(self.name + "가 짖습니다!")

dog1 = Dog("초코")
dog2 = Dog("바니")

dog1.bark()  # 출력: 초코가 짖습니다!
dog2.bark()  # 출력: 바니가 짖습니다!

만약 위 코드에서 bark() 메서드에 self를 생략했다면, 파이썬은 dog1과 dog2 중 어느 인스턴스의 name을 참조해야 할지 알 수 없어 오류가 발생합니다.

💬 self는 ‘이 메서드를 호출한 객체가 누구인지’를 알려주는 파이썬의 필수 구조입니다.

정리하자면, self는 파이썬 클래스에서 인스턴스 중심의 프로그래밍을 가능하게 해주는 핵심 도구입니다.
이해하고 나면 객체지향 프로그래밍이 한층 더 명확해질 거예요.



🧪 self 키워드 예제 실습

이제 실제 예제를 통해 self 키워드가 어떻게 사용되는지 직접 확인해볼까요?
클래스와 인스턴스를 정의하고, 인스턴스 변수를 설정하고 출력하는 과정을 통해 self의 역할을 명확히 이해할 수 있습니다.

아래는 학생 정보를 담는 클래스를 정의하고, 여러 명의 학생 인스턴스를 생성해보는 간단한 코드입니다.

CODE BLOCK
class Student:
    def __init__(self, name, grade):
        self.name = name
        self.grade = grade

    def introduce(self):
        print(f"안녕하세요, 저는 {self.name}이고, {self.grade}학년입니다.")

s1 = Student("지우", 3)
s2 = Student("현우", 2)

s1.introduce()  # 출력: 안녕하세요, 저는 지우이고, 3학년입니다.
s2.introduce()  # 출력: 안녕하세요, 저는 현우이고, 2학년입니다.

이 예제에서 self.nameself.grade는 각각의 인스턴스에 따라 다른 값을 가집니다.
introduce() 메서드는 해당 인스턴스의 정보를 출력하며, self를 통해 각각의 데이터를 정확하게 참조할 수 있습니다.

💎 핵심 포인트:
self를 사용함으로써 인스턴스 고유의 속성을 유지하면서, 여러 객체를 효율적으로 다룰 수 있습니다.

또한 self는 메서드 내부에서 다른 메서드를 호출할 때도 사용됩니다.

CODE BLOCK
class Calculator:
    def set_numbers(self, a, b):
        self.a = a
        self.b = b

    def add(self):
        return self.a + self.b

    def calculate(self):
        return self.add()

calc = Calculator()
calc.set_numbers(10, 20)
print(calc.calculate())  # 출력: 30

위 코드에서는 calculate() 메서드가 self.add()를 통해 같은 클래스 내 다른 메서드를 호출하고 있습니다.
이처럼 self는 단순히 데이터를 넘기는 역할뿐 아니라 메서드 간 상호작용에서도 필수적인 키워드입니다.

⚠️ self를 쓰지 않으면 생기는 문제

self는 선택 사항이 아니라, 파이썬 클래스 내 메서드 정의 시 필수적으로 사용해야 하는 인자입니다.
만약 self를 생략하거나 잘못 사용할 경우, 예상치 못한 오류가 발생하거나 원하는 동작을 하지 않게 됩니다.

가장 흔한 실수는 메서드를 정의할 때 self를 적지 않고, 호출만 하려는 경우입니다.
이럴 경우 Python은 메서드를 일반 함수로 인식하고 인스턴스 정보가 전달되지 않아 TypeError가 발생합니다.

CODE BLOCK
class User:
    def hello():
        print("Hello!")

u = User()
u.hello()  # TypeError: hello() takes 0 positional arguments but 1 was given

위 코드를 보면, hello() 메서드가 self 없이 정의되어 있어 오류가 발생합니다.
파이썬은 u.hello() 호출 시 자동으로 인스턴스를 넘기려고 하는데, 정의된 메서드가 인자를 받지 않도록 되어 있기 때문에 충돌이 생깁니다.

⚠️ 주의: self를 선언하지 않으면 클래스 메서드는 정상적인 인스턴스 접근을 할 수 없습니다.
반드시 첫 번째 인자로 self를 넣어야만 객체 자신의 속성과 메서드를 자유롭게 사용할 수 있습니다.

또 다른 실수는 self를 선언했지만 사용하지 않는 경우입니다.
이 경우 오류는 발생하지 않지만, 객체 속성에 접근하지 못해 의미 없는 코드가 되어버립니다.

CODE BLOCK
class Car:
    def __init__(self, brand):
        self.brand = brand

    def show_brand(self):
        print(brand)  # 오류는 아님, 하지만 brand 변수가 없음

my_car = Car("Hyundai")
my_car.show_brand()  # NameError: name 'brand' is not defined

위 코드에서는 brand 앞에 self가 빠졌기 때문에 전역 또는 지역 변수로 brand를 찾게 되고, 결국 NameError가 발생합니다.
self를 통해서만 클래스 내 인스턴스 변수에 접근할 수 있다는 점을 꼭 기억하세요.

💬 self는 단순한 문법이 아니라, 객체와 클래스 구조를 이해하는 핵심 요소입니다.
제대로 익혀두면 클래스 설계가 훨씬 쉬워져요.



🆚 self와 자바의 this 비교

파이썬의 self와 자바(Java)의 this는 매우 유사한 개념입니다.
둘 다 클래스 내 메서드에서 인스턴스 자신의 속성이나 메서드에 접근할 때 사용되며, 객체지향 프로그래밍에서 중요한 역할을 하죠.

하지만 문법과 구조에는 약간의 차이가 있습니다.
아래 표를 통해 두 키워드를 비교해볼게요.

구분 파이썬 self 자바 this
표현 방식 첫 번째 인자로 명시적으로 작성 암시적으로 자동 사용
필수 여부 필수 (생략 시 오류 발생) 선택 (필요할 때만 명시 사용)
용도 인스턴스 변수/메서드 접근 멤버 변수/메서드 접근, 생성자 호출 등

파이썬은 함수 정의에서 self를 직접 써야 하기 때문에 처음에는 조금 번거롭게 느껴질 수 있습니다.
하지만 이 방식 덕분에 어떤 메서드가 인스턴스를 다루는지 명확히 구분할 수 있어 코드 가독성이 높아진다는 장점도 있습니다.

💡 TIP: 자바에 익숙한 개발자라면 self를 this로 생각하면 구조 이해가 훨씬 수월해집니다.
둘의 차이는 문법적 차이일 뿐, 본질적인 역할은 동일하다는 점을 기억하세요.

결론적으로, self와 this는 객체 자신을 가리키는 지시자이며, 객체지향 프로그래밍에서 클래스와 인스턴스의 연결 고리로 꼭 필요한 존재입니다.
언어가 달라도 개념은 유사하니, 혼동하지 않고 상황에 맞게 사용하는 것이 중요하겠죠?

❓ 자주 묻는 질문 (FAQ)

self는 파이썬에서 꼭 사용해야 하나요?
네, 클래스 내 인스턴스 메서드를 정의할 때는 반드시 self를 첫 번째 인자로 선언해야 합니다.
self는 호출된 객체 자신을 참조하기 때문에 필수입니다.
self 대신 다른 단어를 써도 되나요?
기술적으로는 가능합니다.
self는 파이썬의 예약어가 아니기 때문에 다른 이름으로 바꿔도 오류는 나지 않지만, 관례적으로 self를 사용하므로 바꾸는 것은 권장되지 않습니다.
self를 사용하는 이유가 자바의 this와 같은 건가요?
맞습니다.
self는 자바의 this 키워드와 유사한 역할을 하며, 클래스 내부에서 자신의 속성과 메서드를 참조하는 데 사용됩니다.
클래스 메서드에서 self를 생략하면 어떤 오류가 나요?
메서드를 호출할 때 인스턴스가 자동으로 전달되는데, self가 없으면 인자를 받을 자리가 없어 TypeError가 발생합니다.
정적 메서드에서는 self를 쓰지 않아도 되나요?
네, @staticmethod 데코레이터를 사용하는 경우에는 self를 사용할 필요가 없습니다.
인스턴스와 무관한 독립적인 동작을 정의할 때 사용됩니다.
클래스 변수와 인스턴스 변수는 어떻게 구분하나요?
클래스 변수는 클래스 전체에서 공유되고, 인스턴스 변수는 self를 통해 객체별로 개별적으로 관리됩니다.
self 없이 선언된 변수는 클래스 변수일 가능성이 높습니다.
self 없이 클래스 메서드를 정의하고 싶을 때는?
클래스 메서드에는 @classmethod 데코레이터를 사용하고 첫 번째 인자를 self가 아닌 cls로 정의합니다.
이 경우 클래스 자체를 대상으로 동작합니다.
self를 명시하지 않아도 자동으로 전달되지 않나요?
메서드 호출 시 인스턴스가 자동으로 self 자리에 전달되지만, 함수 정의에 self 인자를 포함하지 않으면 오류가 발생합니다.
선언은 반드시 해줘야 합니다.

📌 self 키워드를 이해하면 클래스가 쉬워집니다

파이썬의 클래스 개념은 객체지향 프로그래밍을 이해하는 데 핵심적인 요소입니다.
그리고 그 중심에 있는 것이 바로 self 키워드입니다.
self는 단순히 문법적인 규칙이 아니라, 클래스 내에서 인스턴스와 메서드, 속성을 연결해주는 중요한 연결 고리입니다.

이번 글에서는 self의 정의부터 사용하는 이유, 예제 실습, 자바의 this와의 차이점, 그리고 사용하지 않았을 때 발생하는 문제까지 다뤘습니다.
초보자에게 다소 어려운 개념일 수 있지만, 코드를 직접 작성하고 실행해보며 익히다 보면 어느 순간 자연스럽게 이해하게 될 거예요.

앞으로 클래스 기반의 프로그래밍을 하게 될 때마다 self의 의미와 역할을 기억하며 작성해 보세요.
파이썬을 더 깊이 있게 다룰 수 있는 좋은 기반이 되어줄 것입니다.


🏷️ 관련 태그 : 파이썬클래스, self키워드, 파이썬기초, 객체지향, 자바this, 파이썬예제, 클래스메서드, 인스턴스변수, 프로그래밍입문, 파이썬오류