• Home
  • About
    • Ryureka Moment photo

      Ryureka

      Sin Prisa, Sin Pausa

    • About Me
    • Facebook
    • Github
    • Youtube
  • Projects
  • Posts
    • Posts
    • ProblemSolvings
    • Tags
    • Blog
    • TIL
    • Examples
  • ProblemSolving
    • ProblemSolving
    • BruteForce
    • DFS
    • DP
    • Optimization
  • FrontEnd
    • FrontEnd
    • HTML
  • BackEnd
    • BackEnd
    • Spring
    • Node.js
    • DataBase
      • MySQL
  • Programming
    • Programming
    • Java
    • Python
  • ComputerScience
    • DataStructure
    • Algorithm

[파이썬 기초 문법] 13장. 클래스와 객체

20 Jun 2019

Reading time ~4 minutes

이 포스트는 윤성우님의 저서 열혈 파이썬 기초편을 기반으로 작성한 글입니다.
  • 윤성우 열혈 파이썬 기초편
    • 13장. 클래스와 객체
      • 1.전역변수와 지역변수
      • 2.객체 이전의 프로그램에 대한 반성
      • 3.클래스와 객체의 이해
      • 4.이전 예제의 수정 결과
      • family_age3.py
      • fa에 저장된 객체
      • ma에 저장된 객체
      • me에 저장된 객체
      • 6.self 너 뭐냐!
      • 결론
      • 7.생성자(초기화 메소드)
      • 8.파이썬의 모든 값은 객체

윤성우 열혈 파이썬 기초편

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


Python Share