관리 메뉴

정리왕

파이썬 클래스1 (클래스란?) 본문

6.개발/파이썬 공부하기

파이썬 클래스1 (클래스란?)

정리합니다 2020. 11. 29. 15:54
반응형

파이썬 클래스1 (클래스란?)

 

 

이제 프로그래밍의 꽃이라 할 수 있는 1) 클래스, 2) 모듈, 3) 예외 처리, 4) 파이썬 라이브러리에 대해서 알아보자.

 

초보 개발자들에게 클래스(class)는 넘기 힘든 장벽과도 같은 존재이다.

도대체 클래스가 무엇인지, 클래스가 왜 필요한지 아주 기초적인 것부터 차근차근 함께 알아보자.

 

 

 

 

# 클래스는 왜 필요한가?

프로그래머들이 가장 많이 사용하는 프로그래밍 언어 중 하나인 C 언어에는 클래스가 없다.

이 말은 굳이 클래스가 없어도 프로그램을 충분히 만들 수 있다는 뜻이다.

파이썬으로 잘 만든 프로그램을 살펴보아도 클래스를 사용하지 않고 작성한 것들이 상당히 많다.

클래스는 지금까지 공부한 함수나 자료형처럼 프로그램 작성을 위해 꼭 필요한 요소는 아니다.

 

하지만 프로그램을 작성할 때 클래스를 적재적소에 사용하면 프로그래머가 얻을 수 있는 이익은 상당하다.

 

예제를 통한 한 번 생각해 보자.

여러분 모두 계산기를 사용해 보았을 것이다.

계산기에 숫자3을 입력하고 + 기호를 입력한 후 4를 입력하면 결과값으로 7을 보여 준다.

다시 한번 + 기호를 입력한 후 3을 입력하면 기존 결과값 7에 3을 더해 10을 보여준다.

즉, 계산기는 이전에 계산한 결과값을 항상 메모리 어딘가에 저장하고 있어야 한다.

 

이런 내용을 우리가 앞에서 익힌 함수를 이용해 구현해 보자.

 

 

 

 

계산기의 '더하기'기능을 구현한 파이썬 코드는 다음과 같다.

함수를 만들어보자.

add 함수는 매개변수 num에 받은 값을 이전에 계산한 결과값을 더한 후 돌려주는 함수이다.

add 함수는 매개변수 num에 받은 값을 이전에 계산한 결과값에 더한 후 돌려주는 함수이다.

result += num =======> result = result + num

 

이전에 계산한 결과값을 유지하기 위해서 result 전역 변수(global)를 사용했다.

프로그램을 실행하면 예상한 대로 다음과 같은 결과값이 출력된다.

그러데 만일 한 프로그램에서 2개의 계산기가 필요한 상황이 발생하면 어떻게 해야 할까?

각 계산기는 각각의 결과값을 유지해야 하기 때문에 위와 같이 add 함수 하나만으로는 결과값을 따로 유지할 수 없다.

이런 상황을 해결하려면 다음과 같이 함수를 각각 따로 만들어야 한다.

 

 

그런데 만일 한 프로그램에서 2개의 계산기가 필요한 상황이 발생하면 어떻게 해야 할까?

각 계산기는 각각의 결과값을 유지해야 하기 때문에 위와 같이 add함수 하나만으로는 결과값을 따로 유지할 수 없다.

이런 상황을 해결하려면 다음과 같이 함수를 각각 따로 만들어야 한다.

result1 = 0
result2 = 0

def add(num):
       global result1
       result1 += num
       return result1

def add(num):
       global result2
       result2 += num
       return result2

print(add(3))
print(add(4))
print(add(3))
print(add(7))

 

똑같은 일을 하는 add1과 add2 함수를 만들었고 각 함수에서 계산한 결과값을 유지하면서 저장하는 전역 변수 result1, result2가 필요하게 되었다. 

 

 

결과값은 다음과 같이 의도한 대로 출력된다.

3
7
10
17

계산기 1의 결과값이 계산기 2에 아무 영향을 끼치지 않음을 확인할 수 있다.

