8μ°¨μ κ°μ μ£Όμ λ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ λλ€.
01. κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°
1) κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ λ°°μ°λ μ΄μ
- λ€λ₯Έ μ¬λμ΄ μμ±ν μ½λλ₯Ό μ΄λ»κ² μ¬μ©νλ©΄ μ’μμ§μ λν λ΅
- λ΄κ° μλ λ¨μ΄ λ§λ μ½λλ₯Ό μ¬μ¬μ©νκ³ μΆμ λ μ¬μ©νλ λνμ μΈ λ°©λ²
- μ΄λ€ κΈ°λ₯μ μννλ νλμ λ¨μΌ νλ‘κ·Έλ¨μ κ°μ²΄λΌκ³ νλ μ½λλ‘ λ§λ€μ΄ λ€λ₯Έ νλ‘κ·Έλλ¨Έκ° μ¬μ¬μ©ν μ μλλ‘ νλ€
2) κ°μ²΄μ ν΄λμ€
κ°μ²΄(object)λ μ€μνμ μ‘΄μ¬νλ μ€μ μ μΈ λ¬Όκ±΄ λλ κ°λ μ λ»νλ©°, μμ±κ³Ό νλμΌλ‘ ꡬμ±λλ€. κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ μ΄λ¬ν κ°μ²΄μ κ°λ μ νμ©νμ¬ νλ‘κ·Έλ¨μΌλ‘ νννλ κΈ°λ²μ΄λ€.
- μμ±(attribute) : κ°μ²΄κ° κ°μ§κ³ μλ λ³μ
- νλ(action) : κ°μ²΄κ° μ€μ λ‘ μλμν€λ ν¨μ, λ©μλ
μ) μΈκ³΅μ§λ₯ μΆκ΅¬ νλ‘κ·Έλ¨μ λ§λ€ λλ₯Ό μκ°ν΄λ³΄μ. νλ‘κ·Έλ¨μ λ§λ€κΈ° μν΄ μ΄λ€ μ’ λ₯μ κ°μ²΄κ° νμνμ§ μκ°ν΄μΌ νλ€. κ²μμ ꡬμ±νλ λ¨μλ‘ μ¬ν, μ μ, νμ΄ μλλ° μ΄ κ°λ μ κ°μ²΄λΌκ³ ν μ μλ€. ‘μ μ’ κ°μ²΄μ κ²½μ° μ μ μ΄λ¦, ν¬μ§μ , μμν λ±μ΄ νλμ μμ±μ΄κ³ , ‘곡μ μ°¨λ€’, ‘ν¨μ€νλ€’μ κ°μ κ°λ μ νλμΌλ‘ μκ°νλ©΄ λλ€.
κ°μ²΄λ νλμ νλ‘κ·Έλ¨μμ μ¬λ¬ κ°κ° μ¬μ©λ μλ μλ€. λ°λΌμ κ°μ²΄λ€μ μν μ€κ³λλ₯Ό λ§λ€μ΄μΌ νλ€. μ΄λ₯Ό νλ‘κ·Έλ¨μμλ ν΄λμ€(class)λΌκ³ νλ€.
- ν΄λμ€(class) : κ°μ²΄κ° κ°μ ΈμΌ ν κΈ°λ³Έ μ 보λ₯Ό λ΄μ μ½λ, μΌμ’ μ μ€κ³λ μ½λλΌκ³ μκ°.
μ) μΆκ΅¬ μ μ κ°μ²΄λ₯Ό λ§λ λ€λ©΄ μ μ μ΄λ¦, ν¬μ§μ , μμν λ±μ κΈ°λ³Έμ μΌλ‘ κ°μ ΈμΌ ν μμ±μ΄λ€. μ΄λ¬ν μ 보λ₯Ό ν΄λμ€μ λ΄κ³ μ€μ μμ±λλ κ°μ²΄μλ μν₯λ―Ό, μ΄κ°μΈ κ°μ μ μ μ΄λ¦μ ν λΉνλ€. μ΄λ κ² ν΄μ μ€μ λ‘ μμ±λλ κ°μ²΄λ₯Ό μΈμ€ν΄μ€(instance)λΌκ³ νλ€.
μ) ‘DOG’ λΌλ ν΄λμ€κ° μλ€λ©΄, μ€μ μ¬μ©νλ μ’ λ₯λ³λ‘ μ¬λ¬ λ§λ¦¬μ Dog μΈμ€ν΄μ€λ₯Ό λ§λ€ μ μλ€.
02. νμ΄μ¬μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°
1) ν΄λμ€ κ΅¬ννκΈ°
π‘ class SoccerPlayer(object): ν΄λμ€ μμ½μ΄, ν΄λμ€ μ΄λ¦, μμλ°λ κ°μ²΄λͺ
μμ§ μμμ κ°λ μ λ°°μ°μ§ μμμ§λ§ κ°λ¨ν μ€λͺ νλ©΄, κΈ°μ‘΄μ λ§λ ν΄λμ€μ νΉμ§μ κ·Έλλ‘ μ΄μ΄λ°μ μ¬μ©νλ κ²μ λ§νλ€. μμμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ μ₯μ μ€ νλμΈλ°, μ΄ νΉμ§μ λ€μμ λ€μ λ€λ£¨λλ‘ νμ.
π‘ νμ΄μ¬μμ μμ£Ό μ¬μ©νλ μλͺ κΈ°λ² (μμλ§ λμ)
snake_case : λμ΄μ°κΈ° λΆλΆμ ‘_’λ₯Ό μΆκ°νμ¬ λ³μμ μ΄λ¦μ μ§μ ν¨. νμ΄μ¬ ν¨μλ λ³μλͺ μ μ¬μ©λλ€.
CamelCase : λμ΄μ°κΈ° λΆλΆμ λλ¬Έμλ₯Ό μ¬μ©νμ¬ λ³μμ μ΄λ¦μ μ§μ ν¨. νμ΄μ¬ ν΄λμ€λͺ μ μ¬μ©λλ€.
ν΄λμ€ μ μΈμ κΈ°λ³Έμ μμμΌλ μΆκ΅¬ μ μ ν΄λμ€λ₯Ό ꡬμ±ν΄λ³΄μ.
1. μμ±μ μ μΈ
μμ±μ λν μ 보λ₯Ό μ μΈνκΈ° μν΄μλ __init__( ) λΌλ μμ½ ν¨μλ₯Ό μ¬μ©νλ€. μ΄ μΈμ μμ½ ν¨μλ‘ __str__ , __add__ λ±μ΄ μλ€. μ΄λ¬ν ν¨μλ€μ μ½μλ ννμ μμ μ μνμμΌ μ€λ€.
class SoccerPlayer(object):
def __init__(self, name, position, back_number):
self.name = name
self.position = position
self.back_number = back_number
- __init__( ) ν¨μ : ν΄λμ€μμ μ¬μ©ν λ³μλ₯Ό μ μνλ ν¨μ
- 첫λ²μ§Έ 맀κ°λ³μλ λ°λμ self λ³μλ₯Ό μ¬μ©ν΄μΌ νλ€.
self λ³μλ ν΄λμ€μμ μμ±λ μΈμ€ν΄μ€μ μ κ·Όνλ μμ½μ΄μ΄λ€. μ΄ν΄νκΈ° μ΄λ ΅λ€λ©΄ μμ±λ μΈμ€ν΄μ€λ₯Ό μ§μ νλ λ³μλΌκ³ μκ°νλ©΄ λλ€. - self λ€μ 맀κ°λ³μλ€μ μ€μ λ‘ ν΄λμ€κ° κ°μ§ μμ±μΌλ‘ μ μ μ΄λ¦, ν¬μ§μ , λ±λ²νΈ λ±μ΄κ³ μ΄ κ°λ€μ μ€μ λ‘ μμ±λλ μΈμ€ν΄μ€μ ν λΉλλ€. ν λΉλλ μ½λλ self.name = name (=μμ±λ μΈμ€ν΄μ€μ μλ name λ³μμ 맀κ°λ³μλ‘ μ λ ₯λ name κ°μ ν λΉνλ€λ λ»)μ΄λ€. ν΄λμ€μ λ³μλ ‘self.λ³μμ΄λ¦’μΌλ‘ init( ) ν¨μμμ μμ λ‘κ² μμ±ν μ μλ€.
2. ν¨μμ μ μΈ
ν¨μλ μ΄ ν΄λμ€κ° ν μ μλ λ€μν λμμ μ μν μ μλ€. λ±λ²νΈ κ΅μ²΄ λΌλ ν»μΉμ μ½λλ‘ ννν΄λ³΄μ.
class SoccerPlayer(object):
def change_back)number(self, new_number):
print("μ μμ λ±λ²νΈλ₯Ό λ³κ²½νλ€: From %d to %d" % (self,back_number, new_number))
self.back_number = new_number
- κΈ°μ‘΄ ν¨μμ κ°μ΄ ν¨μμ μ΄λ¦μ μ°κ³ 맀κ°λ³μλ₯Ό μ¬μ©νλ€. κ°μ₯ μ€μν μ μ selfλ₯Ό 맀κ°λ³μμ λ°λμ λ£μ΄μΌ νλ€λ κ²μ΄λ€. selfκ° μμ΄μΌλ§ μ€μ λ‘ μΈμ€ν΄μ€κ° μ¬μ©ν μ μλ ν¨μλ‘ μ μΈλλ€. κ·Έ μΈμ μ¬μ©λ²μ μΌλ°μ μΈ ν¨μμ κ°λ€.
3. _μ μ°μ
μΌλ°μ μΌλ‘ _μ μ°μμ κ°μμ λ°λΌ μ¬λ¬ κ°μ§λ‘ λλ μ μλ€.
_ 1κ°λ μ΄νλ‘ μ°μ΄μ§ μμ λ³μμ νΉλ³ν μ΄λ¦μ λΆμ¬νκ³ μΆμ§ μμ λ μ¬μ©νλ€.
for _ in range(10):
print("Hello, World")
- ‘Hello, World’λ₯Ό νλ©΄μ 10λ² μΆλ ₯νλ ν¨μμ΄λ€. νμλ₯Ό μΈλ _ λ³μλ νΉλ³ν μ©λκ° μμΌλ―λ‘ λ€μμ μ¬μ©λμ§ μλλ€.
_ 2κ°λ₯Ό μ¬μ©νλ©΄ νΉμν μμ½ ν¨μλ λ³μλ₯Ό μλ―Ένλ€. str__μ΄λ __ init( ) κ°μ ν¨μκ° μλ€. __ str__( ) ν¨μλ ν΄λμ€λ‘ μΈμ€ν΄μ€λ₯Ό μμ±νμ λ, κ·Έ μΈμ€ν΄μ€ μ체λ₯Ό print( ) ν¨μλ‘ νλ©΄μ μΆλ ₯νλ©΄ λμ€λ κ°μ λ»νλ€.
λ€μν μ©λκ° μμΌλ _μ νΉμν μ©λμ λν΄μλ μΈμ§ν΄λλ κ²μ΄ μ’λ€.
2) μΈμ€ν΄μ€ μ¬μ©νκΈ°
- μΈμ€ν΄μ€λ ν΄λμ€μμ μ€μ μ μΈ λ°μ΄ν°κ° μ λ ₯λμ΄ μ¬μ©ν μ μλ ννμ κ°μ²΄λ₯Ό λ»νλ€.
π‘ jinhyun = SoccerPlayer(”Jinhyun”, “MF”, 10): κ°μ²΄λͺ , ν΄λμ€ μ΄λ¦, init ν¨μ μΈν°νμ΄μ€ μ΄κΉκ°
# μ 체 SoccerPlayer μ½λ
class SoccerPlayer(object):
def __init__(self, name, position, back_number):
self.name = name
self.position = position
self.back_number = back_number
def change_back_number(self, new_number):
print("μ μμ λ±λ²νΈλ₯Ό λ³κ²½νλ€: From %d to %d" % (self.back_number, new_number))
self.back_number = new_number
def __str__(self):
return "Hello, My name is %s. I play in %s in center." % (self.name, self.position)
# SoccerPlayerλ₯Ό μ¬μ©νλ instance μ½λ
jinhyun = SoccerPlayer("Jinhyun", "MF", 10)
print("νμ¬ μ μμ λ±λ²νΈλ:", jinhyun.back_number)
jinhyun.change_back_number(5)
print("νμ¬ μ μμ λ±λ²νΈλ:", jinhyun.back_number)
# μΆλ ₯κ²°κ³Ό (κ°κ° 16, 17, 18ν μ€νκ²°κ³Όμ΄λ€)
νμ¬ μ μμ λ±λ²νΈλ: 10
μ μμ λ±λ²νΈλ₯Ό λ³κ²½νλ€: From 10 to 5
νμ¬ μ μμ λ±λ²νΈλ: 5
3) ν΄λμ€λ₯Ό μ¬μ©νλ μ΄μ
- μμ μ μ½λλ₯Ό λ€λ₯Έ μ¬λμ΄ μμ½κ² μ¬μ©ν μ μλλ‘ μ€κ³νκΈ° μν¨
- μ½λλ₯Ό μ’ λ μμ½κ² μ μΈν μ μλ€λ μ₯μ λ μλ€
# λ°μ΄ν°
names = ["Messi","Ramos","Ronaldo","Park","Buffon"]
positions = ["MF","DF","CF","WF","GK"]
numbers = [10,4,7,13,1]
# μ΄μ°¨μ 리μ€νΈ
players = [[name, position, number] for name, position, number in zip(names, positions, numbers)]
print(players)
print(players[0])
# μ 체 SoccerPlayer μ½λ
class SoccerPlayer(object):
def __init__(self, name, position, back_number):
self.name = name
self.position = position
self.back_number = back_number
def change_back_number(self, new_number):
print("μ μμ λ±λ²νΈλ₯Ό λ³κ²½νλ€: From %d to %d" % (self.back_number, new_number))
self.back_number = new_number
def __str__(self):
return "Hello, My name is %s. I play in %s in center." % (self.name, self.position)
# ν΄λμ€-μΈμ€ν΄μ€
player_objects = [SoccerPlayer(name, position, number) for name, position, number in zip(names, positions, numbers)]
print(player_objects[0])
# μΆλ ₯κ²°κ³Ό (κ°κ° printλ¬Έμ λν μ€ν κ²°κ³Ό)
[['Messi', 'MF', 10], ['Ramos', 'DF', 4], ['Ronaldo', 'CF', 7], ['Park', 'WF', 13], ['Buffon', 'GK', 1]]
['Messi', 'MF', 10]
Hello, My name is Messi. I play in MF in center.
03. κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ νΉμ§
1) μμ
- μμ(inheritance) : μ΄λ¦ κ·Έλλ‘ λ¬΄μμΈκ°λ₯Ό λ΄λ €λ°λ κ²μ λ»νλ©°, λΆλͺ¨ ν΄λμ€μ μ μλ μμ±κ³Ό λ©μλλ₯Ό μμ ν΄λμ€κ° λ¬Όλ €λ°μ μ¬μ©νλ κ²μ λ§νλ€.
class Person(object):
pass
objectκ° Person ν΄λμ€μ λΆλͺ¨ ν΄λμ€μ΄λ€. objectλ νμ΄μ¬μμ μ¬μ©νλ κ°μ₯ κΈ°λ³Έ κ°μ²΄(base object)μ΄λ©°, νμ΄μ¬ μΈμ΄κ° κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ΄λ―λ‘ λͺ¨λ λ³μλ κ°μ²΄μ΄λ€.
a = "abc"
print(type(a))
<class 'str'>
λ¬Έμμ΄νμ΄λΌκ³ λΆλ μ§λ§ λ΄λΆμ μΌλ‘λ κ°μ²΄λ‘ μ²λ¦¬λμλ€. νμ΄μ¬μ λͺ¨λ κ°μ²΄λ object κ°μ²΄λ₯Ό μμνλ€.
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
class Korean(Person):
pass
first_korean = Korean("Sungshul", 35)
print(first_korean.name) # Sungchul μΆλ ₯
class Person(object): # λΆλͺ¨ ν΄λμ€ Person μ μΈ
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def about_me(self): #μμλ μ μΈ
print("μ μ μ΄λ¦μ", self.name, "μ΄κ³ μ, μ λμ΄λ", str(self.age), "μ΄μ
λλ€.")
class Employee(Person):
def __init__(self, name, age, gender, salary, hire_date):
super().__init__(name, age, gender)
self.salary = salary
self.hire_date = hire_date
def do_work(self):
print("μ΄μ¬ν μΌμ νλ€.")
def about_me(self):
super().about_me()
print("μ κΈμ¬λ", self.salary, "μμ΄κ³ , μ μ
μ¬μΌμ", self.hire_date, "μ
λλ€.")
2) λ€νμ±
- λ€νμ±(polymorphism) : κ°μ μ΄λ¦μ λ©μλκ° λ€λ₯Έ κΈ°λ₯μ νλ κ²μ λ§ν¨
- κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ λ€λ₯Έ μ¬λμ μ½λλ₯Ό μ½κ² μ¬μ¬μ©νκΈ° μν΄ μ¬μ©νλλ° μ΄λ₯Ό μν΄μλ λ΄λΆμ μΈ κ΅¬ν κ³Όμ μ μ λͺ¨λ₯΄λλΌλ κ·Έ ν¨μλ ν΄λμ€μ μν μ λͺ νν μ νμκ° μμ
n_crawler = NaverCrawler()
d_crawler = DaumCrawler()
crawlers = [n_crawler, d_crawler]
news = []
for crawler in crawlers:
news.append(crawler.do_crawling())
class Animal:
def __init__(self, name):
self.name = name
def talk(self):
raise NotImplementedError("Subclass must implement abstract method")
class Cat(Animal):
def talk(self):
return 'Meow!'
class Dog(Animal):
def talk(self):
return 'Woof! Woof!'
animals = [Cat('Missy'), Cat('Mr,Mistoffelees'), Dog('Lassie')]
for animal in animals:
print(animal.name + ':' + animal.talk())
# μΆλ ₯κ²°κ³Ό
Missy:Meow!
Mr,Mistoffelees:Meow!
Lassie:Woof! Woof!
3) κ°μμ±
- κ°μμ±(visibility) : κ°μ²΄μ μ 보λ₯Ό λ³Ό μ μλ λ 벨μ μ‘°μ νμ¬ κ°μ²΄μ μ 보 μ κ·Όμ μ¨κΈ°λ κ²
- μΊ‘μν(encapsulation) : κ°μ²΄μ 맀κ°λ³μ μΈν°νμ΄μ€λ§ λͺ νν μλ©΄ κ°μ²΄λ₯Ό μ¬μ©ν μ μλλ°, κ°μ²΄μ μΈλΆ λ΄μ©μ λͺ¨λ₯Έ μ± κ°μ²΄μ μ¬μ©λ²λ§ μκ³ μ¬μ©νλ€λ λ»
- μ 보 μλ(information hiding) : μΈλΆμμ μ½λ λ΄λΆλ₯Ό λ³Ό μ μκ² νκΈ° μν΄ λ΄λΆμ μ 보λ₯Ό μ¨κΈ°λ κ°λ
μΊ‘μνμ μ 보μλμΌλ‘ ννμ λ€λ₯΄κ² νμ§λ§ λ λ€ μ½λμ λ΄λΆ ꡬνμ μ ν΄μ μΈλΆμμ μ½κ² μ¬μ©νκ² νκ³ , μ½λμ μΈλΆμ μΈ λ΄μ©μ λͺ¨λ₯΄κ² νλ€λ μΈ‘λ©΄μμ λΉμ·ν μλ―Έλ‘ μ¬μ©λλ€.
μΊ‘μνλ₯Ό μ¬μ©ν΄μΌ νλ μ΄μ ? μ¬λ¬ κ°μ§κ° μμ§λ§ ν΄λμ€λ₯Ό μ€κ³ν λ ν΄λμ€ κ° κ°μ λ° μ 보 곡μ λ₯Ό μ΅μννμ¬ κ°λ³ ν΄λμ€κ° λ¨λ μΌλ‘λ μ λμν μ μλλ‘ ν΄μΌ νκΈ° λλ¬Έμ΄λ€. λν, μ¬μ©μ μ μ₯μμλ μμΈν λ΄μ©μ λͺ¨λ₯΄λλΌλ μΈν°νμ΄μ€λ₯Ό μ΄ν΄νλ©΄ ν΄λμ€λ₯Ό μ½κ² μ¬μ©ν μ μλ€. νμ΄μ¬μμλ μ΄λ¬ν κ°λ μ κ°μμ±μ΄λΌλ μ΄λ¦μΌλ‘ μ μ©μν€κ³ , μ 보 μλμ μ΄λ»κ² ν κ²μΈκ°λ₯Ό μ½λ λ 벨μμ μ‘°μ νλ€.
μ€μ νμ΄μ¬μ κ°μμ± μ¬μ© λ°©λ²μ λν΄ μμλ₯Ό λ€μ΄ μ€λͺ νκ² λ€. μ½λλ₯Ό μμ±ν΄μΌ νλ μν©μ λ€μκ³Ό κ°λ€.
- Product κ°μ²΄λ₯Ό Inventory κ°μ²΄μ μΆκ°
- Inventoryμλ μ€μ§ Product κ°μ²΄λ§ λ€μ΄κ°
- Inventoryμ Productκ° λͺ κ°μΈμ§ νμΈμ΄ νμν¨
- Inventoryμ Product itemsλ μ§μ μ κ·Όμ΄ λΆκ°ν¨
class Product(object):
pass
class Inventory(object):
def __init__(self):
self.__items = []
def add_new_item(self, product):
if type(product) == Product:
self.__items.append(product)
print("new item added")
else:
raise ValueError("Invalid Item")
def get_number_of_items(self):
return len(self.__items)
my_inventory = Inventory()
my_inventory.add_new_item(Product())
my_inventory.add_new_item(Product())
my_inventory.__items
# μΆλ ₯κ²°κ³Ό
new item added
new item added
Traceback (most recent call last):
File "C:\\Users\\hahnp\\PycharmProjects\\study_only\\dsob_week8\\visibility1.py", line 20, in <module>
my_inventory.__items
AttributeError: 'Inventory' object has no attribute '__items'
class Inventory(object):
def __init__(self):
self.__items = []
@property
def itmes(self):
return self.__items