[TIL] class_1

chaerinΒ·2021λ…„ 2μ›” 11일
1

TIL

λͺ©λ‘ 보기
3/4
post-thumbnail

class

ν΄λž˜μŠ€λŠ” 객체λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•œ 문법이닀.

예λ₯Ό λ“€μ–΄ κ²Œμž„μ„ λ§Œλ“ λ‹€κ³  ν•˜λ©΄ 기사, λ§ˆλ²•μ‚¬, ꢁ수, μ‚¬μ œ λ“± μ§μ—…λ³„λ‘œ 클래슀λ₯Ό λ§Œλ“€μ–΄μ„œ ν‘œν˜„ν•  수 μžˆλ‹€. μ΄λ ‡κ²Œ νŠΉμ •ν•œ κ°œλ…μ΄λ‚˜ λͺ¨μ–‘μœΌλ‘œ μ‘΄μž¬ν•˜λŠ” 것을 객체(object)라고 ν•œλ‹€. ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ μ΄λŸ¬ν•œ 객체λ₯Ό λ§Œλ“€ λ•Œ μ‚¬μš©ν•˜λŠ” 것이 ν΄λž˜μŠ€μ΄λ‹€.

μΊλ¦­ν„°μ˜ 체λ ₯, λ§ˆλ‚˜, 물리 곡격λ ₯, μ£Όλ¬Έλ ₯ λ“±μ˜ 데이터λ₯Ό 속성(attribute)라고 ν•  수 있고,
λ² κΈ°, 찌λ₯΄κΈ° λ“±μ˜ κΈ°λŠ₯을 λ©”μ„œλ“œ(method)라고 ν•  수 μžˆλ‹€.

μ΄λ ‡κ²Œ ν”„λ‘œκ·Έλž˜λ°ν•˜λŠ” 방법을 객체지ν–₯(object oriented) ν”„λ‘œκ·Έλž˜λ°μ΄λΌκ³  ν•œλ‹€.

ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œ λ§Œλ“€κΈ°

ν΄λž˜μŠ€λŠ” class에 클래슀 이름을 μ§€μ •ν•˜κ³  :(콜둠)을 뢙인 λ’€ λ‹€μŒ 쀄뢀터 def둜 λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•˜λ©΄ λœλ‹€. μ—¬κΈ°μ„œ λ©”μ„œλ“œλŠ” 클래슀 μ•ˆμ— λ“€μ–΄μžˆλŠ” ν•¨μˆ˜λ₯Ό λœ»ν•œλ‹€.
λ©”μ„œλ“œμ˜ 첫 번째 λ§€κ°œλ³€μˆ˜λŠ” λ°˜λ“œμ‹œ selfλ₯Ό 지정해야 ν•œλ‹€.

class ν΄λž˜μŠ€μ΄λ¦„:
    def λ©”μ„œλ“œ(self):
        μ½”λ“œ

classλ₯Ό μ„ μ–Έν•  λ•Œ class μ΄λ¦„μ˜ μ•žκΈ€μžλ₯Ό λŒ€λ¬Έμžλ‘œ ν•˜μ—¬ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. ν•œ 단어 μ΄μƒμœΌλ‘œ 이루어져 μžˆλ‹€λ©΄ 밑쀄 없이 λͺ¨λ“  단어λ₯Ό λ‹€ λΆ™μ΄λ˜ 각 λ‹¨μ–΄μ˜ μ•žκΈ€μžλŠ” λŒ€λ¬Έμžλ‘œ ν•΄μ„œ 단어λ₯Ό κ΅¬λΆ„ν•˜κ²Œ λœλ‹€.

κ°„λ‹¨ν•œ μ‚¬λžŒ 클래슀λ₯Ό λ§Œλ“€μ–΄μ„œ μ μš©ν•΄λ³΄μž.

class Person:
  def greeting(self):
	print('Hello')
# μΈμŠ€ν„΄μŠ€ = 클래슀()
james = Person()

Person으둜 λ³€μˆ˜ jamesλ₯Ό λ§Œλ“€μ—ˆλŠ”λ° 이 jamesκ°€ Person의 μΈμŠ€ν„΄μŠ€μ΄λ‹€.

ν΄λž˜μŠ€λŠ” νŠΉμ • κ°œλ…μ„ ν‘œν˜„λ§Œ ν•  뿐 μ‚¬μš©μ„ ν•˜κΈ° μœ„ν•΄μ„œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성해야 ν•œλ‹€.

λ©”μ„œλ“œ ν˜ΈμΆœν•˜κΈ°

λ©”μ„œλ“œλŠ” ν΄λž˜μŠ€κ°€ μ•„λ‹ˆλΌ μΈμŠ€ν„΄μŠ€λ₯Ό 톡해 ν˜ΈμΆœν•œλ‹€.

