[파이썬 튜토리얼] 문자열 타입

PlanB·2022년 9월 27일
3

파이썬 튜토리얼

목록 보기
12/21

Level 1

첫 단원에 등장했던 print('Hello, world!')에서, 'Hello, world!'는 문자열이다. 파이썬에서는 따옴표로 감싸진 대상을 문자열 타입의 값으로 해석한다.

print('hello')
print("world")

결과

hello
world

여기서 'hello', "world"와 같이 따옴표가 감싸져 있는 것은, 문자열 타입의 값으로 해석된다. 따옴표를 떼면 에러가 발생하는 것을 볼 수 있다.

print(hello)
print(world)

결과

Traceback (most recent call last):
  File "example.py", line 1, in <module>
    print(hello)
NameError: name 'hello' is not defined

helloworld라는 이름의 변수를 사용하는 것으로 해석되어 그렇다. 이처럼, 따옴표는 그 안의 내용이 문자열로 해석될 수 있도록 한다.

이번 단원의 첫 예제를 보면, 'hello'"world"와 같이 두 종료의 따옴표(작은따옴표와 큰따옴표)를 사용한 것을 볼 수 있다. 파이썬은 따옴표로 감싸져 있는 것이 있으면, 그 종류에 상관 없이 대상을 문자열로 해석한다. 단, 문자열의 시작에 사용된 따옴표와 동일한 따옴표만이 문자열의 종료를 의미할 수 있다. 예를 들어, 큰따옴표로 감싸진 문자열 안의 작은따옴표는 단순히 문자열의 내용으로 해석된다.

print("hello'")

결과

hello'

실행 결과를 보면 알 수 있듯, 큰따옴표로 감싼 문자열 내의 작은따옴표는 문자열의 내용이 되었다. 이러한 특징을 통해, 문자열에 큰따옴표가 들어가는 경우 작은따옴표로 감싸고, 작은따옴표가 들어가는 경우 큰따옴표로 감싸곤 한다.

print("Let's go")
print('He said "yes"')

결과

Let's go
He said "yes"

개행(줄 바꿈)

키보드의 엔터(Enter) 키를 눌러 표현할 수 있는 개행(줄 바꿈)을 문자열에 표현해 보자. 먼저 다음의 방법은 에러가 발생한다.

