클래스는 객체를 표현하기 위한 문법으로 사람, 자동차 같은 특정한 개념이나 모양을 나타냅니다.

이를 실체로 구현한 것을 객체(object)라고 부릅니다. 이렇게 객체를 사용한 프로그래밍 언어를 객체 지향(object oriented) 언어라고 부르며 파이썬에서 사용되는 list, dict 등도 클래스 입니다.

클래스에는 크게 속성(데이터, 변수)과 메소드(함수)로 구성됩니다.객체는 클래스의 인스턴스라고도 하며 이 객체를 생성하는 프로세스를 인스턴스화라고 합니다.

 

클래스 정의

파이썬에서 함수 정의가 def 키워드로 시작하는 것처럼 클래스 정의는 class 키워드로 시작합니다.
클래스 내부의 첫 번째 문자열은 docstring이라고 하며 클래스에 대한 간략한 설명을 적습니다. 필수 사항은 아니지만 적극 권장합니다.

다음은 간단한 클래스 정의입니다.

class MyNewClass:
    '''This is a docstring. I have created a new class'''
    pass

 

클래스는 모든 속성이 정의된 새 로컬 네임스페이스를 만듭니다. 속성은 데이터 또는 함수일 수 있습니다.
이중 밑줄 __로 시작하는 특수 속성도 있습니다. 예를 들어 __doc__은 해당 클래스의 독스트링을 제공합니다.
클래스를 정의하면 동일한 이름으로 새 클래스 객체가 생성됩니다. 이 클래스 개체를 사용하면 다른 속성에 액세스할 수 있을 뿐만 아니라 해당 클래스의 새 개체를 인스턴스화할 수 있습니다.

class Car:
    "첫번째 문장은 docstring입니다."
    year = 2020

    def run(self):
        print("주행을 시작합니다.")

print(Car.year)
print(Car.run)
Car.run(Car)
print(Car.__doc__)

## 실행결과
2020
<function Car.run at 0x000002240D806AF0>
주행을 시작합니다.
첫번째 문장은 docstring입니다.

 

 

오브젝트 생성

해당 클래스의 새로운 객체 인스턴스(인스턴스화)를 만드는 데 사용할 수도 있습니다. 객체를 생성하는 절차는 함수 호출과 유사합니다.

bmw = Car()

 

이렇게 하면 bmw라는 새 인스턴스가 생성됩니다. 객체명으로 객체의 속성에 액세스할 수 있습니다.
속성은 데이터 또는 메소드일 수 있습니다. 개체의 메서드는 해당 클래스의 기능입니다.
이것은 Car.run 이 함수 객체(클래스의 속성)이기 때문에 Person.run가 메소드 객체가 된다는 것을 의미합니다.

class Person:
    "This is a person class"
    age = 10

    def greet(self):
        print('Hello')

harry = Person()

print(Person.greet)
print(harry.greet)
harry.greet()

## 실행경과
<function Person.greet at 0x000002227ADF6AF0>
<bound method Person.greet of <__main__.Person object at 0x000002227ADB74F0>>
Hello

 

객체가 메서드를 호출할 때마다 객체 자체가 첫 번째 인수로 전달됩니다.harry.greet()는 Person.greet(harry)로 변환됩니다.
일반적으로 n개의 인수 목록으로 메서드를 호출하는 것은 첫 번째 인수 앞에 메서드의 개체를 삽입하여 생성된 인수 목록으로 해당 함수를 호출하는 것과 같습니다.
이러한 이유로 클래스에 있는 함수의 첫 번째 인수는 객체 자체여야 합니다. 이것을 관례적으로 self라고 합니다. 다른 이름으로 지정할 수 있지만 규칙을 따르는 것이 좋습니다.

Constructors(생성자)

이중 밑줄 __로 시작하는 클래스 함수는 특별한 의미를 가지므로 특수 함수라고 합니다.
특히  __init__() 함수는 해당 클래스의 새 개체가 인스턴스화될 때마다 호출됩니다.

이러한 유형의 함수는 객체 지향 프로그래밍(OOP)에서 생성자라고도 합니다. 일반적으로 모든 변수를 초기화하는 데 사용합니다.

class ComplexNumber:
    def __init__(self, r=0, i=0):
        self.real = r
        self.imag = i

    def get_data(self):
        print(f'{self.real}+{self.imag}j')


# Create a new ComplexNumber object
num1 = ComplexNumber(2, 3)

# Call get_data() method
# Output: 2+3j
num1.get_data()

# Create another ComplexNumber object
# and create a new attribute 'attr'
num2 = ComplexNumber(5)
num2.attr = 10

# Output: (5, 0, 10)
print((num2.real, num2.imag, num2.attr))

# but num1 object doesn't have attribute 'attr'
# AttributeError: 'ComplexNumber' object has no attribute 'attr'
print(num1.attr)

Output

2+3j
(5, 0, 10)
Traceback (most recent call last):
  File "<string>", line 27, in <module>
    print(num1.attr)
AttributeError: 'ComplexNumber' object has no attribute 'attr'

In the above example, we defined a new class to represent complex numbers. It has two functions, __init__() to initialize the variables (defaults to zero) and get_data() to display the number properly.

An interesting thing to note in the above step is that attributes of an object can be created on the fly. We created a new attribute attr for object num2 and read it as well. But this does not create that attribute for object num1.

위의 예에서 우리는 복소수를 나타내는 새로운 클래스를 정의했습니다. 여기에는 변수를 초기화하는 __init__() 함수(기본값은 0)와 숫자를 올바르게 표시하는 get_data()의 두 가지 함수가 있습니다.

위 단계에서 주목해야 할 점은 객체의 속성이 즉석에서 생성될 수 있다는 것입니다. 우리는 객체 num2에 대한 새로운 속성 attr을 생성했습니다.


속성 및 개체 삭제

del 문을 사용하여 개체의 모든 속성을 언제든지 삭제할 수 있습니다. 

>>> num1 = ComplexNumber(2,3)
>>> del num1.imag
>>> num1.get_data()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'imag'

>>> del ComplexNumber.get_data
>>> num1.get_data()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'get_data'

 

del 문을 사용하여 객체 자체를 삭제할 수도 있습니다.

c1 = ComplexNumber(1,3)
del c1

 

실제로는 그보다 더 복잡합니다. c1 = ComplexNumber(1,3)를 수행하면 메모리에 새 인스턴스 객체가 생성되고 c1이라는 이름이 이에 바인딩됩니다.

del c1 명령에서 이 바인딩이 제거되고 이름 c1이 해당 네임스페이스에서 삭제됩니다. 그러나 객체는 메모리에 계속 존재하며 다른 이름이 바인딩되지 않은 경우 나중에 자동으로 소멸됩니다.
Python에서 이러한 참조되지 않은 객체의 자동 파괴를 가비지 콜렉션이라고 합니다.

Python에서 객체를 삭제하면 이름 바인딩이 제거됩니다.

'Python' 카테고리의 다른 글

Python - 입출력  (0) 2022.01.06
Python - module  (0) 2022.01.06
python - decorator  (0) 2022.01.05
파이썬 - list  (0) 2022.01.05
파이썬 - lambda 함수  (0) 2022.01.05

+ Recent posts