μ•„λž˜μ™€ 같이 μΈμŠ€ν„΄μŠ€ 뒀에 .(점)을 뢙이고 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ λœλ‹€.

# μΈμŠ€ν„΄μŠ€.λ©”μ„œλ“œ()
>>> james.greeting()
Hello

μ΄λ ‡κ²Œ μΈμŠ€ν„΄μŠ€λ₯Ό 톡해 ν˜ΈμΆœν•˜λŠ” λ©”μ„œλ“œλ₯Ό μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλΌκ³  ν•œλ‹€.

μΈμŠ€ν„΄μŠ€μ™€ 객체의 차이점?
사싀 μΈμŠ€ν„΄μŠ€μ™€ κ°μ²΄λŠ” 같은 것을 λœ»ν•œλ‹€.
보톡 객체만 지칭할 λ•ŒλŠ” κ·Έλƒ₯ 객체(object)라고 λΆ€λ₯΄μ§€λ§Œ ν΄λž˜μŠ€μ™€ μ—°κ΄€μ§€μ–΄μ„œ 말할 λ•Œλ―„ μΈμŠ€ν„΄μŠ€(instance)라고 λΆ€λ₯Έλ‹€.

a = list(range(10))
b = list(range(20))

리슀트 λ³€μˆ˜ a, bκ°€ 있으면 a, bλŠ” κ°μ²΄μž„κ³Ό λ™μ‹œμ— list 클래슀의 μΈμŠ€ν„΄μŠ€λΌκ³  ν•  수 μžˆλ‹€.

속성 μ‚¬μš©ν•˜κΈ°

속성(attribute)을 λ§Œλ“€ λ•ŒλŠ” __init__ λ©”μ„œλ“œ μ•ˆμ—μ„œ self.속성 에 값을 ν• λ‹Ήν•œλ‹€.

class ν΄λž˜μŠ€μ΄λ¦„:
  def __init__(self):
    self.속성 = κ°’

μ•žμ„œ λ§Œλ“  Person ν΄λž˜μŠ€μ— __init__ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•΄ 보자.

class Person:
  def __init__(self):
    self.hello = 'μ•ˆλ…•ν•˜μ„Έμš”.'
    
  def greeting(self):
	print(self.hello)
    
james = Person()
james.greeting()

# μ‹€ν–‰ κ²°κ³Ό
μ•ˆλ…•ν•˜μ„Έμš”.

__init__ λ©”μ„œλ“œλŠ” james = Person()처럼 ν΄λž˜μŠ€μ— ( )(κ΄„ν˜Έ)λ₯Ό λΆ™μ—¬μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ λ•Œ ν˜ΈμΆœλ˜λŠ” νŠΉλ³„ν•œ λ©”μ„œλ“œμ΄λ‹€.

πŸ”† μ€‘μš”

  • 속성은 __init__ λ©”μ„œλ“œ μ•ˆμ—μ„œ λ§Œλ“ λ‹€.
  • self에 .(점)을 뢙인 λ’€ 값을 ν• λ‹Ήν•œλ‹€.

μ•ž λ’€λ‘œ __(밑쀄 두 개)κ°€ 뢙은 λ©”μ„œλ“œλŠ” 파이썬이 μžλ™μœΌλ‘œ ν˜ΈμΆœν•΄μ£ΌλŠ” λ©”μ„œλ“œλ‘œ μŠ€νŽ˜μ…œ λ©”μ„œλ“œ(special method) λ˜λŠ” 맀직 λ§€μ„œλ“œ(magic method)라고 λΆ€λ₯Έλ‹€.

μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ λ•Œ κ°’ λ°›κΈ°

__init__ λ©”μ„œλ“œμ— self λ‹€μŒμ— 값을 받을 λ§€κ°œλ³€μˆ˜λ₯Ό μ§€μ •ν•œλ‹€.

그리고 λ§€κ°œλ³€μˆ˜λ₯Ό self.속성에 λ„£μ–΄μ€€λ‹€.

class ν΄λž˜μŠ€μ΄λ¦„:
    def __init__(self, λ§€κ°œλ³€μˆ˜1, λ§€κ°œλ³€μˆ˜2):
        self.속성1 = λ§€κ°œλ³€μˆ˜1
        self.속성2 = λ§€κ°œλ³€μˆ˜2

Person 클래슀둜 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ λ•Œ 이름, λ‚˜μ΄, μ£Όμ†Œλ₯Ό λ°›μ•„λ³΄μž.

class Person:
    def __init__(self, name, age, address):
        self.hello   = 'μ•ˆλ…•ν•˜μ„Έμš”.'
        self.name    = name
        self.age     = age
        self.address = address
 
    def greeting(self):
        print('{0} μ €λŠ” {1}μž…λ‹ˆλ‹€.'.format(self.hello, self.name))

