κΈ°λ³Έ μ •μ˜

객체?

속성(μƒνƒœ =state, value, attribute)+행동(λ™μž‘,μ—­λŸ‰ =behavior, method)

 

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP: object-oriented programming)

μš°λ¦¬κ°€ μ‚΄κ³  μžˆλŠ” μ‹€μ œ 세계가 객체(object)λ“€λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλŠ” 것과 같이 μ†Œν”„νŠΈμ›¨μ–΄λ„ 객체 κ°œλ…μ„ μ μš©μ‹œν‚€λŠ” 기법

컴퓨터 ν”„λ‘œκ·Έλž¨μœΌλ‘œ ν•΄κ²°ν•΄μ•Όν•˜λŠ” 문제λ₯Ό μ‹€μ œ μ„Έμƒμ—μ„œ 처럼 λ‹€μ–‘ν•­ 정보듀을 κ°€μ§„ κ°μ²΄λ“€λ‘œ ν‘œν˜„ν•˜κ³ , κ·Έ 객체듀간 ν†΅μ‹ μœΌλ‘œ ν•΄κ²°ν•œλ‹€.

νŒŒμ΄μ¬μ€ 객체둜 κ΅¬μ„±λ˜μ–΄μžˆκ³  객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ κ°€λŠ₯ν•˜κ²Œν•˜λŠ” μ–Έμ–΄μ΄λ©΄μ„œ, κ°μ²΄μ§€ν–₯ν”„λ‘œκ·Έλž˜λ°μ„ κ°•μ œν•˜μ§€ μ•ŠλŠ” ν”„λ‘œκ·Έλž˜λ° 언어이닀.

 

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ λ©”μ†Œλ“œ

객체 = ν•„λ“œ + λ©”μ†Œλ“œ

 

클래슀?

객체에 λŒ€ν•œ 섀계도λ₯Ό 클래슀(class)라고 ν•œλ‹€.

ν΄λž˜μŠ€λ‘œλΆ€ν„° λ§Œλ“€μ–΄μ§€λŠ” 각각의 객체λ₯Ό κ·Έ 클래슀의 μΈμŠ€ν„΄μŠ€(instance)라고 ν•œλ‹€.

ex. 클래슀 = λΆ•μ–΄λΉ΅ ν‹€, 객체 = λΆ•μ–΄λΉ΅

 

μΊ‘μŠν™”(encapsulation)?

데이터와 μ•Œκ³ λ¦¬μ¦˜μ„ ν•˜λ‚˜λ‘œ λ¬ΆλŠ”λ‹€.

곡용 μΈν„°νŽ˜μ΄μŠ€λ§Œ μ œκ³΅ν•˜κ³  κ΅¬ν˜„ μ„ΈλΆ€ 사항을 κ°μΆ”λŠ” 것이닀.

 

μƒμ„±μž(constructor)?

객체가 생성될 λ•Œ 객체λ₯Ό κΈ°λ³Έκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜λŠ” νŠΉμˆ˜ν•œ λ©”μ†Œλ“œμ΄λ‹€.

 

정보 은닉

κ΅¬ν˜„μ˜ μ„ΈλΆ€ 사항을 클래슀 μ•ˆμ— κ°μΆ”λŠ” 것

λ³€μˆ˜λŠ” 감좔고, μ™ΈλΆ€μ—μ„œλŠ” λ©”μ„œλ“œλ“€λ§Œ μ‚¬μš©ν•˜λ„λ‘ ν•˜λŠ” 것

 

μ ‘κ·Όμžμ™€ μ„€μ •μž

ν•˜λ‚˜λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜κ°’μ„ λ°˜ν™˜ν•˜λŠ” μ ‘κ·Όμž(getters)이고, 또 ν•˜λ‚˜λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜κ°’μ„ μ„€μ •ν•˜λŠ” μ„€μ •μž(setters)이닀.

 

정적 λ³€μˆ˜

이듀 λ³€μˆ˜λŠ” λͺ¨λ“  객체λ₯Ό ν†΅ν‹€μ–΄μ„œ ν•˜λ‚˜λ§Œ μƒμ„±λ˜κ³  λͺ¨λ“  객체가 이것을 곡유 ν•˜κ²Œ λœλ‹€.

