파이썬은 객체지향 프로그래밍을 지원하는 언어이며, 클래스와 객체를 중심으로 구성되어 있습니다. 클래스는 객체를 생성하기 위한 설계도이며, 객체는 클래스를 기반으로 생성된 인스턴스 입니다. 이번 글에서는 파이썬의 클래스와 객체지향 프로그래밍에 대해서 알아보겠습니다.
클래스와 객체
파이썬에서 클래스는 'class'키워드를 사용하여 정의합니다. 클래스 내부에는 속성(attribute)과 메서드(method)가 포함됩니다. 속성은 클래스 내부에 선언된 변수로, 클래스의 모든 인스턴스에서 공유됩니다. 메서드는 클래스 내부에 선언된 함수로, 클래스의 인스턴스에서 호출할 수 있습니다.
객체는 클래스를 기반으로 생성된 인스턴스로, 클래스 내부의 속성과 메서드에 접근할 수 있습니다. 객체를 생성하려면 클래스 이름 다음에 괄호를 사용하여 인스턴스를 만들어야 합니다.
예를 들어 다음은 'Person' 클래스를 정의하고 'John'이라는 이름을 가진 인스턴스를 생성하는 코드입니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
john = Person('John', 25)
생성자와 소멸자
클래스 내부에는 'init'과 'del'이라는 특별한 메서드가 있습니다. 'init' 메서드는 객체를 생성할 때 호출되며, 객체의 초기화를 담당합니다. 'del' 메서드는 객체가 소멸될 때 호출되며, 객체의 자원을 해제하는 작업을 수행합니다.
class Employee(Person):
def __init__(self, name, age, salary):
super().__init__(name, age)
self.salary = salary
def print_info(self):
print(f'이름: {self.name}, 나이: {self.age}, 연봉: {self.salary}')
john = Employee('John', 25, 5000)
john.print_info()
상속
class Employee(Person):
def __init__(self, name, age, salary):
super().__init__(name, age)
self.salary = salary
def print_info(self):
print(f'이름: {self.name}, 나이: {self.age}, 연봉: {self.salary}')
john = Employee('John', 25, 5000)
john.print_info()
위 예제에서 'Employee' 클래스는 'Person' 클래스를 상속합니다. 'Employee' 클래스는 'Person' 클래스에서 정의된 속성(name, age)을 상속받고, 추가적으로 'salary'라는 속성을 추가로 정의하였습니다. 'super().init(name, age)' 코드는 부모 클래스인 'Person'의 'init' 메서드를 호출하여 'name'과 'age' 속성을 초기화합니다. 'print_info' 메서드는 'Employee' 클래스에서 새로 추가된 'salary' 속성을 출력하는 메서드입니다.
다형성
파이썬에서는 다형성(polymorphism)을 지원합니다. 다형성이란 동일한 인터페이스를 가지고 있지만 구현은 다른 클래스들을 사용하는 것을 말합니다. 다형성을 통해 코드의 유연성을 높일 수 있습니다.
class Animal:
def __init__(self, name):
self.name = name
def sound(self):
pass
class Dog(Animal):
def sound(self):
return '멍멍!'
class Cat(Animal):
def sound(self):
return '야옹!'
animals = [Dog('개'), Cat('고양이')]
for animal in animals:
print(f'{animal.name}: {animal.sound()}')
위 예제에서 'Animal' 클래스는 추상 클래스로, 'sound' 메서드는 구현되지 않았습니다. 'Dog' 클래스와 'Cat' 클래스는 'Animal' 클래스를 상속받아 'sound' 메서드를 구현하였습니다. 'animals' 리스트에는 'Dog' 클래스와 'Cat' 클래스의 인스턴스가 모두 포함되어 있습니다. 'for' 루프에서는 각각의 인스턴스의 'name' 속성과 'sound' 메서드를 출력합니다.
클래스 변수와 인스턴스 변수
클래스 변수는 클래스 전체에서 공유되는 값이며, 인스턴스 변수는 인스턴스마다 독립적으로 가지는 값입니다. 클래스 변수는 클래스 내부에서 정의하고, 모든 인스턴스가 공유하며 클래스 이름으로 접근할 수 있습니다. 인스턴스 변수는 init 메서드 내부에서 정의하며, self를 사용하여 인스턴스별로 값을 가집니다.
예를 들어, 다음과 같은 Counter 클래스를 정의한다고 가정해봅시다.
class Counter:
count = 0 # 클래스 변수
def __init__(self):
self.value = 0 # 인스턴스 변수
Counter.count += 1
self.id = Counter.count
def increment(self):
self.value += 1
def decrement(self):
self.value -= 1
def get_value(self):
return self.value
def get_id(self):
return self.id
@classmethod
def get_count(cls):
return cls.count
위 예제에서 'count'는 클래스 변수로 Counter 클래스에 속합니다. 이 변수는 모든 인스턴스에서 공유됩니다. 'init' 메서드에서는 'value'와 'id'를 인스턴스 변수로 정의합니다. 'increment'와 'decrement' 메서드는 'value' 값을 증가시키거나 감소시킵니다. 'get_value'와 'get_id' 메서드는 'value'와 'id' 값을 반환합니다. '@classmethod' 데코레이터를 사용하여 클래스 메서드 'get_count'를 정의합니다. 이 메서드는 'cls'를 인자로 받아 클래스 변수 'count' 값을 반환합니다.
다음은 Counter 클래스를 사용하는 예제입니다.
c1 = Counter()
print(c1.get_value()) # 0
c1.increment()
print(c1.get_value()) # 1
print(c1.get_id()) # 1
print(Counter.get_count()) # 1
c2 = Counter()
print(c2.get_id()) # 2
print(Counter.get_count()) # 2
위 예제에서는 'c1'과 'c2' 인스턴스를 생성하여 'increment', 'get_value', 'get_id' 메서드를 호출합니다. 'Counter.get_count()'를 호출하여 클래스 변수 'count'의 값도 확인할 수 있습니다.
이상으로 클래스 변수와 인스턴스 변수에 대해 알아보았습니다. 클래스 변수는 모든 인스턴스에서 공유되는 값이며, 인스턴스 변수는 인스턴스마다 독립적으로 가지는 값입니다. 이러한 변수를 적절히 활용하여 객체지향 프로그래밍을 작성할 수 있습니다.
'Backend > Python' 카테고리의 다른 글
Traefik err - Unsolicited response received on idle HTTP channel starting with ""(+ FastAPI) (0) | 2023.04.05 |
---|