# 클래스(Class)

## 클래스?

지금까지 수업이 진행되면서, 간혹 클래스라는 말들이 언급되었습니다. Python은 객체지향언어이며, 객체지향언어의 가장 중요한 특성은 Class로 대표되는 기능으로 대표되기도 합니다. 그렇다면 클래스는 무엇일까요? '**클래스는 기능과 데이터를 함께 묶어둔 것이다**'라는 것이 가장 간결하면서도 명확한 설명입니다. 자세한 내용은 너무 복잡하고 어려운 내용이라 본 강의에서는 깊게 다루지 않겠습니다. (보다 자세한 내용을 살펴보고 싶으신 분들은 와우북스의 개체지향 이야기나 위키북스의 객체지향의 오해와 진실과 같은 책들을 읽어보시면 도움이 됩니다.)

이미 앞선 강의에서 여러분들은 변수나 함수에 관해서 배우셨습니다. 이제는 어느 정도 이러한 변수나 함수를 사용하는 법에 관해서도 익숙해지셨을 겁니다. 클래스를 살짝 살펴보면 특정 목적을 위해서 쓰여지는 변수와 함수들을 하나로 모둔 집합과 같이 생겼습니다.

## 클래스(Class)의 기본 형태

```python
class TestClass:
    description = "This is Test Class"

    def TestAdder(var_in1, var_in2):
        return var_in1 + var_in2
    
    def TestSubtract(var_in1, var_in2):
        return var_in1 - var_in2

print(TestClass.TestAdder(10,20))
print(TestClass.description)
print(TestClass.TestSubtract(30, 10))
```

우선 기본적인 클래스의 형태는 1부터 8행과 같은 모습입니다. 중간에 변수가 있고 함수들도 함께 있는 모습니다. 이해를 돕게 하기위해서 그저 단순한 모습해 두었습니다. 더욱이 10\~12행의 사용법만을 보면 클래스를 사용하는 것인지 모듈의 함수를 호출하는 것인지 알 수 없습니다.(보통 예시와 같은 사용법은 static class, 정적 클래스 사용법으로, 일반적인 클래스 사용법은 아니나 이해를 돕기 위해서 가장 간단한 방법의 것을 사용했습니다.)&#x20;

클래스에서는 변수와 함수에 대해서 각각 속성(Attribute)와 메소드(Method)라고 부릅니다. 클래스는 어떤 특정한 목적 또는 동작을 위해서 변수와 함수가 묶은 형태입니다. 따라서 그 목적에 대한 수단(Method)와 그 동작에 부가된 속성(Attribute)으로 일반적인 함수, 변수와 구분합니다.

## 사용방법

```python
class TestClass2:
    var_1 = 0
    var_2 = 0
    result = 0
    
    def TestAdder(self, var_in1, var_in2):
        self.var_1 = var_in1
        self.var_2 = var_in2
        self.result = var_in1 + var_in2
        return var_in1 + var_in2
    
    def TestSubtract(self, var_in1, var_in2):
        self.var_1 = var_in1
        self.var_2 = var_in2
        self.result = var_in1 - var_in2
        return var_in1 - var_in2


adder = TestClass2()
adder.TestAdder(10,20)

subt = TestClass2()
subt.TestSubtract(20, 10)
print(adder.result)
print(subt.result)
```

이번 예시는 앞의 것과 기능적으로는 동일합니다. 그러나, 앞의 내용이 정적 클래스와 유사한  사용법에 비하여 이 내용은 실제 클래스의 이용방법에 더 부합됩니다.

우선 2\~4행에 Attribute가 선언되었고, Method 들도 self라는 것이 포함되었습니다. self 라는 예약어는 클래스가 가진 속성들을 가져올 수 있는 내용으로 'self.'를 통하여 클래스 내부에서 자신의 속성에 접근합니다.&#x20;

19행과 22행을 보면 각각 TestClass2()로 특정 변수를 초기화하는 내용이 나옵니다. 이미 앞선 수업에서 int()나 list() 또는 dict() 등을 통하여 특정 변수들을 각각 정수형, 리스트, 딕셔너리 등으로 초기화시키는 것을 보았습니다. 클래스도 이와마찬가지 입니다.(실제로 int(), list(), dict()  등은 각각 클래스입니다.)

그리고, '.'을 사용하여 선언된 클래스의 속성에 접근하거나, 메소드를 실행시킬 수 있습니다. 다만 기억해야 할 점은 6행, 12행의 메소드 선언부와 달리 20행과 23행의 사용부는 전달하는 매개변수가 둘 밖에 없다는 것입니다. Python의 메소드는 기본적으로 self라는 것을 포함하는 것으로 간주합니다.

## \_\_init\_\_()

```python
class TestClass2:
    instanceCount = 0
    
    def __init__(self):
        self.var_1, self.var_2, self.result = 100, 100, 100
        TestClass2.instanceCount += 1

    def TestAdder(self,var_in1, var_in2):
        self.var_1, self.var_2, self.result = var_in1, var_in2, var_in1 + var_in2
        return self.result
    
    def TestSubtract(self,var_in1, var_in2):
        self.var_1, self.var_2, self.result = var_in1, var_in2, var_in1 - var_in2
        return self.result

test1 = TestClass2()
print(test1.var_1, test1.var_2, test1.result, test1.instanceCount)
test2 = TestClass2()
test1.TestAdder(10, 20)
print(test2.var_1, test2.var_2, test2.result, test2.instanceCount)
print(test1.var_1, test1.var_2, test1.result, test1.instanceCount)

test2.TestSubtract(55, 7)
print(test2.var_1, test2.var_2, test2.result, test2.instanceCount)
```

```
#결과 내용
100 100 100 1
100 100 100 2
10 20 30 2
55 7 48 2
```

클래스가 처음 할당되면 초기화가 필요한 경우가 있습니다. 이 때 가장 먼저 호출되는 메소드가 \_\_init\_\_()입니다. 별도로 메소드를 호출하지 않아도 클래스 할당시 자동으로 실행되는 내용입니다. 테스트를 위하여 초기화 부분에 각각의 속성에 100을 입력하였습니다. 5행을 보면 이 초기화 과장중 'self.' 형태로 클래스의 속성이 선언과 동시에 초기화되는 것을 보실 수 있습니다.

16행의 클래스를 할당하고 바로 출력을 하면 결과 내용 2행 처럼 100 100 100 1을 출력합니다. 초기화가 된 것이지요. 그러나, 19행의  메소드를 출력하면 연산된 결과값이 출력됩니다.  여기서 주목할 점은 변수와 마찬가지로 할당된 test1과 test2가 각각의 객체로 사용된다는 것입니다. 각각의 메소드를 사용하지만, 해당 객체는 별도의 속성을 가지고 있습니다.

반면 \_\_init\_\_()메소드 내에서 실행된 6행의 "TestClass2.instanceCount += 1" 내용은 객체가 아닌 해당 클래스에 대한 내용을 의미합니다. 내용은 클래스 할당시마다 instanceCount라는 속성을 1식 증가시키는 내용입니다. test1, test2로 두 번 할당되었기 때문에 이 내용은 증가되었으며, 할당된 개체에 상관없이 동일하게 증가됨을 확인할 수 있습니다.&#x20;