μ΄λŸ¬ν•œ λ³€μˆ˜λ₯Ό 정적 멀버 λ˜λŠ” 클래슀 멀버(class member)라고 ν•œλ‹€.

 

 

 

 

 

클래슀(class)

μ—¬λŸ¬ 개의 ν•¨μˆ˜μ™€ 자료λ₯Ό λ¬Άμ–΄μ„œ 객체 생성 도ꡬ 
κ΅¬μ„±μš”μ†Œ : λ©”μ„œλ“œ(ν•¨μˆ˜) + λ³€μˆ˜(자료) + μƒμ„±μž(객체 생성) 
멀버(member) : λ©€λ²„λ©”μ„œλ“œ, λ©€λ²„λ³€μˆ˜
 

μœ ν˜• 
1) μ‚¬μš©μžμ •μ˜ν΄λž˜μŠ€ : μ‚¬μš©μžκ°€ 클래슀 μž‘μ„± 
2) λͺ¨λ“ˆ 클래슀 : νŒŒμ΄μ¬μ— 제곡 클래슀

ν˜•μ‹)
class ν΄λž˜μŠ€λͺ… :
   λ©€λ²„λ³€μˆ˜ = μžλ£Œ 
   def λ©€λ²„λ©”μ„œλ“œ() :
       λͺ…λ Ήλ¬Έ
   μƒμ„±μž : κ°μ²΄ μƒμ„±



1. μ€‘μ²©ν•¨μˆ˜ 

def calc_fn(a, b) : # outer
    #data 생성 
    x = a # x = 10
    y = b # y = 20
    
    #inner : data μ‘°μž‘/처리 
    def plus() : #λ§μ…ˆ 
        p = x + y
        return p
    
    def minus() : #λΊ„μ…ˆ 
        m = x - y 
        return m
    
    return plus, minus


ν•¨μˆ˜ 호좜 

plus, minus = calc_fn(10, 20)
print('plus = ', plus()) #plus =  30
print('minus =', minus()) #minus = -10

 



2. 클래슀 : μ€‘μ²©ν•¨μˆ˜ -> 클래슀 λ³€κ²½ 

class calc_class :
    #λ©€λ²„λ³€μˆ˜(μ „μ—­λ³€μˆ˜) : 자료 생성   
    x = 0
    y = 0
    
    #μƒμ„±μž : 객체 생성 + λ©€λ²„λ³€μˆ˜ μ΄ˆκΈ°ν™”. ν•¨μˆ˜ ν˜•μ‹μ΄μ§€λ§Œ 고유 이름을 κ°€μ§€κ³  있음
    def __init__(self, a, b) :
        self.x = a #10
        self.y = b #20
    
    #λ©€λ²„λ©”μ„œλ“œ(ν•¨μˆ˜) : 자료 처리 
    def plus(self) : #self : 멀버접근(호좜) 
        p = self.x + self.y
        return p
    
    def minus(self) : #λΊ„μ…ˆ 
        m = self.x - self.y 
        return m


첫번째 객체 생성
* objλΌλŠ” 객체 μ•ˆμ— x=10, y=20, plus, minus λ©€λ²„λ“€λ‘œ κ΅¬μ„±λ˜μ–΄ 있음

obj = calc_class(10, 20) # μƒμ„±μž 호좜 -> object 생성 
type(obj) # __main__.calc_class
id(obj)


object.member(λ©€λ²„λ³€μˆ˜ + λ©€λ²„λ©”μ„œλ“œ)

print('x = ', obj.x) # x =  10
print('y = ', obj.y) # y =  20
print('plus = ', obj.plus()) # plus =  30
print('minus = ', obj.minus()) # minus =  -10


λ‘λ²ˆμ§Έ 객체 생성

obj2 = calc_class(100, 200) #μƒμ„±μž 호좜 -> object 생성 
print('x = ', obj2.x) #x =  100
print('y = ', obj2.y) #y =  200
print('plus = ', obj2.plus()) #plus =  300
print('minus = ', obj2.minus()) #minus =  -100

type(obj2) #__main__.calc_class
id(obj2)

 

 

 

 

 

 

λͺ¨λ“ˆ ν΄λž˜μŠ€ * λͺ¨λ“ˆ : ν•¨μˆ˜μ™€ ν΄λž˜μŠ€λ₯Ό ν¬ν•¨ν•œ νŒŒμ΄μ¬ νŒŒμΌ (*.py)

