반응형
클래스와 인스턴스
- 클래스란 ? 속성과 데이터를 변형하는 함수를 같은 이름 공간에 묶어 새로운 형식을 정의하는 것
- 인스턴스란 ? 클래스를 복사해서 생성한 복사본
클래스와 인스턴스 객체의 관계
- 쿠키 = 클래스
- 쿠키틀을 통해 찍어낸 과자 = 인스턴스
클래스 정의 문법 (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. 클래스에 새로운 멤버 변수 추가
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
반응형
'개발 스터디' 카테고리의 다른 글
마이크로서비스 아키텍처(MSA)의 기본 개념 소개 (0) | 2022.12.21 |
---|---|
[Network] CIDR (Classless Inter-Domain Routing) (0) | 2022.12.19 |
댓글