oop는 객체지향 프로그램밍입니다.
객체지향을 하면서 주의깊게 보는 단어는 캡슐화 인것 같습니다.
OOP를 사용하면 코드를 더 나은 방법으로 이해하기 쉽고, 보다 전문적으로 개발할 수 있다는 큰 장점을 얻을 수 있습니다.
객체지향프로그래밍의 신비한 점은 데이터를 기반으로 동작하는 함수로 데이터를 캡슐화할 수 있다는 것입니다.
객체 지향 프로그래밍을 사용하면 다른 종류의 데이터와 함수들을 모두 하나의 파일에 가지고 있는 것보다 데이터를 더 구체적으로 구성할 수 있습니다. 이를 Box, Object, Bubble 등으로 부를 수 있습니다.
OOP는 코드를 보다 확장 가능하게 만들어주며 필요한 구조와 정신적인 규칙 및 모델을 제공합니다.
OOP는 데이터를 어떻게 구조화할지를 알려주고, 데이터를 수정하기 위한 함수를 어디에 넣어야 하는지에 대한 안내 역할을 합니다.
그렇게 되면 같은 수준에서 수많은 딕셔너리로 모두 다른 일을 하는 함수를 갖고 있을 필요가 없어집니다.
여기서 클래스 내부의 메소드 안에 self인자 여기선 potato는 ruffus에 들어간 클레스 주소랑 같은 내용이 들어가 있습니다.
이로써 우리는 각각의 객체를 가지고 있는 클래스 인스턴스를 가질 수 있게 되는 것입니다.
그러면 그 주소에 특정 변수를 넣어줄수도 있는데. 해당 주소에 .name이라는 변수값으로 이름을 넣고주고 출력할 때에도 클래스 밖에서는 ruffus로 설정을 했기 때문에 ruffus.name으로 print를 하게 되면 해당 값을 가져올 수 있게 되는 것 입니다.
__str__을 설정하면 print로 클래스를 출력시 클래스 주소를 보여주는 것 대신 나오는 것을 설정할 수 있습니다.
class Character:
def __init__(self, name, health, armor):
self.name = name
self._health = health # 내부에서 _health로 저장
self.armor = armor
# 코드의 구조화 및 캡슐화 - test 1
def damage(self, dmg):
# 방어구로 데미지 감소 처리
reduced_dmg = self._calculate_damage(dmg)
self._apply_damage(reduced_dmg)
def _calculate_damage(self, dmg):
# 방어구를 고려한 데미지 감소 계산
return dmg - self.armor
def _apply_damage(self, dmg):
self._health -= dmg
print(f"Received {dmg} damage. Health is now {self._health}.")
# 속성처럼 접근 가능! test 2
@property
def health(self):
return self._health
@health.setter
def health(self, value):
# 유효성 검사 등 추가 가능
if value < 0:
self._health = 0
else:
self._health = value
def __str__(self):
return f"Character(name : {self.name}, Health: {self._health}, Armor: {self.armor})"
# 객체 생성
user = Character("billy", 100, 10)
user.damage(20) # test 1 - 체력에 데미지 적용
# 체력 확인
print(f"Current health: {user.health}") # 속성처럼 체력 확인 test 2
print(user) # Character(name : billy, Health: 90, Armor: 10)
user.name = "jean"
print(user) # Character(name : jean, Health: 90, Armor: 10)
이렇게 만들어 볼 수 있습니다.
또한 두개의 클래스를 연관해서 사용하는 것도 가능합니다.'
클래스를 호출하여 사용하는 방법
class player:
def __init__(self, name, team):
self.name = name
self.team = team
def introduce(self):
print(f"Hello my name is {self.name} I paly for {self.team}")
class team:
def __init__(self, team_name):
self.team_name = team_name
self.players = []
def add_player(self, name):
new_player = player(name, self.team_name)
self.players.append(new_player)
def show_player(self):
for player in self.players:
player.introduce()
team_billy = team("billy")
team_billy.add_player("jun")
team_billy.show_player()
부모의 클래스를 상속받아서 사용
class dog:
def __init__(self, name, age, type):
self.name = name
self.age = age
self.type = type
def say(self):
print(
f"Hi my name is {self.name} I am {self.age} years old and my type is {self.type}")
class old_dog(dog):
def __init__(self, name, type):
super().__init__(name, 7, type)
self.dead = False
def zzz(self):
print("zzzzzz")
class young_dog(dog):
def __init__(self, name, type):
super().__init__(name, 1, type)
self.happy = True
def woff(self):
print("woff woff")
billy = old_dog("billy", "jean")
jun = young_dog("jun", "ang")
billy.say() # Hi my name is billy I am 7 years old and my type is jean
jun.say() # Hi my name is jun I am 1 years old and my type is ang
billy.zzz() # zzzzzz
jun.woff() # woff woff
이렇게 객체지향 프로그래밍을 만들수 있습니다.