νŒŒμ΄μ¬μ—μ„œ μ œκ³΅ν•˜λŠ” 클래슀

μœ ν˜•
1) builtins λͺ¨λ“ˆ ν΄λž˜μŠ€ : λ‚΄μž₯ ν΄λž˜μŠ€. import과정이 ν•„μš” μ—†μŒ
2) import λͺ¨λ“ˆ ν΄λž˜μŠ€ : μ‚¬μš©μžκ°€ μ§μ ‘ κ°€μ Έ μ˜¨ ν΄λž˜μŠ€


 

1. builtins λͺ¨λ“ˆ 클래슀

import builtins
dir(builtins) #ν•¨μˆ˜μ™€ 클래슀 λͺ©λ‘


1) 자료ꡬ쑰 κ΄€λ ¨

list()
lst = list(range(10)) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#listλΌλŠ” 클래슀둜 lstλΌλŠ” 객체λ₯Ό λ§Œλ“¦

tuple()
t = tuple(lst)
t #(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

set()
s = set(lst)
s #{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

dict()
d = dict({'name' : 'hong', 'age' : 35})
d #{'name': 'hong', 'age': 35}


2) μžλ£Œν˜• λ³€ν™˜

int(25.5) #25
float(25) #25.0
str(10) + 'λŒ€' #10λŒ€
bool(1) #True : 0이 μ•„λ‹Œ λͺ¨λ“  μ‹€μˆ˜λ₯Ό True둜 λ°˜ν™˜
bool(0) #False


3) 기타

range(1, 11) #0λΆ€ν„° 11자리의 숫자 생성
type(lst) #object의 좜처(=class)




2. import λͺ¨λ“ˆ 클래슀

from datetime import date #from λͺ¨λ“ˆ import 클래슀

* dateμžλ¦¬κ°€ ν•¨μˆ˜μΈμ§€ ν΄λž˜μŠ€μΈμ§€ Ctrl + ν΄λ¦­ν•˜μ—¬ μ†ŒμŠ€ ν™•인

today = date(2021, 10, 28) #dateμƒμ„±μž : μ •μˆ˜ν˜• 클래슀() -> today객체
#object.meber(λ©€λ²„λ³€μˆ˜ + λ©€λ²„λ©”μ„œλ“œ)


객체의 호좜 κ°€λŠ₯ν•œ 멀버 확인

dir(today)


object.λ©€λ²„λ³€μˆ˜

today.year #2021
today.month #10
today.day #28


object.λ©€λ²„λ©”μ„œλ“œ()

week = today.weekday() #κΈ°λŠ₯. weekday : 0(μ›”) ~ 6(일)μ‚¬μ΄μ˜ 숫자 λ°˜ν™˜
print('μš”μΌ 정보 : ', week) #μš”μΌ 정보 : 3

 

 

 

 

 

 

동적 멀버 λ³€μˆ˜ 생성 - Car

μƒμ„±μž λ˜λŠ” λ©”μ„œλ“œμ—μ„œ λ™μž‘μœΌλ‘œ 멀버 λ³€μˆ˜ 생성
self : μžμ‹ (ν˜„μž¬ ν΄λž˜μŠ€)의 λ©€λ²„λ₯Ό ν˜ΈμΆœν•˜λŠ” κ°μ²΄
self.λ©€λ²„λ³€μˆ˜
self.멀버 λ©”μ„œλ“œ

 



1.  ν΄λž˜μŠ€ μ •μ˜

class Car : 
    #멀버 λ³€μˆ˜ : 자료 생성
    door = cc = 0 #문짝, μ—”μ§„
    name = None #null
    
    #μƒμ„±μž : 객체 생성 + λ©€λ²„λ³€μˆ˜ μ΄ˆκΈ°ν™”
    def __init__(self, name, door, cc):
        #λ©€λ²„λ³€μˆ˜ μ΄ˆκΈ°ν™”    
        self.name = name
        self.door = door
        self.cc = cc
    
    #멀버 λ©”μ„œλ“œ : 자료처리 (μ‘°μž‘)
    def info(self) : #μžλ™μ°¨μ •λ³΄
        self.kind = None #동적 멀버 λ³€μˆ˜
        if self.cc >= 3000:
            self.kind = "λŒ€ν˜•"
        else :
            self.kind = "μ€‘μ†Œν˜•"
            
        self.display() #self.λ©€λ²„λ©”μ„œλ“œ()
    
    def display(self) : #정보 좜λ ₯
        print("%sλŠ” %d cc이고(%s), 문짝은 %d개 이닀."
              %(self.name, self.cc, self.kind, self.door))


       
           
