속성(특성)과 메소트(행위)를 가지고 있으며 이름을 붙일 수 있는 실체를 말하며 클래스를 실체화 혹은 인스턴스화 시킨 것이 객체이다.
속성
class Person: # 클래스는 첫글자만 대문자로 해주면 됨(객체와 클래스를 구분하기 위해서)
def __init__(self): # 클래스 안에 위치해 있는 함수 = 메소드
# __앞,뒤에 있으면 특수한 목적
# init은 생성자(constructor): 객체생성시 자동 호출됨, 속성을 정의하여 초기화 하기 위해 주로 사용함!
self._hakbun = ""
# self다음 점 찍고 나오는 것을 "속성"이라고 함
self._irum = ""
print("객체 생성")
def setHakbun(self, hakbun):
self._hakbun = hakbun
# 속성 #로컬변수
print("학번 변경")
def setIrum(self, irum):
self._irum = irum
print("이름변경")
def printData(self):
print("학번 : ", self._hakbun, "이름 : ", self._irum)
if __name__ == "__main__":
obj1 = Person() # 클래스 이름을 이용해 객체 만듬
obj1.setHakbun("A001") #obj1은 글로별 변수
obj1.setIrum("이기자")
obj1.printData()
하나의 생성자와 메소드
메소드가 객체에 다 저장이 됨
'A001'이 hakbun에 저장되서
hakbun이라는 지역변수에 출력하고
지역변수는 소멸됨
'이기자'가 irum에 저장되서
irum이라는 지역변수에 출력후
지역변수는 소멸됨
객체가 만들어지면 주소가 저장이 되는데
self는 생성된 객체의 주소
_hakbun, _irum => 속성
setHakbun(), serIrum(), printData() => 메소드(=함수)
객체가 없어질 때는
1. 참조되는 레퍼렌스가 없어질 때
2. 프로그램이 종료 될 때
Q. 프로그램이 종료되기 전에 소스에서 소멸자를 호출해야 하는건 어떤 경우인지 궁금합니다.
A. 공간을 할당 받았을 때 예상치 못한 상황이 발생해 프로그램이 종료되면 공간을 할다른 프로그램은 일부 공간을 영원히 못 쓰는 경우가 생기니 소멸자로 이를 대비해준다.
Q.소멸자를 그때그때 써주는 편이 좋나요?
A. 소멸자를 별도로 할당 받는 경우 소멸자를 써주는 게 베스트다.
단, 만든 객체가 다시 쓸일 없다고 생각되면 소멸자를 붙이지 않더라도 del 객체만 제거 된다. 제거 되면 그 공간을 또 다른 작업공간으로 활용할 수 있음.
Q. 소멸자를 사용한 삭제는 객체는 한번에 하나씩 제거가 되는 것인가요?
A. 위 코드의 경우 obj가 제거 되는 것
obj 객체를 제거 했는데 또 obj를 생성할 수 없음
이렇게도 할 수 있음
oj1 = Person()을 객체를 생성하면 오류난다.
어떻게 해야 오류가 안 날까?
C언어는 여러개의 생성자를 만드는 게 가능하지만
파이썬은 한가지의 생성자를 만들 수 있다.
메소드 오버로딩
메소드 이름은 동일하게 정의하되 파라미터를 다르게 주는 것
이름은 동일하더라도 파라미터 형식에 따라 식별이 가능함
파이썬은 메소드 오버로딩이 해당되지 않는다.
두 가지중에 한 가지를 선택해야함
obj와 obj1 중 하나를
파라미터가 없었던 obj에 넣어줌
Q. 객체의 멤버변수는 보통 언더바를 사용하나요?