ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3. (1) 파이썬 자료형 문자열
    파이썬(Python) 강의 2019. 2. 4. 14:03

     지난 포스트에서 자료형이 무엇인지, 파이썬 자료형 중 숫자에는 무엇이 있었는지 알아보았다. 기억이 안난다면 2.파이썬 자료형 숫자를 참고하도록 하자. 이번 포스트를 통해서는 파이썬의 첫번째 시퀀스인 문자열을 알아보도록 하겠다.

    들어가기전에

    이 포스트는 여러분이 파이썬을 설치했고 각자 원하는 IDE를 이용해 파이썬을 개발한다고 가정한다. 대화형(Interactive) 터미널을 사용해도 상관 없다. 혹시 파이썬을 설치하지 않았다면  1.파이썬 설치 및 개발환경 설정 이 포스트에서 파이썬과 파이썬 개발환경을 먼저 셋업하길 바란다. 앞서 말했듯이 반드시 실습 해 보길 바라고 30분 이상 소요하지 말라.

    • 숫자(Numbers) : 12, 24.3, 3+2j, .. (2.파이썬 자료형 숫자)

    • 문자(Strings) : "hello, "world" <- 이 포스트에서 다루는 자료형

    • 리스트(Lists) : [1, 3, [3, 'hey'], 4]

    • 딕셔너리(Dictionaries) : { 'name': 'fsoftwareengineer', 'age' : 17}

    • 튜플(Tuples) : (1, 'a', 4, 'c')

    • 파일(Files) : f = open('filename', 'r')

    • 셋(Sets) (집합) : { 1, 4, 5 }

    • 다른 타입들 : Boolean (True/Faluse), types, None, etc

    • 프로그래밍 유닛 타입(Programming unit types) : 함수(Functions), 모듈(Modules), 클래스(Classes)

    • 구현 레벨 타입(Implementational-level types) : 예외(Exception) 등등..

    목표

    • 문자열 (String) 표현법
    • 이스케이프 시퀀스 (Escape Sequences) - 특별한 문자들을 사용하는 법
    • 문자열의 시퀀스 오퍼레이션 (String Sequence Operations)
    • 불변성 (Immutability)
    예상 소요시간 (30분 이내)

    문자열(String) 표현법

     파이썬 문자열을 표현하는 방법은 아주 간단하다. 따옴표나 쌍따옴표를 이용하면 된다. 생각해봐라,  1.파이썬 설치 및 개발환경 설정 이 포스트에서 이미 문자열 'hello world!'를 사용했었다. 쌍 따옴표를 이용해 다음과 같은 문장을 쳐보자.

    print("Today we're going to learn Python String!") Today we're going to learn Python String!

    이제 따옴표로 된 문장을 실행해보자.

    print('learn Python String!') learn Python String!

    위와 같이 파이썬 문자열은 쌍따옴표 또는 따옴표를 이용해 표현 할 수 있다. 내용이 빈 문자열을 원한다면 ''이나 ""를 사용하면 된다.

    이스케이프 시퀀스 (Escape Sequences) - 특별한 문자들을 사용하는 법

    자 이제 처음에 시도했던 "Today we're going to learn Python String!"을 따옴표로 바꿔서 출력 해 보자.

    print('Today we're going to learn Python String!') print('Today we're going to learn Python String!') ^ SyntaxError: invalid syntax

    에러가 나지 않았는가? 이유는 여러분이 따옴표로 문자열을 감쌌을 때는 내부에 다른 따옴표를 쓸 수 없기 때문이다. 따옴표 두 개가 한쌍인데 중간에 하나가 더 들어가면 따옴표가 세 개가 되지 않는가? 그러면 나머지 하나는 짝이 없어서 에러가 나는 것이다. 근데 여러분은 중간의 따옴표를 문자열을 감싸기 위해 쓴 것이 아닌데 어쩌란 말이가? 이런 상황에서 바로 이스케이프 시퀀스를 사용한다. 이스케이프 시퀀스랑 이미 예약되어있는 문자들 따옴표, 쌍따옴표, $ 등등을 "문자그대로" 사용하라고 인터프리터에게 알려주는 것이다. 그 이스케이프 시퀀스는 바로 '\' 백슬래쉬이다. 아래를 실행 해 보자.

    print('Today we\'re going to learn Python String!') Today we're going to learn Python String!

    즉 앞에 \를 써 줌으로서 인터프리터에게, "야, 지금부터 나오는 문자는 프로그래밍 언어가 아니니까 프로그래밍 언어로 해석하지마."라고 알려주는 것이다.

    print("How do you use \"double quotes\" in double quotes?") How do you use "double quotes" in double quotes?

    마찬가지로 쌍따옴표의 상황에서도 백슬래시를 붙여 "이건 프로그래밍 언어가 아니야!" 하고 알려주면 된다.

    print("How do you use \
    new line in double quotes?") How do you use new line in double quotes?

    백슬래쉬를 쓰고 엔터를 눌러보자. 결과적으로 엔터가 반영되지 않았다. 이런건 쓰잘데기 없어 보이지만 여러분이 출력하고자 하는 스트링의 길이가 길어서 한 화면에 차지 않을 경우 유용하다. 이 세가지 이스케이프 문자 외에도 여러가지 \t, \n과 같은 문자들이 많으므로 나중에 필요할 때 찾아보길 바란다.


    두 개의 문자열을 이어 붙일 때는 다음과 같이 한다.

    print("hello" + " world?") hello world?

    문자열의 시퀀스 오퍼레이션 (String Sequence Operations)

    맨 처음 소개글에서 문자열이 파이썬의 첫번째 시퀀스라고 했다. 그렇다면 시퀀스란 무엇인가? 시퀀스는 말그대로 왼쪽에서 오른쪽으로 나열된 것을 의미한다. 문자열도 "가나다라", "가" 에서 "라"로 문자들이 나열되어있으니 시퀀스이다. 시퀀스는

    • 길이가 있다.
    • 시퀀스 내부의 아이템을 인덱스를 이용해 접근 할 수 있다. 

    길이가 있다는건 이해하기 쉽다. 

    print(len("sequence")) 8

    len이라는 함수를 통해 "sequence"의 길이를 출력 해 보았다. 그렇다면 '시퀀스 내부의 아이템을 인덱스를 이용해 접근 할 수 있다.' 이건 무슨뜻일까? 

    여러분이 "sequence"라는 문자열을 출력 할때, 메모리에는 "sequence"를 저장하기 위한 공간이 저렇게 문자마다 따로 따로 마련된다. 그리고 그 저장 공간은 위처럼 생겼다. 우리가 문자열을 시퀀스라고 부르는 이유는 문자열 내의 각각의 문자를 인덱스(0~7)를 이용해 접근 할 수 있기 때문이다.

    s = "sequence"
    print(s) sequence

    이를 확인하기 위해 s라는 변수를 선언했다. 아니, 변수라니? 변수는 또 무엇인가?

    별거 아니니 당황하지 말아라. 말 그대로  s자체가 "sequence"를 의미한다는 말이다. 계속 "sequence"를 반복해서 쓰기 귀찮으니 "sequence"를 "s"라고 부르기로 하고 앞으로는 s를 쓰자, 이 정도로 받아들이면 되겠다. 그렇다면 위에서 의미한 인덱스로의 접근은 어떻게 하는가?

    s = "sequence"
    print(s[0]) print(s[3])

    s u

    이렇게 하면 된다. 간단하다. 나는 아직 변수가 너무 어려워서 무슨말인지 모르겠다 싶으면 다음을 실행해봐라.

    print("sequence"[0])
    print
    ("sequence"[3]) s u

    결과는 똑같을 것이다. 대괄호와 숫자가 의미하는 바는 이미 눈치 챘을 거라 생각한다. 예를들어 [3]을 해석해보면 바로 앞에있는 시퀀스의 3번째 인덱스에 존재하는 문자를 복사하라는 뜻이다.

    이번엔 이런 구문을 실행 해 보자.

    s = "sequence"
    print(s[-1]) e

    이게 무슨 일인가? -1 이란 인덱스는 없었는데 갑자기 왜 e가 출력될까? 당황하지 말자. 자바나 C였다면 분명 IndexOutOfBoundary 예외가 발생 할 것이다. 하지만 파이썬에서 -1은 거꾸로 돌아가는 것이다!

    s[-1]은 s[len(s) - 1]와 같다. len(s)는 몇인가? 8이었다. 8-1 = 7이다 결국 s[7]을 복사 해 오라는 뜻이다. 시퀀스 표현법을 더 알아보기 위해 아래를 실행 해 보자.

    s = "sequence"
    print(s[1:3]) eq

    위의 s[1:3]은 이런 뜻이다. s안에 들어있는 문자들 중에 인덱스가 1 보다 크거나 같고 3보다는 작은 문자들을 복사해줘.라는 뜻이다. 왜 자꾸 "복사"라는 말을 쓰냐하면 여러분이 [:]시퀀스 오퍼레이션을 사용 할 때 s안의 문자들은 절대 변경되지 않고, 파이썬이 새 메모리 공간을 만들어 여러분이 실행한 시퀀스 오퍼레션의 값을 복사해 넣기 때문이다. 따라서 시퀀스 오퍼레이션은 여러분의 문자를 자르거나, 변경하지 않는다. 

    아무튼 결론은 인덱스의 범위값을 기준으로 문자열을 잘라 올 수 있다는 것이며, [최소포함인덱스:최대인덱스]로 표현 가능하다.


     숙제가 있다. 여러분은 다음과 같은 구문을 실행 해보고 결과 값이 어떻게 되는지 알아보아라. 그리고 각 오퍼레이션이 어떤 일을 하는지 생각 해보아라.

    1. 시퀀스 오퍼레이션

    s = "sequence"

    print(s[:])
    print(s[:-1])

    2. 문자열 더하기(String Concatnation)

    s = "sequence"
    k = "hello " + s[1:3]
    print(k) print(s) # s의 값이 변했는가?

    불변성 (Immutability)

    불변성(Immutability)란 여러분이 문자열 내의 문자 하나 하나를 수정 할 수 없음을 의미한다. 다음과 같은 구문을 실행 해 보자.

    s = "sequence"
    s[3] = "a"

    실행시 아래와 같은 에러가 나는 것을 알 수 있다. 이는 문자열 타입인 s의 3번째 문자에 무언가를 다시 할당 할 수 없다는 뜻이다. 이와같이 여러분이 어떤 오브젝트(시퀀스, 문자, 숫자 등등을 오브젝트라고 부른다)의 내부를 변경 할 수 없을 때, 해당 오브젝트(Object)가 "Immutable"하다고 부른다.

    s[3] = "a"
    TypeError: 'str' object does not support item assignment

    이외에도 문자열에 관해서는 Immutability나 여러가지 함수들 replace, split, is alpha등등이 있는데 그 내용들은 다음 포스트에서 설명하도록 하겠다. 



    댓글

f.software engineer @ All Right Reserved