파이썬에서 **클래스(Class)**는 객체를 생성하기 위한 설계도이며, **객체(Object)**는 클래스를 기반으로 생성된 실체입니다. 객체 지향 프로그래밍(OOP)은 데이터를 구조화하고 재사용성을 높이는 데 매우 유용합니다.
🔍 객체 지향 프로그래밍이란?
과거 프로그래밍에서는 데이터를 함수와 별도로 관리하는 절차형 프로그래밍이 주를 이루었습니다. 하지만 코드가 커지면서 유지보수와 재사용성이 떨어지는 문제가 발생했습니다. 이를 해결하기 위해 데이터를 포함한 객체(Object) 단위로 프로그램을 구성하는 객체 지향 프로그래밍(OOP) 개념이 등장했습니다.
🔹 1. 클래스와 인스턴스
클래스를 사용하면 같은 구조의 객체를 여러 개 생성할 수 있습니다. 클래스를 기반으로 생성된 개별 객체를 **인스턴스(Instance)**라고 합니다.
✅ 예제 1: 클래스와 인스턴스 생성
class Car:
def __init__(self, brand, model):
self.brand = brand # 인스턴스 변수
self.model = model
car1 = Car("Tesla", "Model S")
car2 = Car("BMW", "X5")
print(car1.brand, car1.model)
print(car2.brand, car2.model)
출력 예시:
Tesla Model S
BMW X5
📌 설명:
- Car 클래스는 자동차 브랜드와 모델 정보를 저장하는 역할을 합니다.
- car1, car2는 Car 클래스의 인스턴스로, 서로 독립적인 값을 가집니다.
🔹 2. self의 의미
self는 인스턴스 자신을 가리키는 변수입니다. 객체가 생성될 때 메서드가 해당 인스턴스를 조작할 수 있도록 합니다.
✅ self가 왜 필요할까?
파이썬에서 클래스 내부의 메서드는 기본적으로 인스턴스와 연결되지 않습니다. 즉, 함수처럼 동작합니다. 따라서 특정 인스턴스와 연결하기 위해 self를 첫 번째 매개변수로 사용합니다.
✅ 예제 2: self 사용 예시
class Dog:
def __init__(self, name):
self.name = name
def bark(self):
print(f"{self.name}가 짖습니다.")
dog = Dog("바둑이")
dog.bark()
출력 예시:
바둑이가 짖습니다.
📌 설명:
- self.name은 인스턴스 변수로, 객체마다 고유한 값을 가집니다.
- bark() 메서드는 self.name을 참조하여 해당 인스턴스의 이름을 출력합니다.
🔹 3. 생성자 (__init__ 메서드)와 객체 초기화
클래스에서 __init__ 메서드는 객체가 생성될 때 자동으로 실행되는 초기화 함수입니다. 이는 객체가 생성될 때 필요한 속성을 설정하는 역할을 합니다.
✅ 생성자가 왜 필요할까?
객체가 생성될 때마다 특정 변수를 수동으로 설정해야 한다면 매우 번거로울 것입니다. 이를 방지하기 위해 생성자를 활용하여 객체가 만들어질 때 필요한 초기 설정을 자동으로 수행합니다.
✅ 예제 3: 생성자 사용
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f"안녕하세요, 저는 {self.name}이고 {self.age}살입니다.")
person = Person("철수", 25)
person.introduce()
출력 예시:
안녕하세요, 저는 철수이고 25살입니다.
📌 설명:
- __init__ 메서드는 객체가 생성될 때 name과 age 값을 설정합니다.
- 생성자는 자동으로 호출되므로 person = Person("철수", 25) 실행 시 바로 초기화됩니다.
🔹 4. 클래스 메서드와 정적 메서드
✅ 클래스 메서드 (@classmethod)란?
클래스 메서드는 클래스 변수를 조작하기 위해 사용됩니다. 이는 인스턴스가 아닌 클래스 자체에 영향을 줍니다.
✅ 클래스 메서드가 필요한 이유
클래스 변수는 모든 인스턴스가 공유합니다. 따라서 클래스 변수를 수정하거나 조회할 때는 인스턴스가 아닌 클래스 자체에서 접근하는 것이 더 효율적입니다.
class Animal:
species = "포유류"
@classmethod
def get_species(cls):
return cls.species
print(Animal.get_species())
출력 예시:
포유류
📌 설명:
- @classmethod는 첫 번째 인자로 클래스 (cls)를 받습니다.
- 클래스 변수 species를 반환하여 인스턴스가 아닌 클래스 수준에서 값을 유지합니다.
✅ 정적 메서드 (@staticmethod)란?
정적 메서드는 클래스나 인스턴스 변수에 접근하지 않는 독립적인 함수를 만들 때 사용됩니다.
✅ 정적 메서드가 필요한 이유
때로는 클래스 내부에서 특정한 기능을 수행하는 함수가 필요하지만, 클래스나 인스턴스 변수와 상관이 없는 경우가 있습니다. 이럴 때 @staticmethod를 사용하면 코드 가독성이 좋아집니다.
class Math:
@staticmethod
def add(a, b):
return a + b
print(Math.add(5, 10))
출력 예시:
15
📌 설명:
- @staticmethod를 사용하면 self나 cls를 받지 않고 독립적인 기능을 수행할 수 있습니다.
- 단순 연산이나 도구성 함수를 만들 때 유용합니다.
🔹 5. 클래스 메서드 vs 정적 메서드 비교
기능 클래스 메서드 (@classmethod) 정적 메서드 (@staticmethod)
첫 번째 매개변수 | cls (클래스 자체를 참조) | 없음 (독립적인 함수) |
클래스 변수 접근 | 가능 (cls.variable) | 불가능 |
인스턴스 변수 접근 | 불가능 | 불가능 |
사용 목적 | 클래스 변수를 변경하는 함수 | 클래스와 관계없는 보조 함수 |
'IT > Python Basic' 카테고리의 다른 글
[Python] 초급 개념17 - lambda 함수와 map(), filter(), reduce() (0) | 2025.02.19 |
---|---|
[Python] 초급 개념16 - random 모듈 활용 (0) | 2025.02.19 |
[Python] 초급 개념15 - 날짜와 시간 (datetime, time 모듈) (0) | 2025.02.19 |
[Python] 초급 개념14 - 모듈과 패키지 (import, from, as) (0) | 2025.02.18 |
[Python] 초급 개념12 - 리스트 컴프리헨션 (0) | 2025.02.18 |
[Python] 초급 개념11 - 문자열 다루기 (split, join, format 등) (0) | 2025.02.18 |
[Python] 초급 개념10 - 예외 처리 (try-except) (0) | 2025.02.18 |
[Python] 초급 개념9 - 파일 입출력 (I/O) (0) | 2025.02.18 |
댓글