Loading [MathJax]/jax/output/CommonHTML/jax.js
본문 바로가기

파이썬

자료형(Data Type) (1) - 숫자, 문자열

1. 숫자형

■ 데이터의 종류를 자료형(data type)이라고 한다. 파이썬에는 다음과 같은 다양한 자료형들이 제공된다.

■ 시퀀스 자료형은 각 요소들이 연속적으로 이어진 자료형으로, 데이터에 순서를 붙여 나열한 자료형이다. 순서가 유지되고 정수로 인덱싱하며, 길이가 있다.

■ 숫자형이란 숫자 형태로 이루어진 자료형으로, 소수점 없이 표현되는 정수와 소수점을 동반하는 실수 그리고 진수가 있다.


1.1 정수형, 실수형

■ 정수형(integer)은 '양의 정수', '음의 정수', '숫자 0'으로 분류할 수 있다.

a = 123 # 양의 정수
a = -123 # 음의 정수
a = 0 # 숫자 0

■ 실수형(floating-point)은 다음과 같이 소수점으로 표현할 수도 있고, 지수 표현 방식으로 나타낼 수도 있다.

a = 1.2 # 소수점 표현
a = 4.24E10 # 지수 표현
a = 4.24e-10 # 지수 표현

- 4.24E10은 4.24×1010, 4.24e-10은 4.24×1010을 의미한다. 


1.2 숫자형을 활용하기 위한 연산자

1.2.1 사칙 연산 - +, - , *, /

■ 숫자형을 활용하는 가장 기본적인 연산은 +, -, *, /. 사칙 연산이다. 

a, b = 2, 3
print(a+b, a-b, a*b, a/b)
```#결과#```
5 -1 6 0.6666666666666666
````````````

1.2.2 제곱 연산자 - **

지수(power)를 계산하려면 ** 연산자를 사용한다.

** 연산자는 제곱을 의미한다. 예를 들어 x**y는 x의 y제곱을 의미한다.

print(a**b)
```#결과#```
8
````````````

■ 지수 연산자는 다른 연산자들보다 높은 우선순위를 가진다. 예를 들어서 10*2**7은 10×27=1280이다. 

1.2.3 나눗셈 후 나머지를 반환하는 연산자 - % 

■ %는 나눗셈의 나머지 값을 리턴하는 연산자이다. 예를 들어 7을 3으로 나누면 나머지는 1, 반대로 3을 7로 나누면 나머지는 3이 된다.

print(7%3, 3%7)
```#결과#```
1 3
````````````

1.2.3 나눗셈 후 몫을 반환하는 연산자 - //

■ / 연산자는 나누기 연산자이다. // 연산자는 나눗셈 후 몫을 리턴하는 연산자이다. 예를 들어 7을 3으로 나누면, 몫은 2이고 나머지는 1이 된다.

