객체, 클래스, 추상화, 인스턴스화
- 객체(Object) : 실제로 존재하는 구체적인 대상 또는 시스템. 객체는 유일하고 다른 객체와 구별된다. 객체는 상태(속성, 멤버 변수)와 행위(메소드, 멤버 함수)를 가진다. (attribute, method) : (member variable, member function 이라고도 불린다.)
- 클래스(Class) : 새로운 자료형을 만든다. 구조체랑 비슷하다.
- 추상화(Abstraction) : 동일 유형 객체를 하나의 자료형으로 묶음. 즉 각 객체를 하나의 클래스로 묶음. 객체 -> 클래스
- 인스턴스화(Instantiation) : 클래스를 하나의 객체로 표현. 추상화와는 반대. 클래스 -> 객체
예시1
class C1 :
a = 1
print(C1.a)
print(dir(C1))
del C1.a
print(dir(C1))
print(C1.a)
# output :
1
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
Traceback (most recent call last):
File "main.py", line 9, in <module>
print(C1.a)
AttributeError: type object 'C1' has no attribute 'a'
.
연산자를 이용해 클래스의 멤버변수, 멤버함수에 접근한다.dir()
함수는 클래스의 속성을 보는 함수이다.del()
은 멤버변수를 삭제하는 함수이다.
위 예시에서, del()
명령어 이후로 dir()
을 사용했을 때, 멤버 변수 a
가 출력되지 않는 것을 볼 수 있다. 또한 C1.a
를 통해 접근도 되지 않는다.
예시2 : 인스턴스 생성
class C1 :
a = 1
print(C1.a)
C1.b = 2 # 멤버변수 생성
print(C1.b)
x = C1() # 인스턴스 생성, 클래스와는 따로 산다.
x.a = 10
print(x.a)
print(C1.a) # x.a와는 다른 값이 나온다.
# output:
1
2
10
1
클래스에서 인스턴스를 만들려면 x = C1()
라고 치면 된다
객체와 인스턴스의 차이(안중요)
클래스로 만든 객체를 인스턴스라고도 한다.
객체와 인스턴스의 차이는 무엇일까?
a = Cookie() 이렇게 만든 a는 객체이다. 그리고 a 객체는 Cookie의 인스턴스이다.
즉 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용한다.
"a는 인스턴스"보다는 "a는 객체"라는 표현이 어울리며 "a는 Cookie의 객체"보다는 "a는 Cookie의 인스턴스"라는 표현이 훨씬 잘 어울린다.
정적 메서드, 클래스 메서드
메서드는 클래스 안에 있는 함수. 멤버함수라고도 한다.
정적 매서드(Static Method) : 인스턴스 개체를 따로 안만들어도 됨
클래스 메서드(Class Method) : 무조건 첫 인수로 클래스 객체를 전달한다
정적 메서드는 self를 받지 않는다. 그래서 인스턴스 속성에는 접근할 수 없다. 정적 메서드는 인스턴스 속성, 인스턴스 메서드가 필요 없을 때 사용합니다.
클래스 메서드는 정적 메서드처럼 인스턴스 없이 호출할 수 있다는 점은 같으나, 클래스 메서드는 메서드 안에서 클래스 속성, 클래스 메서드에 접근해야 할 때 사용합니다.
예시
class Calculator:
def mul(x,y) :
return x*y
@staticmethod # 정적메서드 선언
def add(x,y) :
return x + y
@classmethod # 클래스메서드 선언
def total(x,y) :
return x + y
print(Calculator.mul(10,20))
print(Calculator.add(10,20))
print(Calculator.total(10, 20))
# output:
200
30
Traceback (most recent call last):
File "main.py", line 13, in <module>
print(Calculator.total(10, 20))
TypeError: total() takes 2 positional arguments but 3 were given
이 경우는 에러가 뜬다@
를 데코레이터라고도 한다.
class Calculator:
result = 0
def mul(x,y):
return x * y
@staticmethod
def add(x,y):
return x + y
result = 0
@classmethod
def total(x,y):
x.result = x.result + y
return x.result
print(Calculator.mul(10,20))
print(Calculator.add(10,20))
print(Calculator.total(10))
이건 ok
메서드의 또 다른 호출 방법
잘 사용하지는 않지만 다음과 같이 클래스를 통해 메서드를 호출하는 것도 가능하다.
a = FourCal()
FourCal.setdata(a, 4, 2)
위와 같이 클래스 Classname.Method
형태로 호출할 때는 객체 a를 첫 번째 매개변수 self에 꼭 전달해 주어야 한다.
반면에 다음처럼 객체.메서드 형태로 호출할 때는 self를 반드시 생략해서 호출해야 한다.
a = FourCal()
a.setdata(4, 2)
참고
클래스메서드
'Programming Tools > Python_파이썬' 카테고리의 다른 글
[Python] 파이썬 자료형과 연산 (0) | 2021.10.17 |
---|---|
[Python] 문자열 자료형 (0) | 2021.06.17 |
[Python] - 반복문, 함수의 정의, 동적타이핑 (Loop, Defining Function, Dynamic Typing) (0) | 2021.05.18 |
Python - 조건문, 자주 사용하는 함수 (0) | 2021.05.17 |
Python - 연산자 (0) | 2021.05.17 |