하지만 계산기가 3개, 5개, 10로 점점 더 많이 필요해진다면 어떻게 해야 할까? 그때마다 전역 변수와 함수를 추가할 것인가? 여기에 빼기나 곱하기 등의 기능을 추가해야 한다면 상황은 점점 더 어려워 질 것이다.

 

아직 클래스에 대해 배우지 않았지만, 위와 같은 경우에 클래스를 사용하면 다음과 같이 간단하게 해결할 수 있다.

class Calculator:
       def __init__(self):
              self.result = 0

       def add(self, num):
              self.result += num
              return self.result

cal1 = Calculator()
cal2 = Calculator()
print(cal1.add(3))
print(cal1.add(4))
print(cal2.add(3))
print(cal2.add(7))

프로그램을 실행하면 함수 2개를 사용했을 때와 동일한 결과가 출력된다.

3
7
3
10

Calculator 클래스로 만든 별개의 계산기 cal1, cal2 (파이썬에서 이것을 객체라고 부른다)가 각각의 역할을 수행한다. 그리고 계산기(cal1, cal2)의 결과값 역시 다른 계산기의 결과값과 상관없이 독립적인 값을 유지한다. 클래스를 사용하면 계산기 대수가 늘어나더라도 객체를 생성만 하면 되기 때문에 함수를 사용하는 경우와 달리 매우 간단해진다. 만약 빼기 기능을 더하려면 Calculator 클래스에 다음과 같이 빼기 기능 함수를 추가해 주면 된다.

       def sub(self, num):
              self.result -= num
              return self.result

 

클래스의 이점은 단순히 이것만이 아니다. 하지만 이것 하나만으로도 '도대체 왜 클래스가 필요한 것일까?"라는 근본적인 물음에 대한 해답이 되었을 것이다.

 

 

클래스와 객체

클래스를 가장 잘 설명해주는 아래쪽 그림을 보자. 과자를 만드는 과자 틀과 그것을 사용해 만든 과자이다. 여기에서 설명한 클래스는 과자 틀과 비슷하다. 클래스(class)란 똑같은 무엇인가를 계속해서 만들어 낼 수 있는 설계 도면이고(과자 틀), 객체(object)란 클래스로 만든 피조물(과자 틀을 사용해 만든 과자)을 뜻한다.

과자 틀 ===> 클래스(class)

과자 틀을 사용해 만든 과자 =====> 객체(object)

클래스로 만든 객체에는 중요한 특징이 있다. 바로 객체마다 고유한 성격을 가진다는 것이다. 과자 틀로 만든 과자 구멍을 뚫거나 조금 베어 먹더라도 다른 과자에는 아무 영향이 없는 것과 마찬가지로 동일한 클래스로 만든 객체들은 서로 전형 영향을 주지 않는다.

 

 

다음은 파이썬 클래스의 가장 간단한 예이다.

>>> class Cookie:
	pass

>>> 

위의 클래스는 아무 기능도 갖고 있지 않는 껍질뿐인 클래스이다. 하지만 이렇게 껍질뿐인 클래스도 객체를 생성하는 기능이 있다. '과자 틀'로 ;과자'를 만드는 것처럼 말이다.

객체는 클래스를 만드며 1개의 클래스는 무수히 많은 객체를 만들어 낼 수 있다. 위에서 만든 Cookie클래스의 객체를 만드는 방법은 다음과 같다.

>>> a = Cookie()
>>> b = Cookie()

Cookie( )의 결과값을 돌려받은 a와 b가 바로 객체이다. 마치 함수를 사용해서 그 결과값을 돌려받는 모습과 비슷하다.

 

 

# 객체와 인스턴스의 차이

클래스로 만든 객체를 인스턴스라고도 한다. 그렇다면 객체와 인스턴스의 차이는 무엇일까? 이렇게 생각해보자. a =Cookie( ) 이렇게 만든 a는 객체이다. 그리고 a 객체는 Cookile의 인스턴스이다. 즉 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookile)의 객체인지를 관계 위주로 설명할 때 사용한다. 'a는 인스턴스'보다는 'a는 객체'라는 표현이 어울리며 'a는 Cookie의 객체'보다는 'a는 Cookie의 인스턴스'라는 표현이 훨씬 잘 어울린다.

반응형
Comments