print(7//3)
```#결과#```
2
````````````

1.2.4 복합 연산자

복합 (대입) 연산자는 연산과 할당을 합쳐놓은 것으로, 변수가 이전에 가졌던 값을 수정하여 할당하는 작업에 사용할 수 있다.

score = 10
print(score)
score = score + 1
print(score)
score += 1
print(score)
```#결과#```
10
11
12
````````````

■ score = 10은 변수 score에 정수 10을 저장한다는 의미이다. 즉, 프로그래밍에서 '=' 기호는 양변이 같다는 등호가 아니라 오른쪽의 값을 왼쪽 변수에 저장하라는 의미이다.

■ 그러므로 score = score + 1은 score + 1의 값을 변수 score에 저장하라는 의미가 되어 11이 된다.

■ score = score + 1 코드는 복합 대입 연산자를 사용하여 score += 1로 더 간결하게 표현할 수 있다.

■ 만약 score의 값을 1만큼 감소 시키려면 -= 복합 연산자를 사용하면 된다.

■ 복합 연산자에는 다음과 같은 것들이 있다.

+=, -=, *=, /=, //=, %=, **=


 

2. 문자열 자료형

■ 문자열(string)은 '연속된 문자들의 나열'을 의미한다. 즉, 문자열은 문자들의 나열(sequence of characters)이며, 흔히 텍스트(text)라고 부르는 것이다.


2.1 문자열을 만드는 방법

■ 파이썬에서 문자열을 만드는 방법은 총 4가지가 있다.

1. 큰따음표

2. 작은따음표

3. 큰따음표 3개를 연속으로 사용

4. 작은따음표 3개를 연속으로 사용

■ 단, 따음표를 이용하여 문자열을 만들 때, 시작과 종료 인용 부호는 동일한 형태여야 한다. 즉, 시작과 종료 인용 부호가 모두 큰따음표이거나 작은따음표여야 한다. 

2.1.1 큰따음표("...")

"Hello World!"

2.1.2 작은따음표('...')

'Hello World!'

2.1.3 세 따음표 

"""Hello World!, Hello World!"""
```#결과#```
'Hello World!, Hello World!'
````````````

'''Hello World!, 
Hello World!'''
```#결과#```
'Hello World!, \nHello World!'
````````````

■ 파이썬에서는 세 따음표를 사용하여 여러 줄의 문자열을 변수에 할당할 수 있다. 

■ 세 따음표를 이용하면 문자열 안의 줄바꿈이나 스페이스 등이 그대로 유지된 채 출력된다.

a = """How I wonder what you are!
Up above the world so high,
Like a diamond in the sky."""

print(a)
```#결과#```
How I wonder what you are!
Up above the world so high,
Like a diamond in the sky.
````````````

 


2.2 문자열에 큰따음표와 작은따음표를 동시에 사용하는 경우

■ 예를 들어 다음과 같은 문자열을 message라는 변수에 저장하고 싶다고 가정해 보자.

철수가 '안녕'이라고 말했습니다.

위의 문자열에는 안녕이라는 문자열에 작은따음표 ''가 포함되어 있다. 이런 경우 다음과 같이 문자열을 큰따음표로 둘러싸야 한다. 큰따음표 안에 들어 있는 작은따음표는 문자열을 나타내는 기호로 인식되지 않는다. 

message = "철수가 '안녕'이라고 말했습니다."
message
```#결과#```
"철수가 '안녕'이라고 말했습니다."
````````````

■ 반대로 아래와 같이 큰따음표가 포함된 문자열이라면, 해당 문자열을 작은따음표로 둘러싸면 된다.

철수가 "안녕"이라고 말했습니다.
message = '철수가 "안녕"이라고 말했습니다.'
message
```#결과#```
'철수가 "안녕"이라고 말했습니다.'
````````````

■ 작은따음표나 큰따음표를 문자열에 포함시키는 또 다른 방법은 역슬래시(\)를 사용하는 것이다.

■ 아래와 같이 역슬래시를 작은따음표나 큰따음표 앞에 삽입하면, 역슬래시 뒤의 작은따음표나 큰따음표는 문자열을 나타내는 기호로 인식되지 않는다.

message = '철수가 \"안녕\"이라고 말했습니다.'
message
```#결과#```
'철수가 "안녕"이라고 말했습니다.'
````````````

2.3 이스케이프(escape) 코드

■ 여러 줄인 문자열을 변수에 대입하고 싶을 때, 위의 2.1.3처럼 작은따음표 3개 또는 큰따음표 3개를 연속해서 사용해도 되지만, 아래와 같이 줄바꿈 문자인 \n을 삽입하는 방법도 있다.

## 따음표 3개 연속해서 사용
a = """How I wonder what you are!
Up above the world so high,
Like a diamond in the sky."""
print(a)
```#결과#```
How I wonder what you are!
Up above the world so high,
Like a diamond in the sky.
````````````

## \n 사용
a = "How I wonder what you are!\nUp above the world so high,\nLike a diamond in the sky."
print(a)
```#결과#```
How I wonder what you are!
Up above the world so high,
Like a diamond in the sky.
````````````

■ 이렇게 역슬래시 문자와 소문자 n을 조합한 것을 \n 이스케이프 코드 또는 이스케이프 시퀀스(sequence)라고 부른다. 

■ 이스케이프 코드는 미리 정의해 둔 '문자 조합'을 말하며, 주로 출력물을 보기 좋게 정렬하는 용도로 사용한다.

\n 외에도 아래 표에 제시된 것처럼 활용 빈도가 높은 이스케이프 코드들이 존재한다.

코드 설명
\n 줄바꿈 문자, 문자열 안에서 줄을 바꿀 때 사용
\t 탭문자, 문자열 사이에 탭 간격(4칸)을 줄 때 사용
\\ 역슬래시 \를 그대로 표현할 때 사용
\" 큰따음표 "를 그대로 표현할 때 사용
\' 작은따음표 '를 그대로 표현할 때 사용

2.4 문자열의 결합과 반복

■ 파이썬에서는 + 연산자로 2개의 문자열을 하나의 문자열로 합칠 수 있다. 이것을 문자열 연결(concatenation)이라고 한다.

"Hello " + "World!"
```#결과#```
'Hello World!'
````````````

h = "Hello "
w = "World!"
h+w
```#결과#```
'Hello World!'
````````````

■ 문자열을 반복하려면 * 연산자를 사용하면 된다. 예를 들어 아래와 같이 "Hello " * 2는 "Hello "를 2번 반복하라는 뜻이다. 

h = "Hello " * 2
print(h); print(w*3)
```#결과#```
Hello Hello 
World!World!World!
````````````

2.5 문자열의 인덱싱과 슬라이싱

2.5.1 문자열 인덱스

■ 문자열은 연속된 '문자'의 나열이라고 하였다. 이때, 문자열 안의 문자는 인덱스를 사용하여 접근이 가능하다. 

■ 어떤 문자의 위치나 인덱스는 0, 1, 2, 3,.. 중 하나다. 즉, 문자열 안의 첫 번째 문자는 인덱스 0으로 접근할 수 있고, 두 번째 문자는 인덱스 1로 접근할 수 있다. 

■ 아래와 같이 문자열[인덱스 번호]는 문자열 안의 특정한 값을 추출하는 역할을 한다. 이러한 작업을 '인덱싱'이라고 한다. 

message = "Hello World"
print(message[0]);print(message[6])
```#결과#```
H
W
````````````

2.5.2 문자열 음의 인덱스

■ 파이썬에는 음의 인덱스도 있다.  2.5.1에서 설명한 인덱스는 왼쪽에서 시작하는 위치를 설정하지만, 음의 인덱스는 오른쪽에서부터 위치를 인덱스할 수 있도록한다.

■ 음의 인덱스를 사용하면 위와 같이 가장 우측의 문자 인덱스는 항상 -1로 설정하고, 다음 문자 인덱스를 -2 등으로 설정한다.

■ 즉, 문자열[-1]은 문자열의 맨 마지막 문자, 즉 뒤에서 첫 번째 문자를 의미하며,  문자열[-2]는 뒤에서부터 두 번째 문자를 의미한다.

문자열 인덱싱을 다음과 같이 활용할 수 있다.

new_message = "SW" + "/" + message[0] + message[-5]
print(new_message)
```#결과#```
SW/HW
````````````

cf) 인덱스 번호로 0과 -0은 똑같은 것이기 때문에 message[0]과 message[-0]은 동일한 문자를 추출한다. 

