요즘 GPT 관련 업무를 진행하면서 python을 다루게 되었습니다.
Fast API로 구현된 프로젝트를 찾아보며 패키지 구조와 전반적인 플로우를 살펴보게 되었습니다.
매번 java spring 프로젝트를 진행하며 'java는 객체지향 언어이다' 는 귀에 피나도록 들었지만
python은 어떤지 궁금했습니다. 그래서 해당 주제로 글을 작성하게 되었습니다.
결론부터 말씀드리면 python도 객체지향 언어입니다.
왜냐하면 python에서 Class를 지원하기 때문입니다.
이는 객체지향 프로그래밍의 모든 주요 개념(캡슐화, 상속, 다형성)을 지원하기 때문입니다!
클래스를 정의하고, 객체를 생성하며, 메서드와 속성을 사용하는 등의 객체지향적 접근 방식을 완전히 수용합니다.
객체지향 프로그래밍 주요 개념들의 예시를 통해 더 알아봅시다.
클래스와 객체
class Dog:
species = "Canis familiaris" # 클래스 변수
def __init__(self, name, age):
self.name = name # 인스턴스 변수
self.age = age
def description(self):
return f"{self.name} is {self.age} years old"
def speak(self, sound):
return f"{self.name} says {sound}"
buddy = Dog("Buddy", 4)
print(buddy.description()) # Buddy is 4 years old
print(buddy.speak("Woof Woof")) # Buddy says Woof Woof
Dog 클래스를 선언하고 위 코드처럼 객체를 생성하고 객체는 메서드를 호출하여 수행할 수 있습니다.
상속
class Bulldog(Dog): # Dog 클래스를 상속받는 새로운 클래스
def run(self, speed):
return f"{self.name} runs {speed}"
bull = Bulldog("kiki", 5)
print(bull.description()) # kiki is 5 years old
print(bull.speak("pop pop")) # kiki says pop pop
Dog 클래스를 상속하여 Bulldog 클래스를 선언하였습니다.
기존 Dog가 가진 생성자(__init__)과 decription, speak을 상속받았기 때문에 사용가능합니다.
다형성
class GermanShepherd(Dog):
def speak(self, sound="Bark"):
return super().speak(sound) + "!!" # 부모 클래스의 메서드를 호출
german = GermanShepherd("GG", 9)
print(german.speak()) # GG says Bark!!
마찬가지로 Dog 클래스를 상속받았습니다.
부모 클래스(Dog)의 speak를 오버라이딩하여 다른 행동을 구현할 수 있습니다.
캡슐화
class Cat:
species = "Canis familiaris" # 클래스 변수
def __init__(self, name):
self.__name = name # 비공개 인스턴스 변수
def speak(self):
return f"{self.__name} says Meow"
cat = Cat("야옹스타")
print(cat.species) # Canis familiaris
print(cat.__name) # AttributeError: 'Cat' object has no attribute '__name'
캡슐화는 객체의 내부 표현을 숨기고, 객체의 연산을 통해서만 데이터에 접근할 수 있도록 하는 기법입니다.
이를 통해 객체의 상세 구현을 숨기고 사용 방법만을 노출하여, 코드의 안정성과 유지보수성을 높일 수 있습니다.
클래스 외부에서도 사용하고 싶다면 클래스 변수로 사용하면 될 것 같습니다.
하지만 인스턴스 변수는 외부에서 접근 불가합니다.
참고
'Language, Framework > python' 카테고리의 다른 글
| Uvicorn으로 동기 비동기 프로그래밍 이해하기 - (1) (3) | 2024.08.26 |
|---|