2회차: 연산자 & 문자열
코드 블록의 Try it Yourself 버튼으로 직접 실행할 수 있다.
구문
2회차: 연산자 & 문자열
선수 학습: 1회차 (변수와 자료형)
학습 목표
- 산술(Arithmetic) 연산자를 사용할 수 있다.
- 비교(Comparison) 연산자와 논리(Logical) 연산자를 이해한다.
- 문자열을 다양한 방법으로 조작할 수 있다.
- f-string(에프 스트링)을 사용하여 깔끔하게 출력할 수 있다.
2.1. 산술(Arithmetic) 연산자
2.1.1. 연산자란?
연산자(Operator)는 계산을 수행하는 기호이다. 수학에서 +, -, ×, ÷ 를 사용하듯이, 파이썬에서도 비슷한 기호들을 사용한다.
2.1.2. 기본 연산자 종류
| 연산자 | 의미 | 예시 | 결과 |
|---|---|---|---|
+ | 더하기 | 3 + 2 | 5 |
- | 빼기 | 3 - 2 | 1 |
* | 곱하기 | 3 * 2 | 6 |
/ | 나누기 | 7 / 2 | 3.5 |
// | 몫 (나눗셈의 정수 부분) | 7 // 2 | 3 |
% | 나머지 | 7 % 2 | 1 |
** | 거듭제곱 | 2 ** 3 | 8 |
/ 는 항상 실수(float)를 반환한다. 4 / 2 의 결과는 2 가 아닌 2.0 이다. 정수 결과가 필요하면 // 를 사용한다.
2.1.3. 기본 연산 예시
a = 10
b = 3
print("더하기:", a + b)
print("빼기:", a - b)
print("곱하기:", a * b)
print("나누기:", a / b)
print("몫:", a // b)
print("나머지:", a % b)
print("거듭제곱:", a ** b)
| 줄 | 설명 |
|---|---|
| 1~2 | 두 정수 변수 a, b 를 선언한다. |
| 4 | 10 + 3 = 13 을 출력한다. |
| 5 | 10 - 3 = 7 을 출력한다. |
| 6 | 10 * 3 = 30 을 출력한다. |
| 7 | 10 / 3 = 3.333... 을 출력한다. 결과는 실수이다. |
| 8 | 10 // 3 = 3 을 출력한다. 소수점 아래는 버린다. |
| 9 | 10 % 3 = 1 을 출력한다. 10을 3으로 나누면 몫 3, 나머지 1이다. |
| 10 | 10 ** 3 = 1000 을 출력한다. 10의 3제곱이다. |
실행 결과
더하기: 13
빼기: 7
곱하기: 30
나누기: 3.3333333333333335
몫: 3
나머지: 1
거듭제곱: 1000
2.1.4. // 와 % 를 실생활에서 이해하기
예를 들어, 사탕 13개를 4명에게 나눠줄 때를 생각한다.
13 // 4 = 3→ 한 사람당 3개씩 받는다.13 % 4 = 1→ 나눠주고 남은 사탕이 1개이다.
candy = 13
people = 4
each = candy // people
left = candy % people
print("한 명당:", each, "개")
print("남은 개수:", left, "개")
| 줄 | 설명 |
|---|---|
| 1~2 | 총 사탕 개수와 사람 수를 변수에 저장한다. |
| 4 | // 연산자로 한 명당 받을 사탕 수(몫)를 계산한다. |
| 5 | % 연산자로 나눠주고 남은 사탕 수(나머지)를 계산한다. |
| 7~8 | 계산 결과를 출력한다. |
실행 결과
한 명당: 3 개
남은 개수: 1 개
2.1.5. 복합 대입 연산자
변수에 연산을 적용하고 그 결과를 같은 변수에 저장하는 작업을 짧게 쓸 수 있다.
| 긴 표현 | 짧은 표현 | 의미 |
|---|---|---|
x = x + 5 | x += 5 | x에 5를 더해서 저장 |
x = x - 3 | x -= 3 | x에서 3을 빼서 저장 |
x = x * 2 | x *= 2 | x에 2를 곱해서 저장 |
x = x / 4 | x /= 4 | x를 4로 나눠서 저장 |
hp = 100
print("초기 HP:", hp)
hp -= 30
print("데미지 30 받은 후:", hp)
hp += 20
print("포션 사용 후:", hp)
| 줄 | 설명 |
|---|---|
| 1 | 초기 체력을 100 으로 설정한다. |
| 4 | hp -= 30 은 hp = hp - 30 과 같다. 체력이 100 - 30 = 70 이 된다. |
| 7 | hp += 20 은 hp = hp + 20 과 같다. 체력이 70 + 20 = 90 이 된다. |
실행 결과
초기 HP: 100
데미지 30 받은 후: 70
포션 사용 후: 90
2.1.6. 예제: RPG 데미지 계산기
atk = 50
def_val = 20
bonus = 1.5
dmg = (atk - def_val) * bonus
print("최종 데미지:", dmg)
| 줄 | 설명 |
|---|---|
| 1 | 공격력(atk)을 50 으로 설정한다. |
| 2 | 방어력(def_val)을 20 으로 설정한다. |
| 3 | 보너스(bonus) 배율을 1.5 로 설정한다. |
| 5 | 괄호 안을 먼저 계산한다. 50 - 20 = 30. 그 다음 30 * 1.5 = 45.0 이다. 계산 순서는 수학과 동일하다. |
| 6 | 최종 데미지를 출력한다. |
실행 결과
최종 데미지: 45.0
2.2. 비교(Comparison) 연산자
2.2.1. 비교 연산자란?
비교 연산자는 두 값을 비교하여 결과로 True (참) 또는 False (거짓)을 반환한다. 3회차에서 배울 조건문과 함께 자주 사용된다.
| 연산자 | 의미 | 예시 | 결과 |
|---|---|---|---|
== | 같다 | 3 == 3 | True |
!= | 다르다 | 3 != 4 | True |
> | 크다 | 5 > 3 | True |
< | 작다 | 5 < 3 | False |
>= | 크거나 같다 | 3 >= 3 | True |
<= | 작거나 같다 | 2 <= 3 | True |
= 는 "저장하라"는 의미이고, == 는 "같은지 비교하라"는 의미이다. 헷갈리지 않도록 주의한다.
2.2.2. 비교 연산자 사용 예시
score = 75
print(score == 100)
print(score != 100)
print(score >= 60)
print(score < 50)
| 줄 | 설명 |
|---|---|
| 1 | 변수 score 에 75 를 저장한다. |
| 3 | 75 == 100 → 같지 않으므로 False 를 출력한다. |
| 4 | 75 != 100 → 다르므로 True 를 출력한다. |
| 5 | 75 >= 60 → 75는 60보다 크므로 True 를 출력한다. |
| 6 | 75 < 50 → 75는 50보다 크므로 False 를 출력한다. |
실행 결과
False
True
True
False
2.3. 논리(Logical) 연산자
2.3.1. 논리 연산자란?
논리 연산자는 두 개 이상의 조건을 조합할 때 사용한다.
| 연산자 | 의미 | 예시 | 결과 |
|---|---|---|---|
and | 둘 다 True 여야 True | True and False | False |
or | 하나라도 True 이면 True | True or False | True |
not | True ↔ False 반전 | not True | False |
2.3.2. and 연산자
두 조건이 모두 참(True)일 때만 결과가 True 이다.
hp = 80
mp = 30
can_attack = hp > 0 and mp >= 10
print("공격 가능 여부:", can_attack)
| 줄 | 설명 |
|---|---|
| 1~2 | 체력과 마나를 설정한다. |
| 4 | hp > 0 은 True, mp >= 10 은 True 이다. 둘 다 True 이므로 결과는 True 이다. |
| 5 | True 를 출력한다. |
실행 결과
공격 가능 여부: True
2.3.3. or 연산자
두 조건 중 하나라도 참(True)이면 결과가 True 이다.
has_sword = False
has_staff = True
can_fight = has_sword or has_staff
print("전투 가능 여부:", can_fight)
| 줄 | 설명 |
|---|---|
| 1~2 | 검 보유(False)와 지팡이 보유(True)를 설정한다. |
| 4 | False or True → 하나라도 참이면 결과는 True 이다. |
| 5 | True 를 출력한다. |
2.3.4. not 연산자
not 은 True 를 False 로, False 를 True 로 반전시킨다.
is_game_over = False
print("게임 계속 가능:", not is_game_over)
| 줄 | 설명 |
|---|---|
| 1 | 게임 오버 상태를 False 로 설정한다. |
| 3 | not False 는 True 이다. 게임이 아직 끝나지 않았으므로 계속 플레이할 수 있다. |
실행 결과
게임 계속 가능: True
2.4. 문자열(String) 다루기
2.4.1. 문자열 연결 — + 연산자
두 문자열을 + 로 이어 붙일 수 있다.
first = "파이"
second = "썬"
full = first + second
print(full)
print("안녕" + " " + "세상!")
| 줄 | 설명 |
|---|---|
| 1~2 | 두 문자열 변수를 선언한다. |
| 3 | + 로 두 문자열을 이어 붙여 "파이썬" 을 만든다. |
| 4 | 결합된 문자열을 출력한다. |
| 5 | 세 문자열을 이어 붙인다. 중간에 공백 " " 을 넣었다. |
실행 결과
파이썬
안녕 세상!
+ 로는 문자열끼리만 연결할 수 있다. 문자열과 숫자를 + 로 연결하면 오류가 발생한다. 숫자를 문자열로 연결하려면 str() 로 변환해야 한다.
name = "홍길동"
score = 85
# 오류 발생 예시 (실행하지 말 것)
# print(name + "의 점수는 " + score) ← 오류!
# 올바른 방법
print(name + "의 점수는 " + str(score))
| 줄 | 설명 |
|---|---|
| 6 | 주석(#)으로 시작하는 줄은 실행되지 않는다. 설명을 적을 때 사용한다. |
| 9 | str(score) 로 숫자 85 를 문자열 "85" 로 변환한 뒤 연결한다. |
실행 결과
홍길동의 점수는 85
2.4.2. 문자열 반복 — * 연산자
문자열에 * 와 정수를 사용하면 그 문자열이 반복된다.
line = "-" * 20
star = "★" * 5
print(line)
print(star)
print("박수" * 3)
| 줄 | 설명 |
|---|---|
| 1 | "-" 를 20번 반복한 문자열을 line 에 저장한다. |
| 2 | "★" 를 5번 반복한 문자열을 star 에 저장한다. |
| 4~6 | 각 결과를 출력한다. |
실행 결과
--------------------
★★★★★
박수박수박수
2.4.3. 문자열 길이 — len() 함수
len() 함수는 문자열에 포함된 글자의 수를 반환한다.
word = "파이썬"
msg = "Hello, Python!"
print(len(word))
print(len(msg))
| 줄 | 설명 |
|---|---|
| 1 | 한글 3글자 문자열을 저장한다. |
| 2 | 영문, 기호, 공백이 포함된 문자열을 저장한다. |
| 4 | "파이썬" 은 3글자이므로 3 을 출력한다. |
| 5 | "Hello, Python!" 은 공백과 기호 포함 14글자이므로 14 를 출력한다. |
실행 결과
3
14
2.4.4. 문자열 인덱싱 — 특정 글자 꺼내기
문자열의 각 글자에는 순서를 나타내는 번호(인덱스)가 있다. 인덱스는 0부터 시작한다.
문자열: P y t h o n
인덱스: 0 1 2 3 4 5
word = "Python"
print(word[0])
print(word[1])
print(word[5])
print(word[-1])
| 줄 | 설명 |
|---|---|
| 1 | 문자열 "Python" 을 저장한다. |
| 3 | word[0] 은 첫 번째 글자 P 이다. |
| 4 | word[1] 은 두 번째 글자 y 이다. |
| 5 | word[5] 는 여섯 번째 글자 n 이다. |
| 6 | word[-1] 은 뒤에서 첫 번째 글자 n 이다. 음수 인덱스는 뒤에서부터 센다. |
실행 결과
P
y
n
n
2.4.5. 문자열 슬라이싱 — 일부분 잘라내기
[시작:끝] 형식으로 문자열의 일부분을 잘라낼 수 있다. 끝 인덱스의 글자는 포함되지 않는다.
word = "Hello, Python!"
print(word[0:5])
print(word[7:13])
print(word[:5])
print(word[7:])
| 줄 | 설명 |
|---|---|
| 3 | word[0:5] 는 인덱스 0~4까지, 즉 "Hello" 이다. 5는 포함되지 않는다. |
| 4 | word[7:13] 은 인덱스 7~12까지, 즉 "Python" 이다. |
| 5 | word[:5] 는 처음부터 인덱스 4까지, 즉 "Hello" 이다. 시작을 생략하면 0부터 시작한다. |
| 6 | word[7:] 는 인덱스 7부터 끝까지, 즉 "Python!" 이다. 끝을 생략하면 마지막까지이다. |
실행 결과
Hello
Python
Hello
Python!
2.4.6. 주요 문자열 메서드(Method)
메서드(Method)는 특정 자료형에서 사용할 수 있는 함수이다. 변수.메서드명() 형식으로 사용한다.
s = " Hello, Python! "
print(s.strip())
print(s.lower())
print(s.upper())
print(s.replace("Python", "파이썬"))
print(s.count("l"))
print(s.find("Python"))
| 줄 | 설명 |
|---|---|
| 3 | strip() 메서드로 문자열 앞뒤의 공백을 모두 제거한다. |
| 4 | lower() 메서드로 모든 영문자를 소문자로 바꾼다. |
| 5 | upper() 메서드로 모든 영문자를 대문자로 바꾼다. |
| 6 | replace("Python", "파이썬") 메서드로 "Python" 을 "파이썬" 으로 교체한다. |
| 7 | count("l") 메서드로 문자열 안에 "l" 이 몇 번 나오는지 센다. |
| 8 | find("Python") 메서드로 "Python" 이 시작되는 위치(인덱스)를 반환한다. |
실행 결과
Hello, Python!
hello, python!
HELLO, PYTHON!
Hello, 파이썬!
3
9
2.5. f-string(에프 스트링)
2.5.1. f-string이란?
f-string(에프 스트링)은 문자열 안에 변수나 계산식을 {} 로 삽입하는 방법이다. 문자열 앞에 f 를 붙이면 된다. 기존의 + 연결 방식보다 훨씬 읽기 쉽다.
기존 방식 (불편하다)
name = "홍길동"
score = 85
print("이름: " + name + ", 점수: " + str(score) + "점")
f-string 방식 (편리하다)
name = "홍길동"
score = 85
print(f"이름: {name}, 점수: {score}점")
| 방식 | 가독성 |
|---|---|
+ 연결 | "이름: " + name + ", 점수: " + str(score) + "점" 복잡하다 |
| f-string | f"이름: {name}, 점수: {score}점" 깔끔하다 |
2.5.2. f-string 기본 사용법
hero = "전사"
lv = 25
hp = 980
msg = f"직업: {hero} | 레벨: {lv} | 체력: {hp}"
print(msg)
| 줄 | 설명 |
|---|---|
| 1~3 | 캐릭터 정보를 변수에 저장한다. |
| 5 | 문자열 앞에 f 를 붙이고, 변수를 삽입할 위치에 {변수명} 을 쓴다. |
| 6 | 완성된 문자열을 출력한다. 각 {} 자리에 변수의 값이 들어간다. |
실행 결과
직업: 전사 | 레벨: 25 | 체력: 980
2.5.3. f-string 안에서 계산하기
{} 안에는 변수뿐 아니라 계산식도 넣을 수 있다.
a = 10
b = 3
print(f"{a} + {b} = {a + b}")
print(f"{a} * {b} = {a * b}")
print(f"{a} / {b} = {a / b}")
| 줄 | 설명 |
|---|---|
| 4 | {a + b} 는 10 + 3 = 13 으로 자동 계산된다. |
| 5 | {a * b} 는 10 * 3 = 30 으로 자동 계산된다. |
| 6 | {a / b} 는 10 / 3 = 3.333... 으로 자동 계산된다. |
실행 결과
10 + 3 = 13
10 * 3 = 30
10 / 3 = 3.3333333333333335
2.5.4. 소수점 자릿수 지정하기
실수를 출력할 때 소수점 아래 자리수를 제한할 수 있다. {변수:.자릿수f} 형식을 사용한다.
pi = 3.141592653589793
print(f"원주율: {pi}")
print(f"소수점 2자리: {pi:.2f}")
print(f"소수점 4자리: {pi:.4f}")
| 줄 | 설명 |
|---|---|
| 3 | 소수점 자릿수를 제한하지 않고 출력한다. |
| 4 | :.2f 는 소수점 아래 2자리까지만 출력하라는 의미이다. |
| 5 | :.4f 는 소수점 아래 4자리까지만 출력하라는 의미이다. |
실행 결과
원주율: 3.141592653589793
소수점 2자리: 3.14
소수점 4자리: 3.1416
2.6. 종합 예제: 쇼핑 계산기
item1 = "라면"
price1 = 800
qty1 = 3
item2 = "과자"
price2 = 1500
qty2 = 2
total1 = price1 * qty1
total2 = price2 * qty2
grand = total1 + total2
print("========== 영수증 ==========")
print(f"{item1} {price1}원 × {qty1}개 = {total1}원")
print(f"{item2} {price2}원 × {qty2}개 = {total2}원")
print("----------------------------")
print(f"합계: {grand}원")
print("============================")
| 줄 | 설명 |
|---|---|
| 1~3 | 첫 번째 상품의 이름, 단가, 수량을 저장한다. |
| 5~7 | 두 번째 상품의 이름, 단가, 수량을 저장한다. |
| 9 | price1 * qty1 = 800 * 3 = 2400 으로 첫 번째 상품의 소계를 계산한다. |
| 10 | price2 * qty2 = 1500 * 2 = 3000 으로 두 번째 상품의 소계를 계산한다. |
| 11 | 두 소계를 더하여 합계를 구한다. |
| 13~18 | f-string을 사용하여 영수증 형식으로 출력한다. |
실행 결과
========== 영수증 ==========
라면 800원 × 3개 = 2400원
과자 1500원 × 2개 = 3000원
----------------------------
합계: 5400원
============================
2.7. 실습 과제
과제 1. 나이 계산기
태어난 연도를 input() 으로 입력받아 올해 나이를 계산하여 출력한다. 현재 연도는 변수에 저장하여 사용한다.
태어난 연도를 입력하세요: 2000
현재 연도: 2025
나이: 25세
과제 2. RPG 스탯 계산기
공격력(atk), 방어력(def_val), 속도(spd) 를 각각 변수에 저장하고, 총 전투력(power = atk * 2 + def_val + spd * 3)을 계산하여 f-string으로 출력한다.