print(message[0]);print(message[-0])
```#결과#```
H
H
````````````

2.5.3 문자열 슬라이스

■ message = "Hello World"라는 문자열에서 단순히 한 문자만을 추출하는 것이 아니라 "Hello", "World"와 같은 단어를 뽑아내기 위해 사용하는 것이 슬라이싱(slicing)기법이다. 

message[0:5] # == message[:5]
```#결과#```
'Hello'
````````````

message[-5:] # == message[-5:-1]
```#결과#```
'World'
````````````

■ 문자열[0:5]는 문자열에서 인덱스 0부터 4까지 해당되는 문자를 추출한다는 의미이다. 마찬가지로 문자열[-5:]는 문자열 -5부터 -1까지 해당되는 문자를 추출한다는 의미이다. 

■ 슬라이싱 기법은 [시작 번호 : 끝 번호]를 지정할 때 끝 번호에 해당하는 원소는 포함하지 않는다. 

■ 그리고 [시작 번호 : 끝 번호]에서 끝 번호를 생략하면, 즉 [시작 번호 : ]이면 시작 번호부터 마지막 인덱스 번호에 해당되는 것까지 추출한다. 

■ [시작 번호 : 끝 번호]에서 시작 번호를 생략하면, [ : 끝 번호] 처음부터 끝 번호에 해당되는 것까지 추출한다.

■ [시작 번호 : 끝 번호]에서 시작 번호와 끝 번호 모두 생략하면, [ : ] 처음부터 끝가지 추출한다. 

슬라이싱을 할 때, 단계(step)을 지정할 수도 있다. 

문자열[start : end : step]
message[::2]
```#결과#```
'HloWrd'
````````````

message[::-1]
```#결과#```
'dlroW olleH'
````````````

2.5.4 문자열은 불변 객체

■ 예를 들어 a = "massage"라는 문자열에서 인덱스 1에 위치한 문자 "a"를 문자 "e"로 바꾸기 위한 간단한 아이디어는 a[1] = "e"로 a의 인덱스 1에 문자 "e"를 대입하는 것이다. 

■ 하지만 아래와 같은 오류가 발생한다. 

a = "massage"
a[1]
```#결과#```
"a"
````````````

a[1] = "e"
```#결과#```
TypeError: 'str' object does not support item assignment
````````````

■ 이 오류는 문자열(str)이 변경 불가능(immutable)한 자료형이기 때문에, 문자열의 특정 위치에 값을 직접 할당할 수 없다는 의미이다. 즉, 불변 객체인 문자열은 원래 있던 값을 부분적으로 수정할 수 없다.

■ 이런 오류를 피하면서 문자열을 수정할 수 있는 방법은 다음과 같이 슬라이싱 기법을 사용하는 것이다. 

a[:1] + "e" + a[2:]
```#결과#```
'message'
````````````

2.6 문자열 포매팅(formatting)

■ 문자열 포매팅이란 문자열 안에 어떤 값을 삽입하는 방법이다. 보통 원하는 값들을 문자열에 넣어주기 위해 사용하며, 이를 위해 다음과 같은 문자열 포맷 코드들을 사용한다. 

코드 설명
%s 문자열(string)
%c 문자 1개(character)
%d 정수(integer)
%f 부동소수점(floating-point)
%o 8진수
%x 16진수

2.6.1 숫자 대입

■ 아래와 같이 문자열 안에 문자열 포맷 코드 %d, %f를 넣어 정수, 부동소수점을 삽입할 수 있다. 

print("I eat %d apples." % 3)
print("I eat %f apples." % 1.5)
```#결과#```
I eat 3 apples.
I eat 1.500000 apples.
````````````

2.6.2 문자, 문자열 대입

■ 아래와 같이 문자열 안에 문자열 포맷 코드 %c, %s를 넣어 문자, 문자열을 삽입할 수 있다.