__init__ λ©”μ„œλ“œλ₯Ό 보면 self λ‹€μŒμ— name, age, address λ₯Ό μ§€μ •ν–ˆλ‹€.
그리고 λ©”μ„œλ“œ μ•ˆμ—μ„œλŠ” self.name = name 처럼 λ§€κ°œλ³€μˆ˜λ₯Ό κ·ΈλŒ€λ‘œ self에 λ„£μ–΄μ„œ μ†μ„±μœΌλ‘œ λ§Œλ“€μ—ˆλ‹€.

greeting λ©”μ„œλ“œλŠ” 인사λ₯Ό ν•˜κ³  이름을 좜λ ₯ν•˜λ„λ‘ μˆ˜μ •ν–ˆλŠ”λ° 이름을 좜λ ₯ν•˜κΈ° μœ„ν•΄μ„œ name 속성에 μ ‘κ·Όν•  수 μžˆλ„λ‘ self.name 을 μ‚¬μš©ν•˜μ˜€λ‹€.

클래슀 μ•ˆμ—μ„œ μ ‘κ·Όν•  λ•ŒλŠ” self.속성 ν˜•μ‹μœΌλ‘œ μ ‘κ·Όν•˜μ§€λ§Œ
클래슀 λ°”κΉ₯μ—μ„œ 속성에 μ ‘κ·Όν•  λ•ŒλŠ” μΈμŠ€ν„΄μŠ€.속성 ν˜•μ‹μœΌλ‘œ μ ‘κ·Όν•œλ‹€.

maria = Person('λ§ˆλ¦¬μ•„', 20, 'μ„œμšΈμ‹œ μ„œμ΄ˆκ΅¬ λ°˜ν¬λ™')
maria.greeting()    # μ•ˆλ…•ν•˜μ„Έμš”. μ €λŠ” λ§ˆλ¦¬μ•„μž…λ‹ˆλ‹€.
 
print('이름:', maria.name)       # λ§ˆλ¦¬μ•„
print('λ‚˜μ΄:', maria.age)        # 20
print('μ£Όμ†Œ:', maria.address)    # μ„œμšΈμ‹œ μ„œμ΄ˆκ΅¬ λ°˜ν¬λ™

Person의 κ΄„ν˜Έ μ•ˆμ— 이름, λ‚˜μ΄, μ£Όμ†Œλ₯Ό 콀마둜 κ΅¬λΆ„ν•΄μ„œ 넣은 뒀에 λ³€μˆ˜(maria)에 ν• λ‹Ήν•œλ‹€.

이 과정을 거치면 이름은 'λ§ˆλ¦¬μ•„', λ‚˜μ΄λŠ” 20, μ£Όμ†ŒλŠ” 'μ„œμšΈμ‹œ μ„œμ΄ˆκ΅¬ λ°˜ν¬λ™'인 maria μΈμŠ€ν„΄μŠ€κ°€ λ§Œλ“€μ–΄μ§„λ‹€.

μ‹€ν–‰ κ²°κ³Ό
μ•ˆλ…•ν•˜μ„Έμš”. μ €λŠ” λ§ˆλ¦¬μ•„μž…λ‹ˆλ‹€.
이름: λ§ˆλ¦¬μ•„
λ‚˜μ΄: 20
μ£Όμ†Œ: μ„œμšΈμ‹œ μ„œμ΄ˆκ΅¬ λ°˜ν¬λ™

λΉ„κ³΅κ°œ 속성 μ‚¬μš©ν•˜κΈ°

λΉ„κ³΅κ°œ 속성(private attribute)λŠ” 클래슀 λ°”κΉ₯μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†κ³  클래슀 μ•ˆμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

λΉ„κ³΅κ°œ 속성은 __속성과 같이 이름이 __(밑쀄 두 개)둜 μ‹œμž‘ν•΄μ•Ό ν•œλ‹€.

__속성__ 처럼 밑쀄 두 κ°œκ°€ μ–‘ μ˜†μ— 왔을 λ•ŒλŠ” λΉ„κ³΅κ°œ 속성이 μ•„λ‹ˆλ―€λ‘œ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

class Person:
    def __init__(self, name, age, address, wallet):
        self.name = name
        self.age = age
        self.address = address
        self.__wallet = wallet    # λ³€μˆ˜ μ•žμ— __λ₯Ό λΆ™μ—¬μ„œ λΉ„κ³΅κ°œ μ†μ„±μœΌλ‘œ λ§Œλ“¦
 
maria = Person('λ§ˆλ¦¬μ•„', 20, 'μ„œμšΈμ‹œ μ„œμ΄ˆκ΅¬ λ°˜ν¬λ™', 10000)
maria.__wallet -= 10000    # 클래슀 λ°”κΉ₯μ—μ„œ λΉ„κ³΅κ°œ 속성에 μ ‘κ·Όν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•¨


μ°Έκ³  μ‚¬μ΄νŠΈ : https://dojang.io/mod/page/view.php?id=2374

0개의 λŒ“κΈ€