개발 스터디

[TIL] 파이썬(Python)의 구조

헹창 2023. 1. 24.
반응형

클래스와 인스턴스

  • 클래스란 ? 속성과 데이터를 변형하는 함수를 같은 이름 공간에 묶어 새로운 형식을 정의하는 것
  • 인스턴스란 ? 클래스를 복사해서 생성한 복사본

클래스와 인스턴스 객체의 관계

  • 쿠키 = 클래스
  • 쿠키틀을 통해 찍어낸 과자 = 인스턴스

클래스 정의 문법 (define)

클래스의 멤버는 멤버 변수와 멤버 메서드로 구성

  • class 라는 키워드를 사용
  • 클래스에는 멤버 변수를 초기화할 수 있고, 멤버 메소드를 정의
  • 멤버 메소드는 def 라는 키워드를 사용하고, 첫 번째 매개변수(인자)는 예약되어 있는 자리여서 self 라는 단어 사용

예제

Person 클래스 정의, p1 이라는 인스턴스 객체 생성 예제

# class 클래스명(상위클래스):
#	클래스에 대한 설명
#	def 함수명(self, 인자1, 인자2, ...):
#		statement1
#		statement2
#		return
        
class Person:
	name="Default Name"
	def print(self):
		print("My name is {0}".format(selft.name))
		
p1 = Person()
p1.print()	# My name is Default Name

## 인스턴스 객체에 자기 데이터를 로컬에 저장
p1.name="전우치"
p1.print()	# My Name is 전우치

 

인스턴스 사용

인스턴스 객체 멤버 변수 이름 해석 순서

  1. 인스턴스 객체 내부
  2. 클래스 객체 내부
  3. 전역 공간

새로운 멤버 변수 추가하는 방법

1. 클래스에 새로운 멤버 변수 추가

Person.title="New title"
print("Person's title:", p2.title)	# Person's title:New title
print("p1's title:", p1.title)	# p1's title:New title
print("p2's title:", p2.title)	# p2's title:New title

2. 인스턴스 객체에 새로운 멤버 변수 추가

  • p1객체에 추가한 age는 p1 인스턴스에서만 접근 가능
p1.age=20
print("p1's age:", p1.age)	# p1's age:20
print("p2's age:", p2.age)	# AttributeError: 'Person' object has no attribute 'age'

self 의미

자기 자신을 참조하는 의미

  • 잘못된 예시 : print(str) 은 전역 변수인 str을 바라보게 됨
str = "Not Class Member"
class GString:
	str=""
	def set(self, msg):
		self.str=msg    
	def print(self):    
		print(str)    

g = GString()
g.set("First Message")
g.print()	# Not Class Memeber
  • 올바른 예시
str = "Not Class Member"
class GString:
	str=""
	def set(self, msg):
		self.str=msg    
	def print(self):    
		print(self.str)    

g = GString()
g.set("First Message")
g.print()	# First Message

 

생성자와 소멸자 메소드

파이썬에서는 메모리 관리를 위해 생성자 메소드와 소멸자 메소드를 정의할 수 있다

객체의 생성과 소멸을 위한 참조 카운트 레퍼런스를 할 수 있다

생성자 메소드

  • 객체 초기화 담당
  • 인스턴스 객체가 생성될 때 가장 먼저 호출

소멸자 메소드

  • 객체의 소멸을 담당
  • 인스턴스 객체에 레퍼런스 카운트가 0이될 때 자동으로 호출
class MyClass:	# 클래스 정의
	def __init__(self, value):	# 생성자 메소드
		self.value = value
		print("Class is created! value=", value)
	def __del__(self):	# 소멸자 메소드
		print("Class is deleted!")

d = MyClass(10)	# 생성자 메소드 호출 (참조 카운트1)
d_copy = d	# (참조 카운트2)
del d # 소멸자 메소드 호출	(참조 카운트 1로 감소)
del d_copy	# 참조 카운트 0 (소멸자 호출)

정적 메소드

자주 호출되는 메소드를 쉽게 사용할 수 있다

  • 정적 메소드 또는 스태틱 메소드로 혼용
  • 클래스에서 직접 호출할 수 있는 메소드
  • 메소드를 정의할 때 인스턴스 객체를 참조하는 self라는 인자를 선언하지 않음
  • 클래스 인스턴스에는 적용되지 않는 메소드
  • 클래스.메소드명으로 호출
class MyCala(object):
	# 데코레이터 라는 문법으로, 메타 데이터 전달하는 용도로 사용
	@staticmethod	
	def my_add(x,y);
		return x+y

# 인스턴스 객체 생성 없이 클래스명.메소드명으로 호출
a = MyCala.my_add(5,7)	
print(a)

 

private 멤버 변수

  • 클래스 내부 멤버 변수 중 숨기고 싶은 변수가 있을 경우 사용
  • 숨기고 싶은 변수가 있을 경우 언더바(_)언더바(_)name 으로 사용
  • 이름 변경 (Naming Mangling) : 외부에서 접근이 어렵도록 하는 파이썬의 특징으로, 외부에서 클래스 내부 멤버 변수 호출 시 원래 이름이 아닌 _클래스명__멤버 변수로 변경됨

식별자

  • 키워드는 아니지만 private 멤버 변수로 사용하기 위해 미리 정해진 용도로 사용하는 문자
식별자 (예약어) 정의 예시
_* 모듈(파일)안에서 _로 시작하는 식별자를 정의하면 다른 파일에서 접근할 수 없음 _name
__*__ 식별자의 앞뒤에 __가 붙어 있는 식별자는 시스템에서 정의한 이름 __doc__
__* 클래스 안에서 외부로 노출되지 않는 식별자로 인식 __name

 

상속과 다형성

  • 상속성 : 부모 클래스에서 공통 부분을 상속받는 것
  • 다형성 : 동일한 인터페이스에 대해 구체적인 인스턴스마다 다른 동작을 할 수 있는 것

상속이란 부모 클래스의 모든 멤버를 자섹 클래스에게 물려줄 수 있는 것이다

자식클래스(부모클래스) 문법을 사용한다

class Person:
	"부모 클래스"
	def __init__(selft, name, phone):
		self.Name = name
		self.Phone = phone
	def printinfo(self):
		print("Hello Person")

class Student(Person):
	"자식 클래스"
	def __init__(self, name, phone, subject, studentID):
		# 상속받은 부모 클래스의 생성자를 명시적으로 호출하는 방법    
		Person.__init__(self, name, phone)	
		self.subject = subject
		self.studentID = studentID

다형성 (Override) : 상속받은 메소드의 바디를 덮어써 재정의 한다

class Person:
	# 생략 ...
    
class Student(Person):	
	# 생략 ...
	def printinfo(self):
		print("Hellow Student!")

 

다중상속과 이름충돌(name conflict)

  • 다중상속 : 2개 이상의 클래스를 동시에 상속받는 것을 의미
class Tiger:
	def jump(self):
		print("호랑이 점프")

class Lion:
	def bite(self):
		print("사자 꿀꺽")

class Liger(Tiger, Lion):	# 다중상속 구현
	def play(self):
		print("라이거 놀이")
  • 이름 충돌이 나는 경우 파이썬은 상속받은 순서를 보고 내부에서 결정한다
    • 먼저 상속받은Tiger 의 cry 호출
class Tiger:
	def cry(self):
		print("호랑이:어흥")

class Lion:
	def cry(self):
		print("사자:으르렁")

class Liger(Tiger, Lion):	# 다중상속 구현
l = Liger()
l.cry()		# 호랑이:어흥

 

 

728x90
반응형

댓글

추천 글