print('hello
world')

결과

  File "example.py", line 1
    print('hello
               ^
SyntaxError: EOL while scanning string literal

파이썬에서는 \n을 개행으로 해석한다. \n이 포함된 문자열은, print에 사용될 때와 같이 표현이 필요한 순간에 줄 바꿈의 효과를 준다.

a = 'hello\nworld'

print(a)

결과

hello
world

따옴표 3개를 사용해 문자열 표현

연속된 3개의 따옴표를 감싸는 것으로 문자열을 표현할 수도 있다. triple-quoted string이라고 부른다. 이렇게 명시된 문자열에서는, 그 내용에 들어간 개행을 모두 \n으로 해석한다.

a = '''
hello
world
'''

b = """
hi
world
"""

print(a)
print(b)

결과


hello
world


hi
world

연습문제

결과 예상하기 1

다음 코드의 실행 결과를 예상해보자.

print('abc')

결과 예상하기 2

다음 코드의 실행 결과를 예상해보자.

print('')

결과 예상하기 3

다음 코드의 실행 결과를 예상해보자.

print('""')

결과 예상하기 4

다음 코드의 실행 결과를 예상해보자.

print('''
hello\n
world''')

Level 2

연속된 문자열 리터럴

연속된 문자열 리터럴은 합쳐진다.

print('hello'' world'"!")

결과

hello world!

문자열의 행간 결합

연속된 문자열 리터럴은 다음 줄에 있는 것이라도 합쳐진다.

print('hello'
' world'
"!")

결과

hello world!

Escape sequence

어떤 문자의 앞에 backslash()를 붙여서, 특별한 의미를 갖게 만들 수 있다. 이렇게 backslash 뒤에 문자가 오는 조합을 escape sequence라고 이야기하며, 하나의 문자로 간주된다. 예를 들어 '\n'의 길이는 1인 것이다. 앞에서 줄 바꿈을 표현하기 위해 사용했던 \n도 그 중 하나다.

그러나 아무 문자나 앞에 backslash를 붙인다고 해서 escape sequence가 되는 것은 아니다. 정해진 문자와 숫자, 기호에 한해서만 적용된다. 여기에는 꽤 많은 종류가 있고, 일부는 이해하기 꽤 어렵다. 여기서는 쉽고 대표적인 몇 가지만 소개한다.

\

\는 문자로서의 backslash를 표현하기 위해 사용한다.

print('\\')

결과

\

이 escape sequence가 준비되어 있는 이유는, backslash가 그 뒤의 문자와 결합해 escape sequence의 효과를 낼 수 있기 때문이다. 예를 들어 \n이라는 문자열을 표현하기 위해서는 '\n' 대신 '\n'을 사용해야 한다.

print('\n is new line character')
print('\\n is new line character')

결과


 is new line character
\n is new line character

\', \"

\', \"는 각각 작은따옴표, 큰따옴표를 표현하기 위해 사용한다. backslash 뒤의 따옴표는 무조건 문자열의 구성요소로써 해석된다.

만약 작은따옴표로 시작한 문자열 내에 작은따옴표가 등장하면, 이는 문자열의 내용이 되지 못하고 문자열의 종료를 의미하게 된다. 이 상황에서 \'를 사용하면, 작은따옴표를 문자열의 내용으로 포함시킬 수 있다.

print('Let\'s study')

결과

Let's study

단, 뒤에서 설명하겠지만 PEP 8은 backslash를 사용하지 않는 방식을 권장한다.

\b

\b는 backspace(한 칸 지우기) 효과를 가진다.

print('Hello,\b \bWorld!')

결과

HelloWorld!

\n

\n는 line feed(줄 바꿈) 효과를 가진다.

print('hello\nworld')

결과

hello
world

\t

\t는 horizontal tab(가로 탭) 효과를 가진다. 키보드에 있는 tab 키와 동일한 역할이다.

print('\tHello, world!')

결과

	Hello, world!

문자열의 따옴표 관례

PEP 8은 문자열의 따옴표에 관해 다음과 같이 설명한다.

In Python, single-quoted strings and double-quoted strings are the same. This PEP does not make a recommendation for this. Pick a rule and stick to it. When a string contains single or double quote characters, however, use the other one to avoid backslashes in the string. It improves readability.

다음처럼 해석할 수 있다.

  • 문자열에 작은따옴표를 사용할 수도 있고, 큰따옴표를 사용할 수도 있으나 이 PEP에서는 특정 방식을 추천하지 않는다. 내키는 대로 규칙을 선택해 적용해라.
  • 문자열에 작은따옴표나 큰따옴표가 들어가는 경우, 그와 반대되는 따옴표를 사용하고 backslash를 사용하는 것을 피해라.

인터넷에 공개되어 있는 파이썬 코드들을 비교해 봐도, 어떤 종류의 따옴표가 특별히 많이 사용되고 있다거나 하지 않는다. 그러니 취향 따라 쓰고 싶은 것을 쓰되, 다음 두 가지 규칙을 지키자.

  • 작은따옴표와 큰따옴표를 여기저기서 섞어 샤용하기보다 한 가지 방식을 정해 통일해 사용하자.
  • backslash에 관해 PEP 8이 권고하는 것을 지키자. 문자열에 작은따옴표나 큰따옴표가 들어가는 경우, 그와 반대되는 따옴표를 사용하고 backslash를 사용하는 것을 피하자.

raw string

알파벳 r 뒤에 문자열을 명시하면, escape sequence를 해석하려고 하지 않는다. backslash가 특별한 효과를 일으키지 않고, 문자 자체로 해석되는 것이다. 예제를 통해 알아보자.

print('hi\nhello')
print(r'hi\nhello')

결과

hi
hello
hi\nhello

이는 r-string이라고도 부른다.

Level 3

따옴표의 종류를 신경쓰지 않는 이유

C언어의 charchar[], Java의 charString처럼 문자를 위한 타입과 문자열을 위한 타입이 구분되어 있는 언어도 있다. 이들은 보통 문자 리터럴에 작은따옴표를 사용하고, 문자열 리터럴에 큰따옴표를 사용한다. 다음은 Java의 예다.

class Main {
    public static void main(String[] args) {
        char c = 'a';
        String s = "Hello, world!";

        System.out.println(c);
        System.out.println(s);
    }
}

결과

a
Hello, world!

파이썬은 문자 타입과 문자열 타입이 구분되지 않으므로, 문자열에 작은따옴표와 큰따옴표를 모두 사용할 수 있도록 만들어졌다.

bytes

bytes는 바이트 스트림을 표현하기 위한 타입이다. 문자열의 encode 메소드를 통해 문자열의 내용을 bytes 타입으로 리턴받을 수 있고, bytes의 decode 메소드를 통해 바이트 스트림의 내용을 문자열 타입으로 리턴받을 수 있다.

print('안녕'.encode())
print('안녕'.encode().decode())

결과

b'\xec\x95\x88\xeb\x85\x95'
안녕

문자열 리터럴 표현식 앞에 알파벳 b를 붙이면, bytes 타입에 대한 리터럴 표현식이 된다.

print(b'\xec\x95\x88\xeb\x85\x95'.decode())

결과

안녕

encode, decode 메소드의 인자로 인코딩 방식을 명시할 수 있다.

print('안녕'.encode('utf-16'))
print(b'\xff\xfeH\xc5U\xb1'.decode('utf-16'))

결과

b'\xff\xfeH\xc5U\xb1'
안녕
profile
백엔드를 주로 다룹니다. 최고가 될 수 없는 주제로는 글을 쓰지 않습니다.

2개의 댓글

comment-user-thumbnail
2022년 9월 28일

진짜 최고에요!

답글 달기
comment-user-thumbnail
2022년 12월 23일

다시 봐도 최고네 ㅋㅋ

답글 달기