Python - "Class" 이녀석
#Python #Class #softwareengineering
목차
Software Engineering…
통계, 선형대수, ML 섹션을 거치면서 늘 사용해왔던 파이썬. 노트북 파일(ipynb)로 편하게 이용해왔지만 기본적인 지식이 부족하여 수시로 뱉어내는 에러를 해결 하는 과정은 녹록치 않았다. 그래서 그동안 에러를 볼 때마다 이번 섹션인 Software Engineering 섹션을 내심 기다려왔다. 그리고 마침내 두둥등장. 기본적인 개발환경에 대한 이해부터 직접 설정해보기도 하고 파이썬에 대해 조금 더 자세하게 들여다 본 한 주가 지났다. 이번 주에 배웠던 내용중에 이해가 잘 가지 않아 고생했던 Python의 Class가 바로 오늘의 주제다. 시작해보자.
Class?
다른 프로그래밍 언어인 C에는 클래스가 없다는데 그럼 클래스는 왜 필요한 걸까?
흔히 클래스의 개념을 설명할 때 계산기로 많이 설명하는데 이보다 적절한 예시를 찾지 못했기 때문에 계산기를 예로 들어보겠다.
계산기에 1+1
을 입력하면 계산기는 2
라는 값을 출력한다. 여기서 바로 +3
를 누르면 5
를 출력해준다. 첫번째 계산에서 출력된 결과인 2
를 어딘가에 저장해 두었고, 덕분에 우리는 바로 +3
만 눌러서 5
라는 결과를 받아볼 수 있다. 이렇게만 보면 뭐가 특별한가 싶지만 동시에 더 많은 계산을 하고, 더 복잡한 계산을 할수록 이전의 계산결과 저장을 위해 더 많은 메모리를 필요로 한다.
클래스라는 개념은 이렇게 많은 메모리가 필요한 상황을 타개하기 위한 것이다. 클래스를 잘 사용하면 메모리를 효율적으로 사용할 수 있다는 이야기. 여기까지 보면 클래스가 왜 필요한지에 대한 근본적인 궁금증은 해결이 되었을 것 같다.
클래스에 대해 공부하다보면 클래스와 객체가 있다는데 이는 또 무엇인가…
쉽게 이야기하면 클래스는 붕어빵틀, 객체는 붕어빵이라고 생각하면 된다.
우리는 붕어빵틀(class
)를 이용해서 붕어빵(object)을 계속 찍어낼 수 있다. 클래스와 객체를 이해할 때 가장 중요한 것은 찍어낸 붕어빵들 간에는 고유한 특성을 가진다는 것이다.(한 개의 붕어빵의 꼬리를 베어먹었다고 해서 다른 붕어빵의 꼬리가 잘려나가지 않는 것처럼) 서로서로 독립되어있다는 이야기.
class BreadFrame:
pass
이렇게 빵틀이라는 클래스가 있으면
soboro = BreadFrame()
garlicbread = BreadFrame()
soboro
, garlicbread
처럼 많은 빵들을 찍어낼 수 있다.
BreadFrame
라는 빵틀의 결과물인 soboro
, garlicbread
가 바로 객체가 되는 것이다.
여기서 인스턴스라는 용어와 객체가 헷갈릴 수 있는데 요점만 딱 말하자면 `soboro`는 객체(object)이자 `BreadFrame`의 인스턴스이다.
남들은 쉽다고 하겠지만 나는 골머리를 앓았던 계산기를 클래스를 활용하며 만들어보자.
class Calcula:
def __init__(self, a, b):
self.a = a
self.b = b
def addition(self):
return self.a + self.b
def subtraction(self):
return self.a - self.b
상속
다음은 클래스의 상속에 관한 내용이다.
흔히 재산을 상속받는 다는 얘기로 많이 들어보았을 상속은 클래스에서도 같은 의미로 적용된다.
앞의 계산기에서 덧셈, 뺄셈만 가능한 불완전한 계산기를 만들었는데(클래스 이름이 Calcula인 이유) 이 두가지 기능만 넣은 이유가 있다.
바로 이 상속 개념을 적용하여 곱셈, 나눗셈 기능을 추가해 볼 것이다.
class Calculator(Calcula):
def __init__(self, a, b):
super().__init__(a, b)
def multiplication(self):
return self.a * self.b
def division(self):
return self.a / self.b
이렇게 완성된 계산기 Calculator
를 확인해보면
# 인스턴스 생성
result = Calculator(1, 2)
# input
result.addition()
# output
3
기존의 Calcula
로부터 덧셈기능을 잘 상속받은 것을 확인할 수 있고,
# input
result.multiplication()
# output
2
Calculator
클래스에서 추가한 곱셈기능도 무사히(?) 작동하고 있는 것을 확인할 수 있다.
여기서
# 생성자 함수
def __init__(self, a, b):
self.a = a
self.b = b
__init__
은 생성자 함수로, 해당 클래스(붕어빵틀)로 생성된 인스턴스(붕어빵)의 초기값을 생성하는 함수다. 객체가 생성되는 동시에 자동으로 호출된다.
파이썬을 사용하면서 가장 기본이 되는 class에 대해서 알아보았다. 파이썬을 계속 쓰는 한 사용할 일이 많을 것 같고 더 심오한 내용도 많을 것 같지만 현재 이해할 수 있는 선에서 적어보았다. 일단 벌려놓아야 수습을 한다는 코치님들의 말을 믿고 일단 class에 대해 우선 포스팅을 해놓고 더 알아갈 때마다 와서 내용을 보완해야 할 것 같다.
코드스테이츠의 데이터사이언티스트 코스 세번째 섹션의 첫 주를 마무리하며..
이번 섹션을 너무 겁없이 기다려왔던 것이 아닌가.. 싶을 정도로 어려운 한주였다.
그동안 편하게 사용해왔던 shift + enter
를 뒤로하고 본격적으로 CLI(Command Line Interface)를 활용하여 학습을 진행하면서 느낀점을 몇글자 적어보자면,
힘들었지만 그래도 장점이라면, 검은 바탕의 힌 글씨를 보고있노라면 예전부터 대중매체에서 익숙하게 봐왔던 해커가 된 것 마냥 컴퓨터를 뭔가 전문적(?)으로 이용하고 있다는 느낌을 준다는 것이고 환경을 하나씩 갖추어가며 검은바탕에서 코드를 끄적이는 기분이 어렵고 힘들면서도 이상하게 괜찮다.
단점이라면, 그것을 제외한 모든것인 것 같지만 마냥 싫은 느낌은 또 아니다. 그동안 컴퓨터를 사용하면서 GUI(Graphic User Interface)에 익숙해져있던 나는 마우스로 더블클릭하면 간단히 해결되는 폴더 열어보기 등 모든 과정을 명령어를 입력해야하는 환경에 놓여졌다. 검은화면을 보면서 어찌해야할지 몰라 방황하는 시간이 많아졌고 명령어를 찾기위해 검색을 하는 시간도 훨씬 잦아졌다. 개발환경을 세팅하면서 밤을 지새운 것은 덤이다. 하지만 이런 과정이 나를 담금질하는 과정이라고 생각하니 힘들어도 이겨내야겠다는 마음을 먹게 되더라. 굳세어지자.