codestates / codestates/ds-blog
[윤형준] 파이썬 라이브러리 / 패키지 / 모듈 / 클래스 / 어트리뷰트 / 메서드 총정리!
- Dominant language
- No language data
- Stars
- 2
- Forks
- 4
- PR merge metrics
- No merged PRs in 30d
Description

*Photo by Kelly Sikkema on Unsplash*
파이썬을 공부하며 라이브러리, 패키지, 모듈, 클래스 등의 단어들을 여러번 들어본 경험이 있을것이다. 정확하게 각각의 단어의 뜻은 모르지만 뜻을 몰라도 데이터를 만지는데에는 크게 영향을 주지 않기때문에 애써 무시한 경험들이 있을 것이다. 하지만 프로그래밍과 데이터 사이언스를 더욱 깊숙히 공부하길 원한다면 피해갈수 없는 주제들 이기에 이번기회에 다뤄보기로 하겠다.
## Introduction
여태까지 나는 Jupyter Notebook이나 Google Colab에서 여러가지 기능들 (지금은 기능이라 지칭하겠다) 을 **import**해서 사용해왔다. 내가 여기서 말하는 기능들이란 예를 들어 ```DecisionTreeClassifier()``` 와 같은 것이다. ```DecisionTreeClassifier()```를 ```import``` 해서 가져오면 이것을 가지고 ```.fit()``` 과 같은 기능을 ```DecisionTreeClassifier()``` 옆에 붙이고 데이터를 넣어서 학습시키는 것이다.
```py
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
```
```DecisionTreeClassifier()```가 무슨 기능을 하고 어떻게 사용하는지에만 집중했었지, 이것이 어디서 어떻게 불려오는 것이고, 내부적으로 코드가 어떻게 구성되어있는지 잘 몰랐었다. 이번기회에 ```DecisionTreeClassifier()```를 예시로 집중적으로 보면서 구성을 살펴보자.
파이썬으로 데이터를 조금 만져본 경험이 있다면, ```numpy, pandas, matplotlib```등 을 사용해본적이 있을것이다. 이러한 것들을 나는 패키지?, 라이브러리? 또는 모듈? 이라고 혼용적으로 지칭하였으며 정확히 구별짓지 못하였다. 우선 라이브러리, 패키지, 그리고 모듈이란것들이 있다고 한다. 무엇인지 알아보자.
## Body
## Inside of a Library
### Module / Package / Library
#### Module (모듈)
> 모듈이란 ```.py``` 파일을 지칭하는 것이다. 우리가 사용하는 여러가지 기능, 예를들어 ```numpy, pandas``` 같은 기능들은 python code로 이루어져 있다. 이러한 파이썬 코드를 우리가 작성한다고 예를 들면 이 코드들을 파이썬 파일로 저장을 해야될 것이고, 파이썬 파일로 저장하면 ```.py```로 저장된다. 간단히 말하자면 모듈은 파이썬 파일인 것이다. 이 모듈안에 여러 파이썬 코드가 있을것이다.
#### Package (패키지)
> 패키지란 여러 모듈을 모아놓은 하나의 directory (또는 폴더) 라고 이해하도 무방할것 같다. 우리가 컴퓨터를 사용할때 여러가지 워드 파일이 있을테고 엑셀 파일이 있을것이다. 또한 사진파일들도 있을것이다. 이렇게 여러가지 파일들이 중구난방으로 배경화면에 위치해있다면 우리가 원하는 파일을 찾기도 힘들고 관리하기도 힘들것이다. 따라서 우리는 폴더를 생성하여 파일종류별로 구별해서 각각의 종류를 폴더에 넣어 관리할 것이다. (예시: 사진폴더, 엑셀파일폴더, 워드파일폴더).
> 패키지란 우선 개념적으로는 폴더와 같은것이다. 하지만 여기서 하나 짚고 넘어가고 싶은것은 패키지를 구별하는 법은 폴더안에 ```__init__.py``` 파일이 있다면 그 폴더는 패키지로 보면 된다. 지금 이 내용은 크게 집중하지 않겠다. 여기서 이것을 정의만하고 밑에서 좀 더 세부적으로 무슨뜻인지 다루겠다.
#### Library (라이브러리)
> 패키지가 모듈을 담는 폴더라면, 라이브러리는 패키지들을 담는 폴더라고 생각할수 있다. (물론 테크니컬할게 아주 정확한 표현은 아니지만 이렇게만 이해를 해두자). 앞서서 ```DecisionTreeClassifier()```로 예를 들었다. ```DecisionTreeClassifier()```는 **scikit-learn**이란 라이브러리로 부터 가져오는것이다. 처음에 파이썬을 깔고 처음 데이터를 만져볼때 나는 커맨드 라인에 ```pip install scikit-learn```이라고 뭣도 모른체 그냥 그렇게 해야된다고 해서 했었던 경험이 있다. 이 커맨드를 입력하면 뭐가 컴퓨터에 설치가 되고 그 후부터 ***Jupyter notebook***에서 ```sklearn```을 ```import```해서 사용할수 있었다. 여기서 우리가 ```pip install```로 설치하는것들이 라이브러리다. 우리가 라이브러리를 설치하는 이유는 컴퓨터에 라이브러리가 내장되어있지 않기 때문이다. (아마도 용량 문제때문에 내장이 안되있는것 같다.) 우리는 필요에 따라 필요한 라이브러리만 설치해서 사용할수 있겠다.
###### 지금까지 모듈, 패키지, 라이브러리, 이렇게 작은단위로부터 큰단위로 각각을 알아보았다. 이제는 다시 모듈로 돌아가 모듈안에 존재하는것들을 알아보겠다.
## Inside of a Module
### Class / Attribute / Method
#### Class (클래스)
> 앞서 ```.py``` 파일을 파이썬 파일이라고 하였다. 파이썬을 공부해보면 ```Class```에 대한 개념을 배운다. (여기서 파이썬 ```Class```를 어떻게 작성하고 구현하는지 자세히 다루진 않겠다.)
```py
class Product:
def __init__(self, name, price, size):
self.name = name
self.price = price
self.size = size
```
> 위 파이썬 코드에 ```Product```라는 ```class```를 작성해보았다. 여기서 self라고 하는 것은 ```Product``` 클래스를 가리키는 것이다. 지금당장은 직관적으로 이해가 안갈수있지만, 그 상태로 조금더 나아가 보자.
#### Side Note_1: Instance (인스턴스)
> 여기서 인스턴스라는 주제를 조금 다루겠다.
```py
prod = Product()
```
> 위 코드는 ```Product```라는 클래스를 가지고 인스턴스를 만든 것이다. 인스턴스를 만드는 이유는 편의성 또는 클래스를 우리의 입맛에 맞게 변형시키기 위해서 만드는 것이다. ```Product``` 클래스를 이용하여 여러가지 인스턴스를 만들어보겠다.
```py
prod_1 = Product(name = "Americano", price = 20, size =30)
prod_2 = Product(name = "Latte", price =30, size =50)
prod_3 = Product(name = "Lemmonade", price = 10, size = 20)
```
> 이렇게 ```prod_1```, ```prod_2```, 그리고 ```prod_3```라는 세가지 다른 인스턴스를 생성하였다. ```name```, ```price```, 그리고 ```size```란 argument를 다 다르게 지정함으로써 ```Product``` 라는 한가지 클래스를 가지고 특성이 다른 인스턴스들을 만든것이다.
#### Attribute (특성)
> 특성? 위에서 갑자기 특성을 이야기 하였다. 여기서 특성이란 ```name, price, size```를 가리키는 것이다. ```prod_3```를 예로 보자.
```py
prod_3 = Product(name = "Lemmonade", price = 10, size = 20)
```
> ```prod_3``` 라는 인스턴스를 생성할때 ```name, price, size``` 라는 3가지 argument에 ```"Lemmonade", 10, 20``` 이라고 각각 지정하였다.
```py
name = "Lemmonade"
price = 10
size =20
```
> 위에서 작성했던 ```Product``` 클래스의 코드를 다시 가져와보겠다.
```py
class Product:
def __init__(self, name, price, size):
self.name = name
self.price = price
self.size = size
```
> ```self.name = name``` 이라고 되어있는데, 우리는 앞서 ```name```이란 argument를 ```"Lemmonade"```라고 ```prod_3```라는 인스턴스에 지정하였다. 그 뜻은 ```self.name``` 이 이제 ```"Lemmonade"```가 되는 것이다. 마찬가지로 ```self.price```는 ```10```, 그리고 ```self.size```는 ```20```이 되는 것이다. 확인해보자!
```py
# prod_3 라는 instance를 만든다.
prod_3 = Product(name = "Lemmonade", price = 10, size = 20)
# prod_3 의 name이란 특성은 무엇일까?
prod_3.name
```
> ```prod_3.name```이라는 코드를 실행하면 output은 ```"Lemmonade"```이라고 나온다. 마찬가지로 ```prod_3.price```는 10, ```prod_3.size```는 20으로 나온다. 우리가 만든 인스턴스의 특성들을 이렇게 확인해볼수 있다.
#### Side Note_2: 클래스에서 특성들에 default값들을 만들어줄수 있을까?
> "특성들에 default값들을 만들어줄수 있을까?" 라는 질문이 무슨말인가?
```py
class Product:
def __init__(self, name, price, size):
self.name = name
self.price = price
self.size = size
prod_4 = Product()
```
> ```prod_4```라는 인스터스을 만들었는데, 여기에는 특성들을 지정해주지 않았다. 맨위에서도 ```prod = Product()```라고 인스턴스를 설명하기위해 예를 들었었다. 하지만 사실 이렇게 코드를 입력할 경우 이런 오류가 난다.
```
TypeError: __init__() missing 3 required positional arguments: 'name', 'price' and 'size'
```
> 왜 이런 오류가 나는 것일까? 기존에 Product라는 클래스를 만들때 각 특성의 default 값을 지정해주지 않았기 때문에, 인스턴스를 만들때 ```name, price, size```라는 argument를 각각 어떠한 값들로 지정해 줌으로써 ```Product``` 클래스의 특성들을 지정해 줘야한다.
> 그렇다면 내가 처음 질문한 "특성들에 default값들을 만들어줄수 있을까?" 에 대한 답을 해보겠다. 간단하다. ```def __init__()```에 다음과 같이 우리가 원하는 default값들을 설정해주면 된다.
```py
class Product:
def __init__(self, name = "Americano", price = 20, size = 30):
self.name = name
self.price = price
self.size = size
prod_4 = Product()
```
> 이렇게 ```Product```라는 클래스를 만들어주고, ```prod_4```라는 인스턴스를 아무런 argument없이 만들면, ```prod_4```의 특성들이 default값들로 만들어진다. 여기서 우리가 default값들을 원하지 않고 우리가 다른 특성 값들을 원한다면, ```prod_4 = Product(name = "Tea", price = 50, size = 10)``` 와 같이 우리의 입맛에 맞게 지정할수 있겠다.
#### Method (메서드)
```py
class Product:
def __init__(self, name, price=30, size=20):
self.name = name
self.price = price
self.size = size
# 메서드
def sellability(self):
size_per_dollar = self.size / self.price
```
> 위 코드는 ```Product``` 클래스에 ```sellability```라는 메서드를 생성하였다. 메서드는 클래스 안에 여러가지 우리가 원하는 만큼 생성할수 있으며 우리가 흔히 사용하는 함수가 클래스안에 내재되어있는 것으로 생각하면 된다. 여기서는 예시로 하나만 만들었다. 메서드를 실행하는 방법은 다음과 같다.
```py
prod_5 = Product(name = "Milk Tea", price = 20, size = 10)
prod_5.sellability()
```
> 이와 같이 코드를 실행하면 output이 ```1/2```가 나올것이다.
## Conclusion
DecisionTreeClassifier() 라는 기능에 대해 이야기 하기 위해 먼길을 돌아왔다. DecisionTreeClassifier()를 우리는 보통
```py
from sklearn.tree import DecisionTreeClassifier
```
이렇게 불러온다. ```sklearn``` API로 가서 하나씩 뜯어보자.
sklearn API: https://github.com/scikit-learn/scikit-learn
#### scikit-learn (라이브러리)

