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)를 제공하는데, 이 생성자는 객체 생성 시 자동으로 호출된다.
[참고자료] 윤성우의 열혈 파이썬 초급편


블로그 인기글
Windows 10 탐색기 느려지는 증상과 해결하는 방법
잘 작동하던 Windows 10 탐색기가 갑자기 느려지는 증상이 발생했을 때 어떻게 조치를 하는지 구글에서 찾아보니 많은 해결책들이 있었으나 어떤 것이 정확한 해결책인지는 알 수가 없었다. 그래서 해결방법이라고 제시한 것들을 정리해 보았다. 윈도우 탐색기가 느려지는 증상 해결 방법 어느 순간부터 응용프로그램(VS Code 등)에서 폴더 열기나 파일 불러오기를 했을 때 검색 팝업창이 안 뜨거나 열리는 시간이 엄청 느려지는 증상과, 더불어서 탐색기도 실행이 많이 느려지는 증상이 있었다. 기존에 사용하던 VS Code에 openpyxl 설치 후 실행이 느려지는 증상이 발생하더니 윈도우10 탐색기도 느려져서 사용할 수가 없었다. 노트북에 OS(Windows10)를 설치한지 1년이 다 되어가긴 했지만, 1개월 전..
goodthings4me.tistory.com
[국세청] 현금영수증가맹점으로 가입바랍니다. 메시지 해결방법(개인사업자)
▶ 현금영수증 가맹점 가입 메시지를 받고... 온라인 쇼핑몰 사업을 시작하려고 사업자등록증을 발급받고 난 후 얼마 안 있어서 국세청으로부터 어느 시점까지 '현금영수증 가맹점'으로 가입하라는 문자메시지가 받았었다. 그 메시지 기한이 오늘 도래했는데, 인터넷에서 찾아보니 홈택스에서 현금영수증 발급 사업자 신청을 할 수가 있었다. [관련내용] 홈>국세정책/제도>전자(세금)계산서/현금영수증/신용카드>현금영수증∙신용카드>가맹점가입 ▶ 홈택스 사이트에서 신청하는 절차는 다음과 같다. 우선, 홈택스에 로그인을 해야 합니다. 세상이 좋아져서 공인인증서 없이도 손쉽게 간편인증 로그인이 가능하다. 여러 인증방법 중 카카오톡 인증이 가장 편리한 거 같다. 간편인증 로그인 후 상단 '조회/발급' 탭 클릭 후 '현금영수증>현금..
goodthings4me.tistory.com
폐업 신고 절차와 부가가치세 신고하는 방법
폐업 신고 시 세무서 안 가고 온라인으로 신고하는 방법인 '국세청 홈택스를 이용하여 폐업 신고하는 절차와 폐업 후 해야 하는 부가가치세 신고, 인건비 저리, 종합소득세 신고 등에 대해 포스팅합니다. 폐업 신고 시 홈택스 이용하는 방법과 부가가치세 등 신고 절차 여러가지 사유로 폐업을 해야 할 때, 예전에는 세무서를 방문해야 했지만 국세청 홈택스가 생긴 이후에는 사업자 등록이나 폐업 등을 인터넷으로 할 수가 있게 되었습니다. 특히, 코로나 시국인 요즘은 더더욱 온라인 신청 업무가 더 활성화되었죠. 폐업을 한다는 것 자체가 우울한 일인데, 발품을 파는 것보다는 커피 한잔 하면서 인터넷으로 간단하게 처리하는 게 좋을 듯하여 그 절차를 올려봅니다. 폐업은 폐업 신고와 함께 폐업 후 절차까지 모두 마쳐야 불이익이..
goodthings4me.tistory.com
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
[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 |
댓글