print("I eat %c apples." % '5') 
print("I eat %s apples." % 'five')
```#결과#```
I eat 5 apples.
I eat five apples.
````````````

■ 위의 예시들 처럼 바로 대입할 수도 있고, 다음과 같이 특정 자료형을 나타내는 변수를 대입하여 사용할 수도 있다.

number1 = 5 # integer
number2 = 'five' # string

print("I eat %d apples." % number1) 
print("I eat %s apples." % number2) 
```#결과#```
I eat 5 apples.
I eat five apples.
````````````

2.6.3 2개 이상의 값 넣기

■ 문자열 안에 1개가 아닌 여러 개의 값을 넣고 싶은 경우, % 다음에 쉼표(,)로 구분하여 각각의 값을 넣어 주면 된다.

print("I eat %d %s apples." % (number1, number2))
```#결과#```
I eat 5 five apples.
````````````

cf) 정수를 문자열 안에 삽입하려면 %d를, 부동소수를 문자열 안에 삽입하려면 %f를 사용해야 하지만, %s는 자동으로 % 뒤에 오는 정수나 부동소수 값을 자동으로 문자열로 변환해 삽입해 준다.

cf) 포매팅 연산자 %d와 %를 같이 사용할 때는 %%를 사용한다. 예를 들어 "I eat %d% apples" % 98을 통해 "I eat 98% apples"이라는 결과가 나오기를 기대할 수 있다. 하지만 이렇게 사용할 경우 오류가 발생한다.

포맷 코드인 %d와 일반 %가 같은 문자열 안에 존재하는 경우, %를 나타내려면 반드시 %%를 사용해야 한다.

print("I eat %d%% apples." % 98)
```#결과#```
I eat 98% apples.
````````````

2.6.4 포맷 코드와 숫자 함께 사용하기

2.6.4.1 정렬과 공백

■ 포맷 코드와 숫자를 사용할 경우 문자열에 공백을 적용할 수 있다.

"%6s" % "Hello"
```#결과#```
' Hello'
````````````

for i in range(len(a)):
    print(f'{i}번째 인덱스에 해당되는 문자 {a[i]}')
```#결과#```
0번째 인덱스에 해당되는 문자  
1번째 인덱스에 해당되는 문자 H
2번째 인덱스에 해당되는 문자 e
3번째 인덱스에 해당되는 문자 l
4번째 인덱스에 해당되는 문자 l
5번째 인덱스에 해당되는 문자 o
````````````

■ 위의 예시와 같은 %6s는 전체 길이가 6인 문자열 공간에 대입되는 값(이 예에서는 Hello)을 오른쪽으로 정렬하고, 그 앞의 나머지는 공백으로 남기라는 의미이다. 

- "Hello"라는 문자열의 길이는 5이므로 0번째 인덱스에 해당되는 문자는 공백 문자임을 확인할 수 있다.

■ 왼쪽으로 정렬하고 싶다면 %-6s를 사용하면 된다.

"%-6s" % "Hello"
```#결과#```
'Hello '
````````````
"%-10sWorld" % "Hello"
```#결과#```
'Hello     World'
````````````

■ 위의 예시에서 %-10s에 대응되는 것은 "Hello"이다. %-10s이므로 "Hello"를 전체 길이가 10인 문자열 공간에 왼쪽 정렬한다. 그러면 공백은 5칸이 생길 것이다. 그리고 그 뒤에 World가 붙는다.

2.6.4.2 소수점 표현

■ 소수점을 특정 자리수까지만 표시하고 싶을 때는 다음과 같이 작성한다.

"%0.4f" % 0.831497
```#결과#```
'0.8315'
````````````

- 소수점 앞의 0을 생략하여 %.4f로 사용해도 된다.

■ %0.4f에서 점(.)은 소수점 포인트이며, 점 뒤의 숫자는 소수점 뒤에 나올 숫자의 개수를 의미한다. 

■ 소수점 포인트인 점(.) 앞의 숫자는 문자열의 전체 길이를 의미하며, 숫자 0인 경우 길이에 상관하지 않겠다는 의미이다.

■ 예를 들어, 다음과 같이 소수점 포인트 앞의 숫자가 10인 경우, 전체 길이가 10인 문자열 공간에서 소수점 네 번째자리까지에 해당되는 값을 오른쪽 정렬하게 된다.

"%10.4f" % 0.831497
```#결과#```
'    0.8315'
````````````

■ 이 예의 경우 0.8315의 길이는 6이므로 0.8315 앞의 공백은 4칸이라는 것을 유추할 수 있다.


2.7 format 함수를 사용한 포매팅

■ format 함수를 사용하여 문자열 포맷을 지정할 수 있다. format 함수는 중괄호 { } 안에 포매팅을 지정하고 format 함수의 인자에 값들을 넣으면 된다. 예를 들어 아래와 같이 사용하면 된다.

"{인덱스0}, {인덱스1}".format(값0, 값1)
number1 = 5 # integer
number2 = 'five' # string

print("I eat {0} apples.".format(number1))
print("I eat {0} {1} apples.".format(number1, number2)) 
```#결과#```
I eat 5 apples.
I eat 5 five apples.
````````````

