객체지향프로그래밍이란 4편 - method에 대한 모든것-
1. method
특정 데이터 클래스의 객체에 공통적으로 적용 가능한 행위인 함수
클래스 안에 있는 함수
method의 종류에는 instance, class, static method가 있다
대부분이 instance method에 해당함
instance method는 instance와 관련된 것을 처리하는, instance에 영향을 미치는 함수
class method는 class와 관련된 것을 처리하는 함수
static method는 instance도 아니고 class도 아닌 method. class나 instance와는 상관 없다
2. instance method
instance 변수를 사용하거나 instance 변수에 값을 설정하는 메소드
클래스 내부에 정의되는 기본적인 method들은 instance method
호출할 때 항상 첫번째 인자로 인스턴스 자기자신인 self가 자동으로 전달
self가 있으면 instance method
3. self
self는 인스턴스 자기자신을 가리킨다
파이썬에서 instance method는 호출할 때 반드시 instance 자기 자신이 전달되도록 설계되어있다
instance method의 첫번째 인자를 self로 인식함
이 말은 self말고 다른 명칭을 써도 된다는 이야기인데, 암묵적으로 self라고 쓴다
함수 쓰듯이 할려면 Person.talk(person1)으로 self에 instance를 전달하는 식으로 쓰지만..
파이썬은 설계상으로 person1.talk()하면 talk의 첫번째 인자 self에 person1이 들어가도록 설계되어 있다
4. 생성자 메소드(constructor)
인스턴스 객체가 생성될 때 자동으로 호출되는 메소드
반드시 def __init__(self, ....):으로 정의함
인스턴스 변수들의 초기값을 설정하는데 사용
instance를 생성하면 __init__이 자동으로 수행되어 print문이 출력된다는것 확인
5. 매직 메소드(magic method)
double underscore(__)가 양쪽에 들어간, 특수한 동작을 위해 파이썬에서 만들어진 method
혹은 special method나 dunder method라고도 부름
특정한 상황에서 자동으로 함수가 수행
이 외에도 엄청 많이 있다
특정한 상황이 뭔데??
__str__(self)는 class를 print할때 __str__의 return값이 출력되는(정확히는 str(class)를 수행하면 보여지는 함수)
==이나 >를 수행할때 호출되는 __eq__(self, other), __gt__(self,other)
인스턴스 method니까 어떻게 정의하느냐에 따라 일단 instance마다 다른 결과가 나올거
return을 바꾸면 연산결과를 바꿀 수 있겠지??
5가 10보다 크냐고 물어보면.. __gt__가 호출되는데 나는 결과를 그 반대인 self.n < other.n으로 정의해서
num2가 더 크면 True라고 정의했기때문에 num1 > num2가 우리가 아는 num2인 10이 더 큼에도 True가 나옴
__gt__를 정의하면 자동으로 __lt__도 있나봐..?
6. 소멸자 메소드(destructor)
instance 객체가 소멸되기 직전에 호출되는 method
def __del__(self): 로 정의
del함수를 사용할때 호출되는 것이 아니라 instance가 소멸되면 호출된다는 것이 중요한데
파이썬은 프로그램이 끝나면 필요없을 것 같은 객체는 자동으로 garbage collector(gc)가 수거해간다
그러면서 원하지 않게 __del__이 호출될 수 있다
특히 한블록을 하나의 프로그램이라고 생각하는 주피터노트북 사용할때 문제될수가 있음
person2, person3는 del로 삭제하지 않았는데 하나의 프로그램이 끝나니 garbage collector가 자동으로 person2, person3를 수거해가서 사라졌다고 나옴
물론 근데 웃긴게 다른 블록에서 person2, person3가 진짜로 사라진건 아님..완전히 삭제한건 del로 삭제한 person1이고 person2, person3 는 메모리 관리를 위해 임시로 수거해간 느낌?
코드예시)
7. class method
class가 사용할 method
@classmethod라는 데코레이터로 정의함
호출 시 첫번째 인자로 cls라는 class인자가 전달된다
cls는 instance method의 self인자 같은 개념임
마찬가지로 첫번째인자를 어떻게 쓰든지간에 class로 받아들이며, cls로 쓰는게 일반적이다
코드예시)
8.데코레이터
함수를 어떤 함수로 꾸며서 새로운 기능을 부여하는 것
@데코레이터명 형태로 함수 바로 위에 작성함
순서대로 적용되므로 작성 순서가 중요하다
예시) 데코레이터 없이 함수를 꾸미려면?
원래 함수 original()의 위 아래로 함수 시작, 함수 끝을 출력해서 살짝 꾸며주는 함수가 add_print()
근데 모든 함수마다 비슷하지만 약간씩 다르게 꾸미고 싶다거나.. ? 모든 함수에 이런식으로 꾸미고 싶으면..
저렇게 함수를 하나하나 다 만들고 add_print(hello) 이런식으로 써서 하는데 그게 함수가 많을수록 비효율적이다 이거
9. class method와 instance method의 차이?
class method는 class변수인 cls사용
instance method는 instance변수인 self사용
class는 instance변수를 사용할 수 없지만 instance는 class변수와 instance변수 모두 사용 가능
그래서 class변수와 instance변수 모두 처리해야한다면..? instance method에서 가능
class로 instance변수에 접근하면 위와 같이 에러
instance method에서 class변수 처리
하지만 반대로 class method에서 instance 변수 처리 가능?
뭐야 불가능하진 않네... 그냥 정리하자면 class는 instance 변수에 접근 불가능하고, instance는 instance, class변수 모두에 접근 가능..
그래서 cls.<instance변수>는 안돼.. 하지만 self.<class변수>는 가능하고
번외로 당연한거지만 위와같이 self인자를 받지 않았으니.. 함수내에서 쓰는건 당연히 불가
10. static method
인스턴스 변수나 클래스 변수를 전혀 다루지 않는 메소드
속성,데이터를 다루지 않고 단순히 기능(행동)만을 하는 메소드를 정의하고 싶을때
cls, self를 모두 안쓰고 메소드를 만들고 싶을 때
그러니까 class나 instance의 속성, 상태를 수정할수는 없겠지? 바로 위에서 self인자를 받지 않고는 못쓴다고 보여줬으니까
@staticmethod라고 함수 바로 위에 사용하여 정의함
코드예시)
근데 static method에 cls나 self를 받아서 상태를 바꿀수 없지는 않아
인자로 받으면 이렇게 바꿀수도 있는데??
11. class에서 적용되는 파이썬의 이름 탐색 규칙
class를 정의하면 class에 해당하는 이름 공간을 생성
instance를 생서앟면 instance 객체가 생성되고 이름 공간을 생성
만약 instance에 특정 속성에 접근한다면, instance 공간을 먼저 탐색하고, 없으면 class 공간에서 찾는다
12. 정리
instance method
호출한 인스턴스를 의미하는 self 매개변수로 인스턴스를 조작
class method
클래스를 의미하는 cls 매개변수로 클래스를 조작
static method
class 변수나 instance변수를 사용하지 않는 경우
인스턴스 메소드 사용?
class로 인스턴스를 생성하고 (instance명).(method명)()
instance를 수동으로 넣기 위해 (class명).(method명)(instance,...)으로도 사용가능하지만 권장하진 않는다
self나 cls는 이름 바꿔서 써도 되지만 일반적으로 self, cls를 쓰는게 암묵적인 룰
class는 class method, static method는 호출할 수 있지만 instance method는 호출할려면 self인자를 내놓으라고 에러남
물론 self인자를 넣으면 호출은 가능함
하지만 instance는 class method, static method, instance method 모두에 동작할 수 있다
심지어 위 그림을 보면 알겠지만.. instance.(classmethod)()해도 cls에 instance가 들어가는게 아니라 instance의 class가 자동으로 들어간다는 것도 확인 가능하다
'프로그래밍 > Python' 카테고리의 다른 글
객체지향프로그래밍이란 6편 -다형성,캡슐화- (0) | 2022.07.31 |
---|---|
객체지향프로그래밍이란 5편 - 추상화, 상속 - (0) | 2022.07.31 |
객체지향프로그래밍이란 3편 -class를 생성하는 방법과 attribute의 모든 것- (0) | 2022.07.30 |
객체 지향 프로그래밍이란 2편 -객체는 무엇인가- (0) | 2022.07.30 |
객체지향 프로그래밍이란 1편 -정의와 왜 필요한지?- (0) | 2022.07.30 |