데이터&인공지능/데이터분석(Python)

[200711] Python 간단정리 _ 객체와 클래스

csmoon1010 2020. 7. 12. 00:49

1. 객체

- python도 c++, java처럼 "객체지향언어"임

1) 객체의 구성

- 속성(attribute) : 객체의 특성. 변수(variable)을 이용해 정의

- 메소드(method) : 객체에 대하여 할 수 있는 행동(action)을 구현한 함수

 

2) 객체의 속성

: 속성 변수를 사용해서 값 대입 및 출력. 점 표기법 이용

my_mouse.X = 300
my_mouse.Y = 600
print(my_mouse.X, my_mouse.Y)

3) 객체의 메소드

: 객체를 가지고 할 수 있는 것들. 객체 안에서 정의된 함수. 점 표기법 이용

my_mouse.L_click()
my_mouse.Double_L_click()

 

2. 클래스

: 객체의 설계도 개념(객체 = 클래스의 인스턴스)

1) 클래스의 구조

class 클래스이름 :
    <클래스 변수 1>
    ...
    <클래스 변수 N>
    <클래스 함수 1>
    ...
    <클래스 함수 M>
    
class Account: #클래스 선언
    balance = 0
    def deposit(self, amount):
        self.balance = self.balance + amount
        
Acc_1 = Account #객체(인스턴스) 생성

2) 클래스 변수와 객체 변수

- 클래스 변수 : 모든 객체가 공유하는 변수(like static 멤버) [클래스 이름.변수명]

- 객체 변수 : 각각의 객체가 독자적으로 사용하는 변수 [객체 이름.변수명]

※ 객체 변수가 생성되기 전에는 클래스 변수로 대체되어 사용된다!!

Acc_1 = Account()
Acc_2 = Account()
Acc_1.deposit(10000)
Account.balance = 2000

print(Acc_1.balance) #10000
print(Acc_2.balance) #2000(클래스 변수로 대체)

3) 메소드의 호출

- 첫 번째 매개 변수는 항상 self : 자동으로 메소드가 호출되는 대상 객체가 인자로 제공됨. 적용 객체의 식별 역할

- 객체 변수를 사용할 때는 self.객체변수 형태로 어떤 객체인지를 확실히 해야

def deposit(self, amount):
    self.balance = self.balance + amount
    
Acc_1.deposit(10000) #self 인자는 명시X

4) 객체의 별명

: 참조만 복사되어 같은 객체를 대상으로 하는 변수가 2개 이상. 별명(alias)라고 함

Acc_3 = Acc_1

5) 캡슐화(encapsulation)

: 데이터를 직접 접근하지 못하게 하고 메소드를 통하여 접근할 수 있도록 설계하는 것!

class Account:
    balance = 0
    
    def deposit(self, amount): #setting data
        self.balance = self.balance + amount
        
    def printbal(self) : #getting data
        print(self.balance)

6) __init__메소드를 활용한 자동 초기화

: Java의 생성자와 유사. 객체 생성과 동시에 객체 변수의 초기화가 가능함.

- 반드시 인자를 함께 명시하여 객체 생성!!(Java와 다르게 기본 생성자 없음)

- 객체 변수로 정의되어 사용되므로 클래스 변수는 정의, 사용될 수 없음.

class Account():
    def __init__(self, name, ini_bal):
        self.owner = name
        self.balance = ini_bal
        
    def deposit(self, amount) :
        self.balance = self.balance + amount
        
    def printbal(self):
        print(self.balance)
        
    def print_acc(self):
        outputline = '''Account owner: %s
        Account balance : %s ''' % (self.owner, self.balance)
        return outputline
    

7) 클래스 변수 활용

: counter의 작성 시 이용. 클래스.변수명 형태로 이용(클래스 정의 내에서도)

class Account():
    counter = 0
    def __init__(self, name, ini_bal):
        self.owner = name
        self.balance = ini_bal
        Account.counter += 1

- 클래스 변수를 출력해주는 함수 : self를 빼면 객체 생성 없이도 호출이 가능해짐!!

class Account():
    counter = 0
    def __init__ (slef, name, ini_bal) : 
        self.owner = name
        self.balance = ini_bal
        Account.counter += 1
    def accountinstances():
        return Account.counter
        
Account.accountinstances()        

8) __del__ 소멸자(destructor)

: Java의 소멸자와 같은 역할(finalize). del()을 통해 객체에 대한 참조를 삭제하면서 자동으로 호출

class Account():
    counter = 0
    def __init__ (slef, name, ini_bal) : 
        self.owner = name
        self.balance = ini_bal
        Account.counter += 1
    def accountinstances():
        return Account.counter
    def __del__(self):
        Account.counter -= 1
        
a1 = Account('Sam', 10000)
a2 = Account('Lisa', 30000)
a3 = a1
Account.accountinstances() # 2
del(a1)
Account.accountinstances() # 2
del(a3)
Account.accountinstances() # 1

9) 공용 변수와 전용 변수

- 공용 변수(public) : 모든 접근에 제한이 없는 변수

- 전용 변수(private) : 외부 접근에 제한을 두는 변수. 두 개의 밑줄(__)을 붙인 이름 [ex> __counter = 0]

※ 전용 변수의 이용은 정보 은닉(information hiding)의 목적을 가지고 있음

 

3. 상속(Inheritance)

1) 구성

- 기본 클래스(base class)

- 파생 클래스(derived class) / 하위 클래스(subclass) : 기본 클래스의 데이터, 메소드를 모두 상속받은 클래스

class DerivedClassName(BaseClassName) : 
    classBody
    
class SavingsAccount(Account):
    def __init__(self, name, ini_bal, interest, min_bal):
        self.interest = interest
        self.min_bal = min_bal
        Account.__init__(self, name, ini_bal) #base클래스의 생성자 호출

2) 메소드 재정의(method overriding)

: 상속받은 기본 클래스의 메소드를 같은 이름, 다른 내용으로 재정의. super() 키워드를 사용

class SavingsAccount(Account) :
    def __init__(self, name, ini_bal, interest, min_bal) :
        self.interest = interest
        self.min_bal = min_bals
        Account.__init__(self, name, ini_bal)
        
    def print_acc(self):
        super().print_acc() #기본 클래스의 메소드 호출
        print(''' Interest rate : %s 
        Minimum balance : %s ''' % (self.interest, self.min_bal)) #추가하여 재정의

3) 다중 상속(multiple inheritance)

: 여러 개의 기본 클래스로부터 상속받음.

class DrivedClassName (Baseclass1, Basecalss2) :

class MMF(Account, Fund) :
    def __init__(self, name, ini_bal, ear_rate):
        Account.__init__(self, name, ini_bal)
        Fund.__init__(self, ear_rate)
        
    def current_balance(self):
        self.balance = self.balance * (1 + self.ear_rate/100)