number3 = 10
print("I eat {0}{1} {2}  apples.".format(number1, number3, number2)) 
print("I eat {2} {1} {2}  apples.".format(number1, number3, number2))

```#결과#````
I eat 510 five  apples.
I eat five 10 five  apples.
`````````````

■ 두 개 이상의 값을 넣을 경우 {0}, {1} 처럼 인덱스를 사용해 format( ) 함수의 입력값을 순서대로 지정할 수 있다.

- 위의 예에서 {0}은 format 함수의 첫 번째 입력값인 number1, {1}은 format 함수의 두 번째 입력값인 number3. {2}는 format 함수의 세 번째 입력값인 number2에 대응되는 것을 볼 수 있다.

■ {0}, {1}과 같은 인덱스 항목 대신 {name} 형태를 사용하는 방법도 있다. 

■ 단, {name} 형태를 사용하는 경우, format 함수에는 다음과 같이 반드시 name=value와 같은 형태의 입력값이 있어야 한다. 

print("I eat {number1} {number2} apples.".format(number1=10, number2='5'))
```#결과#```
I eat 10 5 apples.
````````````

■ 물론, {0}, {1}과 같은 인덱스 항목과 {name} 형태를 혼용해서 사용할 수도 있다.

■ 정렬 역시, format 함수를 사용하여 적용할 수 있다. 

코드 설명
:<num 문자열을 왼쪽으로 정렬하고, 문자열의 총 자릿수를 num으로 맞춘다.
:>num 문자열을 오른쪽으로 정렬하고, 문자열의 총 자릿수를 num으로 맞춘다.
:^num 문자열을 가운데 정렬하고, 문자열의 총 자릿수를 num으로 맞춘다.
"{:<10}".format("hi", "5") # == "{0:<10}".format("hi", "5")
```#결과#```
'hi        '
````````````
"{1:<10}".format("hi", "5") # == "{0:<10}".format("hi", "5")
```#결과#```
'5         '
````````````

■ format 내에 인수가 여려 개가 존재할 수 있으며, 위치는 0부터 시작한다. 중괄호 안에 있는 콜론 앞의 숫자 0은 포맷팅할 인수의 인덱스를 가리킨다. 이러한 이유로 위의 예에서 첫 번째 예시는 hi를 두 번째 예시에서는 5를 출력하게 된다. 

"{:>10}".format("hi")
```#결과#```
'        hi'
````````````

"{:^10}".format("hi")
```#결과#```
'    hi    '
````````````

■ 정렬 시, 공백 문자가 기본값이다. 만약, 공백 문자 대신 원하는 문자 값으로 공백을 채우고 싶은 경우 다음과 같이 대체할 문자 값을 정렬 문자 <, >, ^ 바로 앞에 넣으면 된다.

"{0:=^10}".format("hi")
```#결과#```
'====hi===='
````````````

2.8 f 문자열 포매팅

■ 파이썬 3.6부터는 f 문자열 포매팅 기능을 사용할 수 있다. 사용 방법은 다음과 같이 문자열 앞에 f 접두사를 붙이면 된다.

f'남은 거리는 {number3}{number1}km입니다.'
```#결과#```
'남은 거리는 105km입니다.'
````````````

■ 그리고 f 문자열 포매팅은 표현식을 지원하기 때문에 다음과 같은 것들도 가능하다.

f'남은 거리는 {number3 + 10}{number1}km입니다.
```#결과#```
'남은 거리는 205km입니다.'
````````````
f'남은 거리는 {d["number2"] - d["number1"]}km입니다.'
```#결과#```
'남은 거리는 7km입니다.'
````````````
# 순서대로 왼쪽, 오른쪽, 가운데 정렬

print(f'{"hi":<5}')
print(f'{"hi":>5}')
print(f'{"hi":^5}')
```#결과#```
hi   
   hi
 hi  
````````````

print(f'{"hi":!<5}')
```#결과#```
hi!!!
````````````

■ 소수점은 다음과 같이 표현할 수 있다.

a = 0.831497

print(f'{a:0.4f}')
print(f'{0.831497:20.4f}')
```#결과#```
0.8315
              0.8315
````````````

2.9 문자열 관련 함수

■ 문자열 관련 함수 내용에 앞서, 객체(object)가 무엇인지 간략히 알 필요가 있다.

■ 파이썬에서 정수, 부동소수점, 문자열, 리스트, 튜플, 딕셔너리 등은 객체이다. 

■ 프로그래밍에서 객체(object)란 다음 그림과 같이 객체와 관련된 변수와 함수를 하나로 묶은 것이다.

■ 예를 들어 message = "Hello World"처럼 "Hello World"라는 문자열을 message라는 변수에 저장했다고 하면, 위의 그림에서 객체는 문자열 객체이고, 변수는 message, 함수는 문자열의 내장 함수로 이해할 수 있다.

■ 객체 안에 정의된 함수를 내장 함수 또는 메서드(method)라고 부른다. 메서드를 사용하면 객체에 다양한 작업을 수행할 수 있다. 즉, 메서드는 객체가 자체적으로 가지는 함수라고 할 수 있다.

