2회차: 연산자 & 문자열
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. 기본 연산 예시
1a = 102b = 33
4print("더하기:", a + b)5print("빼기:", a - b)6print("곱하기:", a * b)7print("나누기:", a / b)8print("몫:", a // b)9print("나머지:", a % b)10print("거듭제곱:", 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제곱이다. |
실행 결과
1더하기: 132빼기: 73곱하기: 304나누기: 3.33333333333333355몫: 36나머지: 17거듭제곱: 10002.1.4. // 와 % 를 실생활에서 이해하기
예를 들어, 사탕 13개를 4명에게 나눠줄 때를 생각한다.
13 // 4 = 3→ 한 사람당 3개씩 받는다.13 % 4 = 1→ 나눠주고 남은 사탕이 1개이다.
1candy = 132people = 43
4each = candy // people5left = candy % people6
7print("한 명당:", each, "개")8print("남은 개수:", left, "개")| 줄 | 설명 |
|---|---|
| 1~2 | 총 사탕 개수와 사람 수를 변수에 저장한다. |
| 4 | // 연산자로 한 명당 받을 사탕 수(몫)를 계산한다. |
| 5 | % 연산자로 나눠주고 남은 사탕 수(나머지)를 계산한다. |
| 7~8 | 계산 결과를 출력한다. |
실행 결과
1한 명당: 3 개2남은 개수: 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로 나눠서 저장 |
1hp = 1002print("초기 HP:", hp)3
4hp -= 305print("데미지 30 받은 후:", hp)6
7hp += 208print("포션 사용 후:", hp)| 줄 | 설명 |
|---|---|
| 1 | 초기 체력을 100 으로 설정한다. |
| 4 | hp -= 30 은 hp = hp - 30 과 같다. 체력이 100 - 30 = 70 이 된다. |
| 7 | hp += 20 은 hp = hp + 20 과 같다. 체력이 70 + 20 = 90 이 된다. |
실행 결과
1초기 HP: 1002데미지 30 받은 후: 703포션 사용 후: 902.1.6. 예제: RPG 데미지 계산기
1atk = 502def_val = 203bonus = 1.54
5dmg = (atk - def_val) * bonus6print("최종 데미지:", dmg)| 줄 | 설명 |
|---|---|
| 1 | 공격력(atk)을 50 으로 설정한다. |
| 2 | 방어력(def_val)을 20 으로 설정한다. |
| 3 | 보너스(bonus) 배율을 1.5 로 설정한다. |
| 5 | 괄호 안을 먼저 계산한다. 50 - 20 = 30. 그 다음 30 * 1.5 = 45.0 이다. 계산 순서는 수학과 동일하다. |
| 6 | 최종 데미지를 출력한다. |
실행 결과
1최종 데미지: 45.02.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. 비교 연산자 사용 예시
1score = 752
3print(score == 100)4print(score != 100)5print(score >= 60)6print(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 를 출력한다. |
실행 결과
1False2True3True4False2.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 이다.
1hp = 802mp = 303
4can_attack = hp > 0 and mp >= 105print("공격 가능 여부:", can_attack)| 줄 | 설명 |
|---|---|
| 1~2 | 체력과 마나를 설정한다. |
| 4 | hp > 0 은 True, mp >= 10 은 True 이다. 둘 다 True 이므로 결과는 True 이다. |
| 5 | True 를 출력한다. |
실행 결과
1공격 가능 여부: True2.3.3. or 연산자
두 조건 중 하나라도 참(True)이면 결과가 True 이다.
1has_sword = False2has_staff = True3
4can_fight = has_sword or has_staff5print("전투 가능 여부:", can_fight)| 줄 | 설명 |
|---|---|
| 1~2 | 검 보유(False)와 지팡이 보유(True)를 설정한다. |
| 4 | False or True → 하나라도 참이면 결과는 True 이다. |
| 5 | True 를 출력한다. |
2.3.4. not 연산자
not 은 True 를 False 로, False 를 True 로 반전시킨다.
1is_game_over = False2
3print("게임 계속 가능:", not is_game_over)| 줄 | 설명 |
|---|---|
| 1 | 게임 오버 상태를 False 로 설정한다. |
| 3 | not False 는 True 이다. 게임이 아직 끝나지 않았으므로 계속 플레이할 수 있다. |
실행 결과
1게임 계속 가능: True2.4. 문자열(String) 다루기
2.4.1. 문자열 연결 — + 연산자
두 문자열을 + 로 이어 붙일 수 있다.
1first = "파이"2second = "썬"3full = first + second4
5print(full)6print("안녕" + " " + "세상!")| 줄 | 설명 |
|---|---|
| 1~2 | 두 문자열 변수를 선언한다. |
| 3 | + 로 두 문자열을 이어 붙여 "파이썬" 을 만든다. |
| 4 | 결합된 문자열을 출력한다. |
| 5 | 세 문자열을 이어 붙인다. 중간에 공백 " " 을 넣었다. |
실행 결과
1파이썬2안녕 세상!주의
+ 로는 문자열끼리만 연결할 수 있다. 문자열과 숫자를 + 로 연결하면 오류가 발생한다. 숫자를 문자열로 연결하려면 str() 로 변환해야 한다.
1name = "홍길동"2score = 853
4# 오류 발생 예시 (실행하지 말 것)5# print(name + "의 점수는 " + score) ← 오류!6
7# 올바른 방법8print(name + "의 점수는 " + str(score))| 줄 | 설명 |
|---|---|
| 6 | 주석(#)으로 시작하는 줄은 실행되지 않는다. 설명을 적을 때 사용한다. |
| 9 | str(score) 로 숫자 85 를 문자열 "85" 로 변환한 뒤 연결한다. |
실행 결과
1홍길동의 점수는 852.4.2. 문자열 반복 — * 연산자
문자열에 * 와 정수를 사용하면 그 문자열이 반복된다.
1line = "-" * 202star = "★" * 53
4print(line)5print(star)6print("박수" * 3)| 줄 | 설명 |
|---|---|
| 1 | "-" 를 20번 반복한 문자열을 line 에 저장한다. |
| 2 | "★" 를 5번 반복한 문자열을 star 에 저장한다. |
| 4~6 | 각 결과를 출력한다. |
실행 결과
1--------------------2★★★★★3박수박수박수2.4.3. 문자열 길이 — len() 함수
len() 함수는 문자열에 포함된 글자의 수를 반환한다.
1word = "파이썬"2msg = "Hello, Python!"3
4print(len(word))5print(len(msg))| 줄 | 설명 |
|---|---|
| 1 | 한글 3글자 문자열을 저장한다. |
| 2 | 영문, 기호, 공백이 포함된 문자열을 저장한다. |
| 4 | "파이썬" 은 3글자이므로 3 을 출력한다. |
| 5 | "Hello, Python!" 은 공백과 기호 포함 14글자이므로 14 를 출력한다. |
실행 결과
132142.4.4. 문자열 인덱싱 — 특정 글자 꺼내기
문자열의 각 글자에는 순서를 나타내는 번호(인덱스)가 있다. 인덱스는 0부터 시작한다.
1문자열: P y t h o n2인덱스: 0 1 2 3 4 51word = "Python"2
3print(word[0])4print(word[1])5print(word[5])6print(word[-1])| 줄 | 설명 |
|---|---|
| 1 | 문자열 "Python" 을 저장한다. |
| 3 | word[0] 은 첫 번째 글자 P 이다. |
| 4 | word[1] 은 두 번째 글자 y 이다. |
| 5 | word[5] 는 여섯 번째 글자 n 이다. |
| 6 | word[-1] 은 뒤에서 첫 번째 글자 n 이다. 음수 인덱스는 뒤에서부터 센다. |
실행 결과
1P2y3n4n2.4.5. 문자열 슬라이싱 — 일부분 잘라내기
[시작:끝] 형식으로 문자열의 일부분을 잘라낼 수 있다. 끝 인덱스의 글자는 포함되지 않는다.
1word = "Hello, Python!"2
3print(word[0:5])4print(word[7:13])5print(word[:5])6print(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!" 이다. 끝을 생략하면 마지막까지이다. |
실행 결과
1Hello2Python3Hello4Python!2.4.6. 주요 문자열 메서드(Method)
메서드(Method)는 특정 자료형에서 사용할 수 있는 함수이다. 변수.메서드명() 형식으로 사용한다.
1s = " Hello, Python! "2
3print(s.strip())4print(s.lower())5print(s.upper())6print(s.replace("Python", "파이썬"))7print(s.count("l"))8print(s.find("Python"))| 줄 | 설명 |
|---|---|
| 3 | strip() 메서드로 문자열 앞뒤의 공백을 모두 제거한다. |
| 4 | lower() 메서드로 모든 영문자를 소문자로 바꾼다. |
| 5 | upper() 메서드로 모든 영문자를 대문자로 바꾼다. |
| 6 | replace("Python", "파이썬") 메서드로 "Python" 을 "파이썬" 으로 교체한다. |
| 7 | count("l") 메서드로 문자열 안에 "l" 이 몇 번 나오는지 센다. |
| 8 | find("Python") 메서드로 "Python" 이 시작되는 위치(인덱스)를 반환한다. |
실행 결과
1Hello, Python!2 hello, python!3 HELLO, PYTHON!4 Hello, 파이썬!53692.5. f-string(에프 스트링)
2.5.1. f-string이란?
f-string(에프 스트링)은 문자열 안에 변수나 계산식을 {} 로 삽입하는 방법이다. 문자열 앞에 f 를 붙이면 된다. 기존의 + 연결 방식보다 훨씬 읽기 쉽다.
기존 방식 (불편하다)
1name = "홍길동"2score = 853print("이름: " + name + ", 점수: " + str(score) + "점")f-string 방식 (편리하다)
1name = "홍길동"2score = 853print(f"이름: {name}, 점수: {score}점")| 방식 | 가독성 |
|---|---|
+ 연결 | "이름: " + name + ", 점수: " + str(score) + "점" 복잡하다 |
| f-string | f"이름: {name}, 점수: {score}점" 깔끔하다 |
2.5.2. f-string 기본 사용법
1hero = "전사"2lv = 253hp = 9804
5msg = f"직업: {hero} | 레벨: {lv} | 체력: {hp}"6print(msg)| 줄 | 설명 |
|---|---|
| 1~3 | 캐릭터 정보를 변수에 저장한다. |
| 5 | 문자열 앞에 f 를 붙이고, 변수를 삽입할 위치에 {변수명} 을 쓴다. |
| 6 | 완성된 문자열을 출력한다. 각 {} 자리에 변수의 값이 들어간다. |
실행 결과
1직업: 전사 | 레벨: 25 | 체력: 9802.5.3. f-string 안에서 계산하기
{} 안에는 변수뿐 아니라 계산식도 넣을 수 있다.
1a = 102b = 33
4print(f"{a} + {b} = {a + b}")5print(f"{a} * {b} = {a * b}")6print(f"{a} / {b} = {a / b}")| 줄 | 설명 |
|---|---|
| 4 | {a + b} 는 10 + 3 = 13 으로 자동 계산된다. |
| 5 | {a * b} 는 10 * 3 = 30 으로 자동 계산된다. |
| 6 | {a / b} 는 10 / 3 = 3.333... 으로 자동 계산된다. |
실행 결과
110 + 3 = 13210 * 3 = 30310 / 3 = 3.33333333333333352.5.4. 소수점 자릿수 지정하기
실수를 출력할 때 소수점 아래 자리수를 제한할 수 있다. {변수:.자릿수f} 형식을 사용한다.
1pi = 3.1415926535897932
3print(f"원주율: {pi}")4print(f"소수점 2자리: {pi:.2f}")5print(f"소수점 4자리: {pi:.4f}")| 줄 | 설명 |
|---|---|
| 3 | 소수점 자릿수를 제한하지 않고 출력한다. |
| 4 | :.2f 는 소수점 아래 2자리까지만 출력하라는 의미이다. |
| 5 | :.4f 는 소수점 아래 4자리까지만 출력하라는 의미이다. |
실행 결과
1원주율: 3.1415926535897932소수점 2자리: 3.143소수점 4자리: 3.14162.6. 종합 예제: 쇼핑 계산기
1item1 = "라면"2price1 = 8003qty1 = 34
5item2 = "과자"6price2 = 15007qty2 = 28
9total1 = price1 * qty110total2 = price2 * qty211grand = total1 + total212
13print("========== 영수증 ==========")14print(f"{item1} {price1}원 × {qty1}개 = {total1}원")15print(f"{item2} {price2}원 × {qty2}개 = {total2}원")16print("----------------------------")17print(f"합계: {grand}원")18print("============================")| 줄 | 설명 |
|---|---|
| 1~3 | 첫 번째 상품의 이름, 단가, 수량을 저장한다. |
| 5~7 | 두 번째 상품의 이름, 단가, 수량을 저장한다. |
| 9 | price1 * qty1 = 800 * 3 = 2400 으로 첫 번째 상품의 소계를 계산한다. |
| 10 | price2 * qty2 = 1500 * 2 = 3000 으로 두 번째 상품의 소계를 계산한다. |
| 11 | 두 소계를 더하여 합계를 구한다. |
| 13~18 | f-string을 사용하여 영수증 형식으로 출력한다. |
실행 결과
1========== 영수증 ==========2라면 800원 × 3개 = 2400원3과자 1500원 × 2개 = 3000원4----------------------------5합계: 5400원6============================2.7. 실습 과제
과제 1. 나이 계산기
태어난 연도를 input() 으로 입력받아 올해 나이를 계산하여 출력한다. 현재 연도는 변수에 저장하여 사용한다.
1태어난 연도를 입력하세요: 20002현재 연도: 20253나이: 25세1birth = int(input("태어난 연도를 입력하세요: "))2now = 20253
4age = now - birth5print(f"현재 연도: {now}")6print(f"나이: {age}세")과제 2. RPG 스탯 계산기
공격력(atk), 방어력(def_val), 속도(spd) 를 각각 변수에 저장하고, 총 전투력(power = atk * 2 + def_val + spd * 3)을 계산하여 f-string으로 출력한다.
1atk = 802def_val = 503spd = 404
5power = atk * 2 + def_val + spd * 36print(f"공격력: {atk}")7print(f"방어력: {def_val}")8print(f"속도: {spd}")9print(f"총 전투력: {power}")