> 해당 API로 가보면 이렇게 위 사진처럼 파일들이 구성되어있다. 현재 우리는 scikit-learn이라는 페이지에 있는데, scikit-learn은 무엇일까? scikit-learn은 우리가 앞서 배웠듯이 라이브러리다. 위 그림에서 볼수 있듯이 여러가지 패키지들이 이 라이브러리 안에있는 것을 볼수 있다. 여기서 많은 패키지들 중에서 ```sklearn```이라는 패키지로 가보자!
#### sklearn (패키지)

> sklearn이란 폴더로 가보면 ```__init__.py```라는 파일을 볼수 있다. 앞서 정의했듯이 ```__init__.py```가 있다는 것은 해당 폴더가 패키지라는 뜻이다. 따라서 우리는 sklearn이 scikit-learn 라이브러리 안에있는 패키지라는 것을 알수 있다. 이번엔 tree라는 폴더로 들어가 보겠다.
#### tree (패키지)

> tree라는 폴더 안에 들어가보면 여기에도 ```__init__.py```가 있다는 것을 확인할수 있다. 그렇다, tree도 패키지다. sklearn이란 패키지안에 tree라는 패키지가 또 있는 것이다. 이번엔 ```_classes.py```라는 모듈안으로 들어가 보겠다.
#### _classes.py (모듈)
> _classes.py 모듈안으로 들어가보면 파이썬 코드가 길게 적혀져있다. 여기서 아래로 내려가다보면 DecisionTreeClassifier()가 class로 선언되어있다.

> 우리가 DecisionTreeClassifier를 ```import```하는것은 다음과 같은 뜻이다. ```pip install scikit-learn``` 을 통해 ```scikit-learn```이란 라이브러리가 설치된 상태에서 Jupyter notebook에 다음과 같은 코드를 실행한다.
```py
from sklearn.tree import DecisionTreeClassifier
```
> ```from sklearn.tree```는 ```sklearn``` 패키지를 통해 ```tree``` 패키지로 들어가 ```import DecisionTreeClassifier```를 실행하는 것이다. 즉, ```DecisionTreeClassifier```라는 클래스를 불러오는 것이다.
***여기까지 라이브러리 / 패키지 / 모듈의 구성을 알아보았으며 추가적으로 모듈안에 클래스 / 어트리뷰트 / 메서드가 어떻게 이루어져 있는지도 보았다. 이 배운 내용을 가지고 데이터 사이언스에 흔히 쓰이는 DecisionTreeClassifer 클래스를 예시로 뜯어보았다. 데이터 사이언스를 공부하는 사람들에게 이 내용이 도움이 되길 바래본다.***
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.