예를 들어 message = "Hello World"라면 객체인 문자열 "Hello World"에 대해 문자열 관련 내장 함수들을 적용할 수 있는 것이다. 

■ 객체가 가지고 있는 메서드를 호출하려면 객체를 적은 후에 점(.)을 찍고 메서드의 이름을 적으면 된다.

cf) 객체가 가지고 있는 메서드나 속성(attribute)를 확인하려면 dir() 함수를 사용해서 확인할 수 있다.

print(dir(객체의 변수명))

이제 문자열의 메서드에 대해서 알아보자.

 

2.9.1 startswith, endswith, find, rfind, count

startswith(s)는 문자열 s로 시작되는 문자열이면 True를, endswith(s)는 문자열 s로 종료되는 문자열이면 True를 반환한다.

a = "Hello World!"

a.startswith('H')
```#결과#```
True
````````````

a.endswith('!')
```#결과#```
True
````````````

■ find 함수는 문자열 중 특정 문자나 문자열이 처음으로 나온 위치를 반환한다.

만약, 찾는 문자나 문자열이 존재하지 않는다면 -1을 반환한다. 

a = "Hello World!"

a.find('W')
```#결과#```
6
````````````

a.find('Hello')
```#결과#```
0
````````````

a.find('k')
```#결과#```
-1
````````````

a.find('new')
```#결과#```
-1
````````````

■ rfind 함수는 끝에서 시작하여 함수에 지정한 부분 문자열을 대상 문자열 안에서 검색해서 해당 부분 문자열의 인덱스를 반환하는 함수이다. find 함수와 마찬가지로 찾는 문자나 문자열이 존재하지 않는다면 -1을 반환한다.

a.rfind("l")
```#결과#```
9
````````````

- 문자 'l'을 대상 문자열 "Hello World!"의 끝(오른쪽)에서 시작하여 찾았기 때문에 인덱스 값 9를 반환한 것을 확인할 수 있다.

■ count 함수를 사용해서 아래와 같이 문자열 중 특정 문자나 문자열의 개수를 반환할 수 있다.

a = "Hello World!"

a.count('l') # 문자 'l'
```#결과#```
3
````````````

a.count('He') # 문자열 'He'
```#결과#```
1
````````````

startswith, endswith, find, rfind, count 메서드는 시작 위치와 종료 위치 인수를 지원한다. 위치가 지정되면, 원본 문자열을 시작 위치에서 시작하여 종료 위치까지의 부분 문자열로 제한한다.

a.startswith('e', 1, 10)
```#결과#```
True
````````````

a.endswith('l', 0, 3)
```#결과#```
True
````````````

a.find('Hello', 5, 10)
```#결과#```
-1
````````````

a.rfind('e', 5, 10)
```#결과#```
-1
````````````

a.count('H', 5, 10)
```#결과#```
0
````````````

2.9.2 대소문자 -  capitalize, upper, lower

■ capitalize 함수는 첫 문자만 대문자로 변환하는 메서드이다.

a = "massage"
a.capitalize()
```#결과#```
'Massage'
````````````

 

 

■ upper 함수는 대문자로 바꿔주는 함수이다. 이미 대문자라면 아무런 변화도 일어나지 않는다.

a = "Hello World!"

a.upper()
```#결과#```
'HELLO WORLD!'
````````````

 

 lower 함수는 소문자로 바꿔주는 함수이다. 이미 소문자라면 아무런 변화도 일어나지 않는다.

a.lower()
```#결과#```
'hello word!'
````````````

2.9.3 index

■ index 함수도 문자열 중 특정 문자나 문자열이 처음으로 나온 위치를 반환한다.

■ 단, index 함수는 문자열 안에 존재하지 않는 문자 또는 문자열을 찾으면 find 함수와 다르게 오류를 발생시킨다. 

a.index('W')
```#결과#```
6
````````````

a.index('Hello')
```#결과#```
0
````````````

a.index('k')
```#결과#```
ValueError: substring not found
````````````

a.index('new')
```#결과#```
ValueError: substring not found
````````````

2.9.4 join

■ join 함수는 주로 값들에 특정 구분자를 주거나 값들을 연결할 때 사용한다.

" > ".join('abcd')
```#결과#```
'a > b > c > d'
````````````

print("".join("abcd"))
print(" ".join("abcd"))
```#결과#```
abcd
a b c d
````````````

■ join 함수는 문자열뿐만 아니라 리스트나 튜플에도 사용할 수 있다. 

a = ['a', 'b', 'c', 'd']
print("".join(a))
print(" ".join(a))
print(" < ".join(a))
```#결과#```
abcd
a b c d
a < b < c < d
````````````

2.9.5 공백 지우기 - strip, lstrip, rstrip

■ strip 함수는 문자열 양쪽에 있는 공백을 모두 제거하는 함수이다.

■ lstrip 함수는 문자열의 왼쪽에 있는 공백을, rstrip 함수는 오른쪽에 있는 공백을 모두 제거하는 함수이다.

