[파이썬 기초 문법] 13장. 클래스와 객체
20 Jun 2019
Reading time ~4 minutes
이 포스트는 윤성우님의 저서 열혈 파이썬 기초편을 기반으로 작성한 글입니다.
윤성우 열혈 파이썬 기초편
13장. 클래스와 객체
1.전역변수와 지역변수
>>> def func(n):
lv = n + 1
print(lv)
>>> func(12)
13
위에서의 n,lv와 같이 함수 내에 선언되는 함수는 지역변수이다.
>>> cnt = 100
>>> cnt += 1
>>> def func():
print(cnt)
>>> func()
101
위에서의 cnt와 같이 함수 내에 선언되는 함수는 지역변수이다.
2.객체 이전의 프로그램에 대한 반성
family_age1.py
fa_age = 39 # 아빠 나이 정보, 현재 39살
def up_fa_age(): # 이 함수를 호출하면 아빠 나이 올라감
global fa_age
fa_age += 1
def get_fa_age(): # 이 함수 호출하면 아빠 나이 반환함
return fa_age
def main():
print("2019년...")
print("아빠:", get_fa_age())
print("2020년...")
up_fa_age() # 아빠 나이 1살 증가
print("아빠:", get_fa_age())
main()
family_age2.py
fa_age = 39 # 아빠 나이 정보
def up_fa_age(): # 아빠 나이 올라감
global fa_age
fa_age += 1
def get_fa_age(): # 아빠 나이는?
return fa_age
mo_age = 35 # 엄마 나이 정보
def up_mo_age(): # 엄마 나이 올라감
global mo_age
mo_age += 1
def get_mo_age(): # 엄마 나이는?
return mo_age
def main():
. . . .
main()
3.클래스와 객체의 이해
자동차 설계도 <클래스>클래스>
설계도 기반으로 만들어진 실제 자동차 <객체>객체>
에어컨 설계도 <클래스>클래스>
설계도 기반으로 만들어진 실제 에어컨 <객체>객체>
class AgeInfo: # 클래스 AgeInfo의 정의
def up_age(self): # 클래스 안에 담긴 up_age 함수
self.age += 1
def get_age(self): # 클래스 안에 담긴 get_age 함수
return self.age
class_object.py
class AgeInfo: # 클래스 AgeInfo의 정의
def up_age(self):
self.age += 1
def get_age(self):
return self.age
def main():
fa = AgeInfo() # AgeInfo 객체 생성
fa.age = 39 # fa에 저장된 객체의 변수 age에 39를 저장
print("현재 아빠 나이...")
print("아빠:", fa.get_age()) # get_age 호출할 때 self에 값 전달하지 않음
print("1년 뒤...")
fa.up_age() # up_age 호출할 때 self에 값 전달하지 않음
print("아빠:", fa.get_age()) # get_age 호출할 때 self에 값 전달하지 않음
main()
출력결과
현재 아빠 나이...
아빠: 39
1년 뒤...
아빠: 40
인스턴스 변수 인스턴스(객체) 안에 존재하는 변수
인스턴스 메소드 인스턴스(객체) 안에 존재하는 메소드(함수)
리스트와 달리 딕셔너리는 데이터가 들어있는 순서와는 상관없이 연산 되는 것을 볼 수 있다.
4.이전 예제의 수정 결과
family_age3.py
class AgeInfo:
def up_age(self):
self.age += 1
def get_age(self):
return self.age
def main():
fa = AgeInfo() # 아빠 나이 객체 생성
mo = AgeInfo() # 엄마 나이 객체 생성
me = AgeInfo() # 나의 나이 객체 생성
fa.age = 39 # 아빠 현재 나이
mo.age = 35 # 엄마 현재 나이
me.age = 12 # 나의 현재 나이
sum = fa.get_age() + mo.get_age() + me.get_age()
print("가족 나이 합:", sum)
fa.up_age() # 아빠 나이 한 살 올림
mo.up_age() # 엄마 나이 한 살 올림
me.up_age() # 나의 나이 한 살 올림
sum = fa.get_age() + mo.get_age() + me.get_age()
print("1년 후의 합:", sum)
main()
'''
가족 나이 합: 86
1년 후의 합: 89
'''
fa에 저장된 객체
age=39
def up_age():
age+=1
def get_age():
return age
ma에 저장된 객체
age=35
def up_age():
age+=1
def get_age():
return age
me에 저장된 객체
age=12
def up_age():
age+=1
def get_age():
return age
6.self 너 뭐냐!
family_age3.py
class AgeInfo:
def up_age(self):
self.age += 1
def get_age(self):
return self.age
fa에 저장된 객체
age = 39
ma에 저장된 객체
age = 35
me에 저장된 객체
age = 14
AgeInfo 클래스의 함수들
def up_age(self):
self.age+=1
def get_age(self):
return self.Age
결론
fa,ma,me에 함수들이 모두 들어있다면 같은 함수들의 중복선언이되므로 이러한 중복을 방지하기 위해 AgeInfo클래스에 함수들을 효율적인 코드 작성을 위해 한 번만 선언한 후 객체자신을 전달하여 사용한다.
self_test.py
class AgeInfo:
def up_age(self):
self.age += 1
def get_age(self):
return self.age
def main():
fa = AgeInfo()
fa.age = 20
fa.up_age()
# 실제로는 AgeInfo.up_age(fa)이 실행된다.
print(fa.get_age())
# 실제로는 print(AgeInfo.get_age(fa))이 실행된다.
main()
'''
1년 후 아빠 나이: 40
'''
7.생성자(초기화 메소드)
ctor1.py
class Const:
def __init__(self):
print("new~")
def main():
o1 = Const()
o2 = Const()
main()
'''
new~
new~
'''
# ctor2.py
class Const:
def __init__(self, n1, n2):
self.n1 = n1 # self.n1은 인스턴스 변수, n1은 매개변수
self.n2 = n2 # self.n2는 인스턴스 변수, n2는 매개변수
def show_data(self):
print(self.n1, self.n2)
def main():
o1 = Const(1, 2)
o2 = Const(3, 4)
o1.show_data()
o2.show_data()
main()
'''
1 2
3 4
'''
클래스 선언 즉시 데이터 초기화를 위해 생성자를 사용한다.
8.파이썬의 모든 값은 객체
>>> n = 1000
>>> n.bit_length() # 변수 n에 담긴 정수도 객체라는 증거!
10
>>> f = 3.14
>>> f.is_integer() # 변수 f에 담긴 실수도 객체라는 증거!
False