데이터란 변수에 넣을 값을 말하는데요.. 프로그래밍이란 결국 데이터를 이렇게 저렇게 요리하고 여기로 옮겼다 저기로 옮겼다 하는 거라고 보면 되지 않을까요? 그래서 데이터는 참 중요합니다.
이런 데이터가 가지는 여러 형식들을 자료형이라고 합니다. 예를들면 'a'는 문자열, 17은 숫자, [1,2,3]은 리스트, {'나':'천재'}는 사전형 등등.. 이외에도 많은 자료형들이 기본적으로 제공되고 있습니다.
왜 이렇게 많은 자료형들이 있어야 할까요? 인간이 입으로 잘할수 있는게 있고 손으로 잘할수 있는게 있듯이 컴퓨터도 어떤 일을 할 때 어떤 자료형이 다른 자료형들보다 더 잘 맞기 때문입니다.
물론 어떤 자료형을 쓸지는 그 코드를 짜는 사람의 선택입니다. 같은 일도 누군가는 리스트가 더 맞는 자료형이라고, 누군가는 문자열이 더 맞는 자료형이라고 생각할수 있습니다.하지만 계산기를 만드는데 문자열을 가지고 만들수는 없겠죠?
정작 딱 맞는 자료형을 찾을수 없다면 만들어 내는것도 가능합니다. 데이터란 결국 어떤 형태의 값이고, 그 값을 처리하는 방법만 만들어주면 됩니다. 항상 세개의 값을 가지는 리스트를 만들고, 그 세개의 값을 각각 더하거나 곱할수 있도록 만들어 놓는다면 이는 벡터데이터가 되겠죠.
처음에는 기본자료형을 가지고 놀아보세요.. 처음부터 편집기를 사용하기보다는 idle같은 인터랙티브 셸에서 해보는게 조금 더 편하게 접근하실수 있을거에요.
여러가지 데이터형에는 저마다 그 데이터를 처리할수 있는 함수들이 제공됩니다. 그렇다면 그 함수들은 어떻게 볼수 있을까요?
예로 파이썬쉘에서 a = 'hi' 라고 선언을 하고나서, 이 a를 가지고 할수 있는 일이 어떤게 있을까요?
한번 dir(a) 라고 쳐보세요.
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
이것들 전부가 문자열 관련 함수입니다. 언더바로 시작하는 녀석들은 좀 독특한 녀석들이지만.. 그 외에 capitalize부터 center... zfill까지는 직접사용할수 있는 함수들인데요. 함수이름만 봐도 바로 어떤건지 알수 있는 녀석들도 있지만 당최 이름만 봐선 모를 녀석들도 있네요. 예를 들면... zfill 같은건 뭐하는 함수일까요?
그럴때 쓸수 있는게 help()입니다. 한번 help(a.zfill)이라고 쳐보세요
zfill(...) S.zfill(width) -> string
Pad a numeric string S with zeros on the left, to fill a field of the specified width. The string S is never truncated.
이런 문장이 나오네요. 잘 모르겠지만 왼쪽에 0을 채워준다는 거 같네요. 그럼 실제로 한번 쳐볼까요.
a.zfill(5)
'000hi'
a.zfill(3)
'0hi'
흠 문자열개수를 제외하고 나머지를 0으로 채워주네요. 그럼 이렇게 해보면 어떻게 될까요?
a.zfill(0)
'hi'
원래 문자열은 잘리진 않는군요. 좋아요~
써보니까 왠지 이거가지곤 프레임 패딩만들면 좋을것 같네요. 다른 것들도 한번 테스트 해보세요~
물론 dir()이나 help()를 쓰지 않아도 하위 함수들을 띄워주는 편집환경, 에디터, 쉘 등은 있습니다. 하지만 만약 그런 환경이 되어있지 않다면 이 두가지 함수가 도움이 될것같네요.
파이썬이 기존 3D나 2D툴의 내장 스크립트 언어들을 제치고 공통으로 사용되는 이유는 뭘까요? 다른 이유도 있겠지만 저는 아마 파이썬의 문자열 처리가 내장 스크립트들보다 훨씬 강력하기 때문이 아닐까 생각합니다.
그럼 문자열을 어떻게 처리한다는 걸까요? 우선
a = '나는문자열이다'
a는 문자열이군요. 근데 정말 문자열일까요?
type(a) 라고 해보죠.
이렇게들 나오셨나요? 타입 스트링, 스트링은 문자열, 역시 문자열이 맞군요.
b = '나는문자열이아니다'
type(b)
존재를 부정해도 문자열은 문자열인거죠. 그럼 이 문자열을 가지고 뭘 할수 있을까요?
dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', .........많음.....]
맨 첫번째에 '__add__' 가 보이네요.
add 앞 뒤로 언더바두개가 붙어있는게 보이시죠? 이녀석들은 전에 설명했던 다른 애들과는 달리 a.__add__(b) 이렇게 쓰지 않고 특별한 사용법이 있다는거에요. 문자열 처리함수중 '__add__'가 있다는건, 바로 문자열을 더할수 있다는 뜻이랍니다. 한번 해볼까요?
a+a
'\xec\x96\xb4\xeb\xa5\xb8\xec\x96\xb4\xeb\xa5\xb8'
꽥 이건머죠? ㅠㅠ 다시해볼게요.
print(a+a)
나는문자열이다나는문자열이다
휴.. 제대로 나오는군요. 첫번째 결과물은 파이썬이 한글을 저장해놓은 방식이랍니다. 우리 화면 뒤로 보이는 검은세계죠. 언젠가는 탐험해봐야겠지만! 아직 저흰 어리고 연약하군요. ㅠ
여튼 print의 도움을 받아 한글을 제대로 표현할수 있습니다. 예이!
그럼 이런것도 해볼까요?
print(a*2) print(a+b) print(a+b*2) print(2*(a+b))
흠 문자열이 숫자도 아닌데 더하기와 곱하기가 잘도 먹는군요. 그렇다면? print(a-b)
Traceback (most recent call last): File "", line 1, in TypeError: unsupported operand type(s) for -: 'str' and 'str'
아... 빼기는 안먹는군요 ㅠㅠㅠ
여튼 이렇게 문자열은 더하기와 곱하기를 지원합니다. 근데 더하기는 add가 있어서 된다는건 아셨죠? 그럼 곱하기는 뭐가 있어서 되는걸까요? 한번 생각해보세요~ 그리고 언더바로 시작하는 함수들을 보고 뭘하는 애들일지도 추측해보시구요~ 모르시겠으면 너무 고민하지 마세요. 저도 다 모르니까요. ㅎㅎ