참고 자료
https://www.py4e.com/lessons/servces
찰스 세브란스. 『데이터를 다루며 배우는 파이썬』. 인사이트, 2019.
프로그램 코드가 길어질수록 이해하기 쉽게 코드를 쓰는 것이 더욱 중요합니다.
객체 지향 프로그래밍이란 백 만 줄짜리 코드에서 500줄의 코드만 집중해서 볼 수 있도록 하며, 그 순간에는 나머지 999,500줄의 코드는 무시해도 이해할 수 있도록 코드를 조정하는 방법입니다.
객체 지향 프로그래밍의 한 가지 방법은 프로그램을 여러 개의 '구역(zone)'으로 나누는 것입니다.
뷰티풀수프 라이브러리를 사용해 웹 페이지의 링크를 추출했습니다. 코드를 보면 다른 객체를 연결해 작업을 처리하는 것을 알 수 있습니다.
# 먼저, BeautifulSoup 설치가 필요합니다.
# https://pypi.python.org/pypi/beautifulsoup4
# 또는, 아래 파일을 내려받고,
# http://www.py4e.com/code3/bs4.zip
# 예제 코드와 같은 디렉터리에 압축을 풉니다.
import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup
import ssl
# SSL 인증서 오류는 무시합니다.
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
url = input('Enter - ')
html = urllib.request.urlopen(url, context=ctx).read()
soup = BeautifulSoup(html, 'html.parser')
# 모든 a 태그를 가져옵니다.
tags = soup('a')
for tag in tags:
print(tag.get('href', None))
# Code: https://www.py4e.com/code3/urllinks.py
코드에서는 url을 읽고 문자열에 넣은 다음, urllib에 전달해서 웹에서 데이터를 가져옵니다. urllib는 데이터를 가져오기 위한, 네트워크 연결을 맺기 위해 socket 라이브러리를 사용합니다. urllib로 가져온 문자열을 BeautifulSoup를 이용해 파싱합니다. BeautifulSoup는 또 다른 객체인 html.parser를 써서 객체를 반환합니다. 반환된 객체의 tag() 메서드를 호출해서 태그 객체의 딕셔너리를 얻은 다음, 루프를 돌면서 각 태그의 get() 메서드를 호출해 'href'속성을 출력합니다.
여기서 중요한 점은 프로그램이 어떻게 작동하는지 완전히 이해하는 것이 아니라, 객체들 간의 상호작용과 정보의 흐름을 어떻게 구성하고 조정해서 프로그램을 만들었는지 보는 것입니다.
객체 지향 접근법의 장점 중 하나는 복잡성을 숨길 수 있다는 것입니다.
예를 들어 urllib나 뷰티풀수프의 사용법은 알아야 하지만, 이 라이브러리들이 내부적으로 어떻게 동작하는지는 알 필요가 없습니다. 즉, 프로그램의 다른 부분은 무시한 채로, 오로지 해결해야 할 문제에만 집중할 수 있게 해줍니다.
'캡슐화(encapsulation)'는 이와 같이 객체 내부의 상세 구현에 관해서는 몰라도 좋다는 것을 나타낼 때 사용하는 용어입니다. 즉, 객체 내부가 어떻게 작동해서 작업을 처리하는지 자세히 알지 못하더라도, 그 객체를 사용할 수 있다는 것을 의미합니다.