2. 객체 생성

car1 = Car("μ†Œλ‚˜νƒ€", 5, 2000) #μƒμ„±μž -> 객체
#object.member
car1.info() #μ†Œλ‚˜νƒ€λŠ” 2000 cc이고(μ€‘μ†Œν˜•), 문짝은 5κ°œμ΄λ‹€.
car1.display()

car2 = Car('κ·Έλžœμ €', 5, 3000)
car2.info()
car2.display() #κ·Έλžœμ €λŠ” 3000 cc이고(λŒ€ν˜•), 문짝은 5개 이닀.

 

 

 

 

클래슀 생성 μ‹€μŠ΅

1. μ€ν–‰ κ³„μ’Œ ν΄λž˜μŠ€ μƒμ„±
λ©€λ²„λ³€μˆ˜ : μ˜ˆκΈˆμ£Ό, κ³„μ’Œλ²ˆν˜Έ, μž”μ•‘ - λͺ…사
λ©€λ²„λ©”μ„œλ“œ : μž”μ•‘확인, μž…κΈˆν™•μΈ, μΆœκΈˆν•˜κΈ° - λ™μ‚¬

2. μ˜ˆκΈˆμ£Ό(accName), κ³„μ’Œλ²ˆν˜Έ(accNum) λ™μ  λ©€λ²„λ³€μˆ˜ μΆ”κ°€ν•˜κΈ°
ex. μ˜ˆκΈˆμ£Ό : ν™κΈΈλ™, κ³„μ’Œλ²ˆν˜Έ : 123-1234-12345

3. getBalacne() : μ˜ˆκΈˆμ£Ό, κ³„μ’Œλ²ˆν˜Έ, μž”μ•‘ μΆœλ ₯ν•˜κΈ°

class Account :
    
    #μƒμ„±μž (객체 생성 + λ©€λ²„λ³€μˆ˜ 생성)
    def __init__(self, bal, accName, accNo) :
        #동적 멀버 λ³€μˆ˜ μΆ”κ°€
        self.balance = bal #μž”μ•‘ λ©€λ²„λ³€μˆ˜ 생성
        self.accName = accName #예금주
        self.accNo = accNo #κ³„μ’Œλ²ˆν˜Έ
        
    #멀버 λ©”μ„œλ“œ
    #μž”μ•‘ 확인 : getter
    def getBalance(self) : 
        return self.balance, self.accName, self.accNo
    
    #μž…κΈˆν•˜κΈ°
    def deposit(self, money) :
        if money < 0 :
            print('~~ μž…κΈˆμ•‘ 확인 ~~')
        else :
            self.balance += money
            print('μž…κΈˆμ΄ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.')


μΆœκΈˆν•˜κΈ°

    def withdraw(self, money) : 
        if self.balance < money :
            print('~~ μž”μ•‘ λΆ€μ‘± ~~')
        else :
            self.balance -= money
            print('좜금이 μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.')


객체1 생성

acc = Account(1000, '홍길동', 123-1234-12345) #톡μž₯ κ°œμ„€. 1000원을 μž…κΈˆ!
print('μž”μ•‘ : ', acc.getBalance()) #μž”μ•‘ :  1000

acc.deposit(20000) #μž…κΈˆ
print('μž”μ•‘ : {0:3,d}'.format(acc.getBalance()))

acc.deposit(-20000) #~~ μž…κΈˆμ•‘ 확인 ~~

acc.withdraw(5000) #좜금
print('μž”μ•‘ : {0:3,d}'.format(acc.getBalance()))

acc.withdraw(50000) #~~ μž”μ•‘ λΆ€μ‘± ~~


객체2 생성

acc2 = Account(0, 'μ΄μˆœμ‹ ', '123-1234-12346') #κ³„μ’Œ 정보: (0, 'μ΄μˆœμ‹ ', '123-1234-12346')