a = "    Hello    "

a.strip()
```#결과#```
'Hello'
````````````

a.lstrip()
```#결과#```
'Hello    '
````````````

a.rstrip()
```#결과#```
'    Hello'
````````````

2.9.6 replace

■ replace 함수는 replace(바뀔 문자 또는 문자열, 바꿀 문자 또는 문자열) 형태로 사용하여, 문자열 내의 특정 문자 또는 문자열을 다른 문자 또는 문자열로 치환해주는 함수이다.

a = "Hello World!"

a.replace("H", "A")
```#결과#```
'Aello World!'
````````````

a.replace("Hello", "Apple")
```#결과#```
'Apple World!'
````````````

■ 다음과 같이 replace 함수를 연속해서 사용하는 것도 가능하다.

a.replace("H", "Apple").replace("ello", "")
```#결과#```
'Apple World!'
````````````

2.9.7 split

■ split 함수는 문자열을 일정한 규칙으로 잘라서 리스트로 만들어주는 함수이다. 사용 방법은 다음과 같다.

문자열.split(sep='구분자', maxsplit='분할 횟수')

- 문자열.split() 처럼 괄호 안에 값을 넣지 않으면 공백을 기준으로 문자열을 나눈다.

a = "Hello World! abcd 1 2 3"

a.split()
```#결과#```
['Hello', 'World!', 'abcd', '1', '2', '3']
````````````

a.split(sep=' ')
```#결과#```
['Hello', 'World!', 'abcd', '1', '2', '3']
````````````

a.split(sep='.')
```#결과#```
['Hello World! abcd 1 2 3']
````````````

a.split(sep=' ', maxsplit=2)
```#결과#```
['Hello', 'World!', 'abcd 1 2 3']
````````````

■ a.split()와 a.split(sep=' ')는 동일한 결과를 반환하는 것을 볼 수 있다. 둘 다 공백 기준으로 문자열을 자르는 것을 볼 수 있다.

■ a.split(sep='.')은 '.'을 깆준으로 문자열을 자르게 된다.

- 이 예에서는 문자열에 마침표가 없기 때문에 전체 문자열이 그대로 하나의 요소로 리스트에 담겨 반환된다.

a.split(sep=' ', maxsplit=2)는 공백을 기준으로 문자열을 나누되, 최대 두 번까지만 분리하도록 설정한 것이다. 즉, 문자열의 앞쪽(왼쪽)부터 공백을 만날 때마다 나누되, 세 번째 공백 이후는 더 이상 분리하지 않는다. 따라서

- 이 예에서는 세 번째 공백부터의 내용인 abcd와 123이 하나의 문자열로 묶여 반환되는 것을 볼 수 있다.

2.9.8 정렬 - center, ljust, rjust

■ center, ljust, rjust는 지정된 폭을 기준으로 가운데 정렬, 왼쪽 정렬, 오른쪽 정렬을 수행하는 함수이다. 

■ 만약, 문자열이 지정된 폭보다 길다면, 정렬 메서드는 적용되지 않는다.

a = "Hello World"

a.center(5)
```#결과#```
'Hello World'
````````````

a.center(20)
```#결과#```
'    Hello World     '
````````````

a.ljust(20)
```#결과#```
'Hello World         '
````````````

a.rjust(20)
```#결과#```
'         Hello World'
````````````

- "Hello World"의 총 길이는 11이다. 그러므로 폭을 5로 지정한 center(5)의 결과를 보면, 가운데 정렬이 적용되지 않은 것을 볼 수 있다.

■ 주의할 점은 문자열은 자체의 값을 변경할 수 없는 불변 객체이기 때문에 위와 같은 방식으로 문자열 메서드를 적용해도 적용한 결과로 문자열이 바뀌지 않는다.

print(a)
a.upper()
print(a)
```#결과#```
Hello World
Hello World
````````````

■ 그러므로, 문자열의 값을 바꾸고 싶다면, 다음과 같이 대입문(=)을 사용해야 한다.

print(a)
a = a.upper()
print(a)
```#결과#```
Hello World
HELLO WORLD
````````````

2.9.9 문자 분류 - isalpha, isdigit islower, isupper

■ isalpha는 문자열 안의 모든 문자가 알파벳이면 True를, 그렇지 않으면 False를 반환하는 함수이며, isdigit는 문자열이 숫자로만 구성되어 있으면 True, 그렇지 않으면 False를 반환하는 함수이다.

■ islower는 문자열 안의 모든 문자가 소문자이면 True, 그렇지 않으면 False를 반환하는 함수이며, isupper은 문자열 안의 모든 문자가 대문자이면 True, 그렇지 않으면 False를 반환하는 함수이다.

a = 'abc'
b = '1234'
c = 'AB'

print(b.isdigit(), b.isalpha())
```#결과#```
True False
````````````

print(a.isalpha(), a.islower())
```#결과#```
True True
````````````

print(c.isalpha(), c.isupper())
```#결과#```
True True
````````````


 

