Class(≒Template or 설계도)
|
⊢ 속성(Attributes) - 객체의 데이터 ᄀ
| ⊢ 인스턴스 (Instance) : 객체(Object)
∟ 메서드(Methods) - 객체의 동작 ˩
클래스와 객체
- 클래스: 객체를 생성하기 위한 청사진. 속성과 메서드를 정의해 객체의 구조와 동작을 설계.
- 객체: 클래스에서 생성된 인스턴스. 클래스를 기반으로 실체화된 데이터와 기능의 묶음.
- 클래스를 사용하는 이유: 객체를 통해 데이터를 구조화하고, 데이터와 동작(메서드)을 함께 묶어 관리하기 위해.
객체(Object)
클래스(Class)의 인스턴스(Instance)
클래스로부터 실제로 생성된 구체적인 데이터와 기능을 가지는 실체
class Dog: #클래스 정의
def __init__(self, name, breed): #초기화 메서드
self.name = name #속성 정의
self.breed = breed
def bark(self): #메서드 정의
return f"{self.name}가 짖습니다. {self.name}은 {self.breed}입니다."
#객체 생성
my_dog = Dog("Buddy", "Golden Retriever")
print(my_dog.bark())
#Dog : class
#my_dog: Dog클래스의 인스턴스, 따라서 객체
#my_dog객체: name,breed 속성을 가지며 bark() 메서드 호출가능
#메서드의 첫 번째 인수가 인스턴스 자신을 참조하기 위한 변수
#관습적으로 self를 사용하는 것이 일반적 => 코드 가독성 높이고 다른 파이썬 개발자들과 일관성 유지
객체지향 프로그래밍(Object-Oriented Programming, OOP)
클래스, 객체를 사용하여 프로그램을 설계, 구현하는 방식
코드의 재사용성, 확장성, 유지보수성(모듈화)을 높이는 데 유용한 프로그래밍 패러다임
1. 캡슐화(Encapsulation)
2. 상속(Inheritance)
3. 다형성(Polymorphism)
4. 추상화(abstraction)
캡슐화
객체의 속성과 메서드를 하나로 묶고, 일부를 외부에 감추어 객체 내부의 구현을 숨기는 원칙
=> 데이터의 무결성 보호, 외부에서의 직접 접근 제한
class Dog:
def __init__(self, name):
self.__name = name #비공개 속성 (외부에서 접근 불가)
def get_name(self): #비공개 속성에 접근하기 위한 메서드
return self.__name
# __name과 같이 속성 앞에 __ :이 속성은 비공개(private) 속성
# 클래스 외부에서 직접 접근을 막아 데이터를 보호하는 역할
# 객체가 생성된 후 name 속성을 외부에서 임의로 수정하는 것을 방지
상속
기존 클래스(부모 클래스)를 기반, 새로운 클래스(자식 클래스)를 만드는 방법
상속을 통해 부모 클래스의 속성, 메서드를 자식 클래스가 물려받아 사용 => 확장, 수정 가능
class Animal: #부모 클래스
def __init__(self, species):
self.species = species
class Dog(Animal): #자식 클래스
def __init__(self, name, breed):
super().__init__("Dog") #부모 클래스의 초기화 메서드 호출
self.name = name
self.breed = breed
#super()는 자식 클래스에서 부모 클래스의 메서드(특히 초기화 메서드)를 호출할 때 사용
my_dog = Dog("Buddy", "Golden Retriever")
print(f"{my_dog.name} is a {my_dog.species} of breed {my_dog.breed}.")
#부모 클래스에서 동물 종류
#자식 클래스에서 Dog
다형성
동일한 이름의 메서드가 여러 객체에서 다르게 동작할 수 있는 원칙
class Dog:
def speak(self):
return "멍멍!"
class Cat:
def speak(self):
return "야옹!"
def make_sound(animal):
print(animal.speak())
make_sound(Dog())
make_sound(Cat())
#같은 이름의 speak()메서드가 Dog객체, Cat객체에서 서로 다른 방식으로 구현
추상화
복잡한 시스템 단순화, 필요한 부분만 보여주고 나머지는 감추는 원칙
사용자는 객체의 내부 구현에 신경 쓰지 않고, 필요한 인터페이스만 사용 가능
from abc import ABC, abstractmethod
class Animal(ABC): # 추상 클래스
@abstractmethod
def speak(self):
pass
class Dog(Animal): # 구체 클래스
def speak(self):
return "멍멍!"
#abc모듈 : 추상 클래스를 정의할 때 사용
#ABC와 abstractmethod를 사용, 추상 클래스와 추상 메서드를 만들 수 있다.
#추상 클래스: 일반 클래스와 달리 직접 인스턴스화할 수 없고, 오직 상속을 통해서만 사용 가능
#ABC를 상속받아 추상 클래스로 선언
# @abstractmethod 데코레이터는 추상 메서드를 정의할 때 사용
#추상 메서드는 구체적인 구현을 가지지 않는 메서드
#이를 포함한 클래스는 반드시 이 메서드를 상속받은 클래스에서 구현해야 한다.
#상기 코드에서는 speak 메서드가 추상 메서드로 정의.
#Animal 클래스를 상속하는 모든 클래스는 speak 메서드를 구현해야만 한다.
#구체 클래스: 추상 클래스와 달리 인스턴스를 생성 가능
#Animal 클래스에서 정의한 speak 추상 메서드를 Dog 클래스에서 구현하고 있다.
#만약 Dog 클래스가 speak 메서드를 구현하지 않으면 에러가 발생
#Dog 클래스에서 speak 메서드를 구현, 이로 인해 Dog 클래스는 인스턴스화 가능.
'Python to AI' 카테고리의 다른 글
Decorator, Context Manager (0) | 2024.11.14 |
---|---|
Iterator, Generator (3) | 2024.11.14 |
File Objects - file mode, file method (0) | 2024.11.13 |
매직 메서드(Magic Methods), 클래스 메서드(Class Methods), 정적 메서드(Static Methods), 상속(Inheritance) (0) | 2024.11.12 |
Python 애증의 비트연산자 (0) | 2024.10.30 |