[200711] Python 간단정리 _ 객체와 클래스
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)