참고) 변수(Variable)

 변수는 컴퓨터의 메모리 공간에 이름을 붙이는 것으로, 파이썬에서는 변수에 어떤 타입(type)의 데이터도 저장할 수 있다. 즉, 정수나 실수, 문자열 등을 변수에 저장할 수 있다.


변수 정의하기

■ 파이썬에서 변수를 정의하는 방법은 아래와 같이 할당문(대입문)을 사용하면 된다. 변수에 값을 저장하면 변수가 자동으로 생성된다. 

변수 이름 = 값

x = 100

 

■ 변수는 다음과 같이 데이터 값을 보관하고 있는 이름이 붙어진 상자로 생각할 수 있다.

[출처] https://fishpoint.tistory.com/6845

■ 이 상자 안에 있는 값은 언제든지 바뀔 수 있다. 즉, 변수에 들어 있는 값을 다른 값으로 바꿀 수 있다.

x = 100
print(x)
x = 200
print(x)
```#결과#```
100
200
````````````

- 첫 번째 문장에 의하여 변수 x가 생성되고 100으로 초기화되었으나, x = 200으로 인해 앞서 저장되었던 100이 없어지고 200이 x라는 이름이 붙은 상자에 새롭게 저장된다.

 변수는 값 자체를 저장하는 것이 아니라, 값이 저장된 메모리 주소를 참조한다. 예를 들어 x = 100이라고 선언했을 때, x는 100이라는 값이 저장된 메모리 주소를 가리킨다. 

id(x) # 변수 x에 저장된 참조값(주소)
```#결과#```
140715314633735
````````````

변수 연산

■ 변수를 이용하여 다양한 연산을 수행할 수 있다. 아래의 코드는 두 개의 변수를 이용하여 사칙 연산을 수행하는 코드이다.

x, y = 10, 20
print(x+y); print(x-y); print(x*y); print(x/y)
```#결과#```
30
-10
200
0.5
````````````

1.2.4에서 복합 연산자 예시도 변수를 사용하기 때문에 한 번 저장한 데이터를 계속해서 꺼내 쓸 수 있다. 이렇게 변수를 사용하면 매번 같은 값을 다시 입력할 필요가 없어 편리하다.



참고) 불변 객체와 가변 객체


■ 데이터를 저장하는 객체들은 크게 불변 객체(immutable object)와 가변 객체(mutable object)로 나누어진다.

■ 정수, 부동소수점, 문자열은 한번 만들어지면 변경할 수 없으므로 불변 객체라고 한다. 

■ 불변 객체라고 해서 변수에 저장된 값을 변경하지 못하는 것은 아니다. 변수에 저장된 값을 변경하면 값을 저장하는 새로운 객체가 생성되어서 새로운 객체의 참조값이 변수에 저장된다.

score = 10
change_score = score
score = 20

print(score)
print(change_score)
```#결과#```
20
10
````````````

■ 위의 예시에서 change_score값과 score값이 동일하다고 정의하였다. score 값을 10에서 20으로 변경하였지만 change_score값은 바뀌지 않은 것을 확인할 수 있다.

정수는 한쪽이 변경되어도 다른 쪽이 변경되지 않는 불변 객체이기 때문이다.

score = 10
print(id(score))
change_score = score
print(id(change_score))
score = 20
print(id(score))
```#결과#```
140737193624647
140737193624647
140737193624967
````````````

■ 처음 score와 change_score을 선언했을 때, 두 변수의 id값이 같았지만, score에 지정된 값을 변경하니 score는 새로운 id값을 가지게 되었고, 두 변수의 id값이 달라지는 것을 볼 수 있다. 

■ 가변 객체는 리스트, 딕셔너리같은 객체이다. 이러한 가변 객체에는 항목을 추가할 수 있기 때문이다. 



참고) print 인자 - sep, end


■ 값(value)이 문자열이나 숫자인 print(value0, value1, ... , valueN) 형태의 명령은 공백으로 구분된 연속된 값을 출력한다. 

print(1, 2, 3, "Hello", "World")
```#결과#```
1 2 3 Hello World
````````````

 

■ print 함수는 이렇게 기본적으로 공백을 구분자로 사용하는데, sep 인자를 이용하여 사용하고 싶은 구분자로 변경할 수 있다.

print(1, 2, 3, "Hello", "World", sep=" to ")
```#결과#```
1 to 2 to 3 to Hello to World
````````````

print(1, 2, 3, "Hello", "World", sep="**")
```#결과#```
1**2**3**Hello**World
````````````

print(1, 2, 3, "Hello", "World", sep="\n")
```#결과#```
1
2
3
Hello
World
````````````

■ 그리고 print 문을 아래와 같이 연속적으로 사용할 경우, 아래와 같이 출력 결과를 각각 새로운 행에 출력한다.

print("Hello"); print("World")
```#결과#```
Hello
World
````````````

■ end 인자를 사용하면 다음과 같이 신규 행 연산 없이 동일한 행에 출력 결과를 표시한다.

print("Hello", end = ""); print("World")
```#결과#```
HelloWorld
````````````

print("Hello", end = " "); print("World")
```#결과#```
Hello World
````````````