acc2.deposit(100000) #κ³„μ’Œ 정보: (100000, 'μ΄μˆœμ‹ ', '123-1234-12346')
print('κ³„μ’Œ 정보:', acc2.getBalance()) #μž…κΈˆμ΄ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

acc2.withdraw(50000) #좜금이 μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

 

클래슀 상속

1. ν΄λž˜μŠ€ μƒμ†(Class Inheritance)
λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό μ΄μš©ν•΄ μžμ‹ν΄λž˜μŠ€λ₯Ό μƒμ„±ν•˜λŠ” λ¬Έλ²•
λΆ€λͺ¨ν΄λž˜μŠ€ : κΈ°μ‘΄ ν΄λž˜μŠ€
μžμ‹ν΄λž˜μŠ€ : μƒˆλ‘œμš΄ ν΄λž˜μŠ€
상속 λŒ€μƒ : λ©€λ²„λ³€μˆ˜ + λ©€λ²„λ©”μ„œλ“œ

ν˜•μ‹)
Class μžμ‹ν΄λž˜μŠ€(λΆ€λͺ¨ν΄λž˜μŠ€) :
    pass

2. λ©”μ„œλ“œ μž¬μ •μ˜ (method override)
상속 κ΄€κ³„μ—μ„œλ§Œ λ‚˜μ˜€λŠ” μš©μ–΄
λΆ€λͺ¨ ν΄λž˜μŠ€μ˜ μ›ν˜• λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ‹€μ‹œ μž‘μ„±
인수 μΆ”κ°€, λ‚΄μš© μž¬μž‘μ„±


 

1. λΆ€λͺ¨ν΄λž˜μŠ€ μ •μ˜

class Parent :
    #μƒμ„±μž : 객체 + λ©€λ²„λ³€μˆ˜ 생성
    def __init__(self, name, job):
        self.name = name
        self.job = job
        
        #멀버 λ©”μ„œλ“œ
    def display(self):
        print('name : %s, job : %s'%(self.name, self.job))

             
λΆ€λͺ¨ν΄λž˜μŠ€ 객체 생성

p = Parent('홍길동', '곡무원')
p.display() #name : 홍길동, job : 곡무원

 



2. μžμ‹1 클래슀

class Child1(Parent) : #class new_class(old_class)
    #μƒμ†λŒ€μƒ : 멀버(λ©€λ²„λ³€μˆ˜ + λ©€λ²„λ©”μ„œλ“œ)
    #self.name, self.job
    #display()
    
    def __init__(self, name, job) : 
        self.name = name
        self.job = job
        #λ³€μˆ˜λ§Œ μƒμ†λœ μƒνƒœ


μžμ‹1 클래슀 객체 생성

ch1 = Child1('μžμ‹1', 'νšŒμ‚¬μ›')
ch1.display() #name : μžμ‹1, job : νšŒμ‚¬μ›. μ •μ˜ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ 호좜됨




3. μžμ‹2 클래슀

class Child2(Parent) : #class new_class(old_class)
    #μƒμ†λŒ€μƒ : 멀버(λ©€λ²„λ³€μˆ˜ + λ©€λ²„λ©”μ„œλ“œ)
    #self.name, self.job
    #display()
    
    def __init__(self, name, job, gender) : 
        super().__init__(name, job) : #λΆ€λͺ¨ μƒμ„±μž 호좜
        #self.name = name #λΆ€λͺ¨ λ©€λ²„λ³€μˆ˜
        #self.job = job #λΆ€λͺ¨ λ©€λ²„λ³€μˆ˜
        self.gender = gender #μΆ”κ°€ν•˜λŠ” μžμ‹ λ©€λ²„λ³€μˆ˜
        
    #λ©”μ„œλ“œ μž¬μ •μ˜ (method override) : 인수 μΆ”κ°€, λ‚΄μš© μˆ˜μ • λ“±
    def display(self): #2개 -> 3개둜 ν™•μž₯
        print('name : %s, job : %s, gender : %s'
              %(self.name, self.job, self.gender))


μžμ‹2 클래슀 객체 생성

ch2 = Child2('μžμ‹2', '기술자', 'λ‚¨μž')
ch2.display() #name : μžμ‹2, job : 기술자, gender : λ‚¨μž

+ Recent posts