goodthings4me.tistory.com
파이썬 클래스(class)와 객체(object) 이해하기
■ 함수로 아빠 나이를 관리하는 간단한 프로그램을 작성하면,
# Father Age 관리 프로그램
fa_age = 39 # 전역변수
def up_fa_age():
global fa_age # 전역변수 사용 선언
fa_age += 1
def get_fa_age():
return fa_age
def main():
print('2020년 아빠 나이는 {}세 이고,'.format(get_fa_age()))
up_fa_age()
print('내년에는 {}세 되네!'.format(get_fa_age()))
main()
# ===========================
[실행 결과]
2020년 아빠 나이는 39세 이고,
내년에는 40세 되네!
상기 함수 프로그램으로 엄마, 나, 누나 등등 모든 사람의 나이를 관리하려면 같은 함수를 여러 번 작성해야 하는데, 어떻게 하는 것이 더 효율적인지 생각해볼 필요가 있다.
■ 함수가 아닌 클래스로 나이를 관리하면,
# 나이 관리 클래스(class)로 객체 생성
class AgeInfo:
def up_age(self):
self.age += 1
def get_age(self):
return self.age
def main():
# AgeInfo 클래스를 사용하여 각각의 객체를 생성할 수 있다.
father = AgeInfo() # AgeInfo 객체 생성 후, 변수 fa에 저장
father.age = 39 # father에 저장된 객체의 변수 age에 39 저장, age는 인스턴스(객체)변수
print('2020년 아빠 나이는 {}세 이고,'.format(father.get_age()))
father.up_age()
print('내년에는 {}세 되네!'.format(father.get_age()))
# mother 객체 생성
mother = AgeInfo()
mother.age = 38
print('현재 엄마의 나이는 {}세 이고,'.format(mother.get_age()))
mother.up_age()
print(f'내년은 {mother.get_age()}세가 된다.')
main()
# ==========================
[실행 결과]
2020년 아빠 나이는 39세 이고,
내년에는 40세 되네!
현재 엄마의 나이는 38세 이고,
내년은 39세가 된다.
앞에서 전역변수라 했던 age를 선언하는 부분이 없는데, 클래스로 객체를 생성할 때 파이썬이 알아서 해당 객체의 필요한 변수(인스턴스 변수)를 생성하여 관리해준다. (실제로는 후술하는 생성자에서 모든 변수를 초기화 해주어야 함)
클래스를 만들어서 객체를 관리할 때,
파이썬은 생성된 객체들이 up_age()와 get_age() 메서드(함수)를 공유토록 하는데, 생성된 객체(변수 father)가 그 메서드를 호출(father.up_age())할 때는 객체(객체를 가리키고 있는)인 father를 인자(매개변수 self에 대입)로 전달(up_age(father) 형태)한다. 즉, 각 매서드의 매개변수 self에 객체 자신(father)이 전달되므로 메서드 내 'self.age += 1' 은 'father.age += 1'와 같다.
# 클래스(class)의 메서드로 객체(인스턴스)변수에 나이 부여
class AgeInfo:
def set_age(self, age): # 메서드(함수)를 통해 변수 age에 나이 부여
self.age = age
def up_age(self):
self.age += 1
def get_age(self):
return self.age
def main():
father = AgeInfo()
father.set_age(39)
print('2020년 아빠 나이는 {}세 이고,'.format(father.get_age()))
father.up_age()
print('내년에는 {}세 되네!'.format(father.get_age()))
mother = AgeInfo()
mother.set_age(38)
print('현재 엄마 나이는 {}세 이고,'.format(mother.get_age()))
mother.up_age()
print(f'내년은 {mother.get_age()}세가 된다.')
main()
# ==============================
[실행 결과]
2020년 아빠 나이는 39세 이고,
내년에는 40세 되네!
현재 엄마 나이는 38세 이고,
내년은 39세가 된다.
인스턴스 메서드에 self 이외에 매개변수(age)를 더 추가하여 사용하면, 보안상 효율적으로 인스턴스 변수를 관리할 수 있다.
매개변수의 age는 외부에서 받는 age이고 self.age는 인스턴스 변수이다.
# 생성자를 통해 인스턴스 변수 초기화 (이상적인 클래스/객체 생성 방법)
class AgeInfo:
def __init__(self, n): # 변수 초기화 생성자 함수(메서드)
self.age = n
def up_age(self):
self.age += 1
def get_age(self):
return self.age
def main():
# AgeInfo 클래스를 사용하여 각각의 객체를 생성할 수 있다.
father = AgeInfo(39) # 객체 생성과 변수 초기화
print('2020년 아빠 나이는 {}세 이고,'.format(father.get_age()))
father.up_age()
print('내년에는 {}세 되네!'.format(father.get_age()))
# mother, me, sister 객체 생성과 변수 초기화
mother = AgeInfo(38)
me = AgeInfo(15)
sister = AgeInfo(17)
print('현재 엄마, 나, 누나의 나이는 각각 {}세, {}세, {}세 이고,'.format(mother.get_age(),\
me.get_age(), sister.get_age()))
# mother, me, sister 내년 나이
mother.up_age()
me.up_age()
sister.up_age()
print(f'내년은 각각 {mother.get_age()}세, {me.get_age()}세, {sister.get_age()}세가 된다.')
sum = father.get_age() + mother.get_age() + me.get_age() + sister.get_age()
print(f'\n가족 나이의 합은 {sum}세네!!')
main()
# =================================
[실행 결과]
2020년 아빠 나이는 39세 이고,
내년에는 40세 되네!
현재 엄마, 나, 누나의 나이는 각각 38세, 15세, 17세 이고,
내년은 각각 39세, 16세, 18세가 된다.
가족 나이의 합은 113세네!!
클래스로 객체를 생성할 때는 인스턴스 변수의 초기화를 반드시 해주어야 한다. 즉, 객체 생성 즉시 객체 안에 존재하는 모든 변수를 초기화 하는 것이 일반적이다.
그래서 파이썬은 객체의 생성과 변수의 초기화를 동시에 할 수 있도록 생성자(Constructor)를 제공하는데, 이 생성자는 객체 생성 시 자동으로 호출된다.
[참고자료] 윤성우의 열혈 파이썬 초급편
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
[python] 리스트 컴프리헨션(List Comprehension) & 이터러블(iterable) 객체 (0) | 2020.08.21 |
---|---|
[python] n부터 시작하여 m까지 연속하는 숫자의 합은? (0) | 2020.08.20 |
[python] 객체처럼 다뤄지는 함수, 그리고 이름 없는 함수, 람다(lambda) (0) | 2020.08.19 |
[python] 변경 가능한 객체(mutable), 변경 불가능한 객체(immutable) - #2 (1) | 2020.08.15 |
[Python] 파이썬 list, tuple, dict, set의 스페셜 메서드 정리 (1) | 2020.08.12 |
댓글