04. 문자열과 입력
- 문자열을 만들고, 잇고, 일부를 꺼내는 법을 익힌다.
- 자주 쓰는 문자열 메서드(
.upper(),.strip(),.split()등)를 안다. - f-string으로 값을 깔끔하게 끼워 넣어 출력한다.
input()으로 사용자에게 값을 입력받는다.
문자열이란
문자열(string)은 글자들의 묶음입니다. 따옴표로 감싸서 만듭니다. 큰따옴표 "..."와 작은따옴표 '...' 둘 다 됩니다.
greeting = "안녕하세요" name = 'Python' print(greeting) # 안녕하세요 print(name) # Python
```python
print("그는 'Python'이라고 말했다") # 바깥은 큰따옴표, 안은 작은따옴표
```
여러 줄 문자열
따옴표 세 개("""...""")로 감싸면 여러 줄 문자열이 됩니다.
message = """첫째 줄 둘째 줄 셋째 줄""" print(message) # 출력: # 첫째 줄 # 둘째 줄 # 셋째 줄
문자열 잇기와 반복
+로 문자열을 이어 붙이고, *로 반복합니다.
first = "Hello" second = "Python" print(first + ", " + second + "!") # Hello, Python! print("=" * 20) # ==================== print("냠" * 3) # 냠냠냠
+로 직접 이을 수 없습니다.```python
"나이: " + 25
```
```text
TypeError: can only concatenate str (not "int") to str
```
TypeError는 "자료형이 안 맞다"는 뜻입니다. 해결책은 str(25)로 변환하거나, 더 좋게는 곧 배울 f-string을 쓰는 것입니다.문자열 인덱싱과 슬라이싱
문자열은 글자들이 순서대로 늘어선 것이라, 위치(인덱스)로 글자를 꺼낼 수 있습니다. 인덱스는 0부터 시작합니다.
P y t h o n 0 1 2 3 4 5 ← 앞에서부터 (0부터) -6 -5 -4 -3 -2 -1 ← 뒤에서부터 (-1부터)
s = "Python" print(s[0]) # P (첫 글자) print(s[1]) # y print(s[-1]) # n (마지막 글자, 뒤에서 첫 번째) print(s[-2]) # o
[0], 둘째가 [1]. 마지막 글자는 길이를 몰라도 [-1]로 꺼낼 수 있다.여러 글자를 한 번에 꺼내는 것을 슬라이싱(slicing)이라 하며 [시작:끝] 형태입니다. 이때 끝 인덱스는 포함되지 않습니다.
s = "Python" print(s[0:3]) # Pyt (0,1,2번 — 3은 미포함!) print(s[2:5]) # tho print(s[:3]) # Pyt (시작 생략 = 처음부터) print(s[3:]) # hon (끝 생략 = 끝까지) print(s[:]) # Python (통째로 복사)
[a:b]에서 b는 포함되지 않습니다. s[0:3]은 0·1·2번 글자, 즉 3글자입니다. "끝 번호 직전까지"로 외우세요. 이 "끝 미포함" 규칙은 나중에 리스트·range()에서도 똑같이 적용되는 Python의 일관된 약속입니다.자주 쓰는 문자열 메서드
문자열에는 유용한 기능들이 딸려 있습니다. 문자열.메서드() 형태로 호출합니다. (메서드는 "특정 값에 딸린 함수"라고 생각하면 됩니다. 9장에서 함수를, 중급편에서 메서드를 자세히 다룹니다.)
| 메서드 | 하는 일 | 예 (s = "Python") |
|---|---|---|
len(s) | 길이 (메서드는 아니고 함수) | len(s) → 6 |
.upper() | 모두 대문자로 | s.upper() → "PYTHON" |
.lower() | 모두 소문자로 | s.lower() → "python" |
.strip() | 양끝 공백 제거 | " hi ".strip() → "hi" |
.replace(a, b) | a를 b로 교체 | s.replace("Py", "My") → "Mython" |
.split(구분자) | 구분자로 쪼개 리스트로 | "a,b,c".split(",") → ["a","b","c"] |
구분자.join(리스트) | 리스트를 구분자로 이어 | "-".join(["a","b"]) → "a-b" |
raw = " Hello, World " print(raw.strip()) # Hello, World print(raw.strip().lower()) # hello, world ← 메서드를 연달아! print("2025-01-15".split("-")) # ['2025', '01', '15'] print(",".join(["사과", "배", "감"])) # 사과,배,감
.strip().lower()처럼 메서드를 연달아 호출할 수 있습니다. 앞 메서드의 결과에 다음 메서드를 적용하는 것으로, 이를 메서드 체이닝이라 합니다.
in으로 포함 여부 확인
어떤 글자(또는 부분 문자열)가 들어 있는지 in으로 확인할 수 있습니다. 결과는 True/False입니다 (다음 장 주제!).
s = "Python" print("th" in s) # True print("z" in s) # False print("PY" in s.upper()) # True
⭐ f-string: 가장 파이썬다운 출력
값을 문자열 사이사이에 끼워 넣을 때, 앞서 본 +나 str()은 번거롭습니다. Python 3.6부터 도입된 f-string이 정답입니다.
문자열 앞에 f를 붙이고, 끼워 넣을 값을 { }로 감싸면 됩니다.
name = "민지" age = 25 print(f"{name}님은 {age}살입니다") # 출력: 민지님은 25살입니다
{ } 안에는 식(expression)도 넣을 수 있습니다. 계산도 즉석에서 됩니다.
price = 1500 qty = 3 print(f"총액: {price * qty}원") # 총액: 4500원 print(f"내년이면 {age + 1}살") # 내년이면 26살
f-string 서식 지정
{값:서식} 형태로 출력 형태를 다듬을 수 있습니다.
pi = 3.14159 print(f"{pi:.2f}") # 3.14 (소수점 둘째 자리까지) print(f"{1000000:,}") # 1,000,000 (천 단위 쉼표) print(f"{0.25:.0%}") # 25% (백분율) print(f"{'hi':>10}") # ' hi' (오른쪽 정렬, 폭 10)
| 서식 | 의미 | 예 |
|---|---|---|
:.2f | 소수점 2자리 실수 | 3.14159 → 3.14 |
:, | 천 단위 구분 쉼표 | 1000000 → 1,000,000 |
:.0% | 백분율 (소수점 0자리) | 0.25 → 25% |
:>10 / :<10 / :^10 | 폭 10에 우/좌/가운데 정렬 | — |
f"{변수 = }"처럼 등호를 넣으면 변수명 = 값을 한 번에 보여줍니다. 값 확인할 때 아주 유용합니다.```python
total = 4500
print(f"{total = }") # total = 4500
```
(이
= 표기는 Python 3.8부터 가능합니다.)+와 str()을 줄줄이 쓰는 방식은 잊어도 좋다.특수 문자 (이스케이프)
줄바꿈이나 탭처럼 키보드로 바로 못 치는 문자는 백슬래시 \로 표현합니다.
| 표기 | 의미 |
|---|---|
\n | 줄바꿈 |
\t | 탭 |
\" | 큰따옴표 (문자열 안에서) |
\\ | 백슬래시 자체 |
print("첫째 줄\n둘째 줄") # 출력: # 첫째 줄 # 둘째 줄 print("이름\t나이") # 이름과 나이 사이에 탭 print("그는 \"hi\"라고 했다") # 그는 "hi"라고 했다
input(): 사용자에게 입력받기
지금까지는 우리가 값을 직접 적었습니다. input()을 쓰면 프로그램이 실행 중에 사용자에게 값을 물어볼 수 있습니다.
name = input("이름을 입력하세요: ") print(f"안녕하세요, {name}님!")
실행하면 이렇게 동작합니다 (밑줄 친 부분이 사용자 입력).
이름을 입력하세요: 민지 안녕하세요, 민지님!
input()은 사용자가 무엇을 입력하든 항상 문자열로 돌려줍니다. 숫자를 입력해도 문자열입니다! 그래서 계산하려면 반드시 int()나 float()로 변환해야 합니다.```python
age = input("나이: ") # 사용자가 "20"을 입력해도 age는 문자열 "20"
# print(age + 1) # ❌ TypeError! 문자열 + 정수
age = int(age) # ✅ 정수로 변환
print(f"내년이면 {age + 1}살")
```
흔히 입력받자마자 바로 변환합니다.
age = int(input("나이를 입력하세요: ")) # 입력받아 곧장 정수로 변환 print(f"10년 후엔 {age + 10}살이 되시는군요!")
flowchart LR
User([👤 사용자 입력<br/>"20"]):::user --> Input["input()"]:::proc
Input -->|항상 문자열 '20'| Cast["int()"]:::proc
Cast -->|정수 20| Calc["계산 가능 ✅"]:::result
classDef user fill:#fff3b0,stroke:#e0a800,color:#5c4500
classDef proc fill:#7fd8d8,stroke:#2a9d8f,color:#14532d
classDef result fill:#b8e6c1,stroke:#34a853,color:#14532d
나쁜 예 ❌ vs 좋은 예 ✅
name = "민지" age = 25 # ❌ 나쁜 예: + 와 str()로 줄줄이 잇기 print("저는 " + name + "이고 " + str(age) + "살입니다") # ✅ 좋은 예: f-string print(f"저는 {name}이고 {age}살입니다") # 둘 다: 저는 민지이고 25살입니다
이 장에서 배운 것
- 문자열은 따옴표로 감싼 글자 묶음.
+로 잇고*로 반복한다. 여러 줄은"""...""". - 인덱싱(
s[0],s[-1])으로 한 글자, 슬라이싱(s[0:3])으로 여러 글자를 꺼낸다. 슬라이싱의 끝은 미포함. - 자주 쓰는 메서드:
.upper()·.lower()·.strip()·.replace()·.split()·.join().in으로 포함 여부 확인. - f-string(
f"{값}")이 값 삽입의 표준이다.:.2f,:,같은 서식으로 모양을 다듬는다. input()은 항상 문자열을 돌려준다. 숫자로 쓰려면int()/float()로 변환해야 한다.
🧪 실습 문제
문제 1. s = "Programming"일 때 다음을 예상하세요.
s[0] s[-1] s[0:4] len(s)
문제 2. 이름과 좋아하는 숫자를 입력받아 민지님이 좋아하는 숫자의 두 배는 14입니다 형태로 출력하는 프로그램을 작성하세요. (입력: 이름 민지, 숫자 7)
문제 3. 다음 코드의 출력은?
text = " Hello, World " print(text.strip().upper())
문제 4. 날짜 문자열 "2025-12-31"을 .split("-")로 쪼갠 뒤, f-string으로 2025년 12월 31일 형태로 출력하세요. (힌트: 쪼갠 결과를 인덱스로 꺼내면 parts[0], parts[1], parts[2])
<details>
<summary>✅ 정답·해설 보기</summary>
1.
s[0]→"P"s[-1]→"g"s[0:4]→"Prog"(0,1,2,3번)len(s)→11
2.
name = input("이름: ") num = int(input("좋아하는 숫자: ")) print(f"{name}님이 좋아하는 숫자의 두 배는 {num * 2}입니다")
3. HELLO, WORLD. .strip()으로 양끝 공백을 없애고 .upper()로 대문자화. (가운데 공백은 그대로 유지됩니다.)
4.
date = "2025-12-31" parts = date.split("-") print(f"{parts[0]}년 {parts[1]}월 {parts[2]}일") # 2025년 12월 31일
</details>
◀️ 이전 장: 03. 숫자와 연산자 | ▶️ 다음 장: 05. 불리언과 비교