Skip to content

Latest commit

 

History

History

Folders and files

README.md

step02_operator — 아스키 코드 · 형변환 · 입력

학습 순서 2번. 프로그램이 바깥에서 값을 받기 시작합니다.

학습 목표

  • 문자와 숫자가 컴퓨터 안에서 어떻게 연결되는지 안다 (ord / chr)
  • 형변환 함수 int() · float() · str() 를 쓰고 type() 으로 확인한다
  • input() 은 무엇을 입력하든 항상 문자열을 돌려준다는 것을 안다
  • 실수를 정수로 바꿀 때 무슨 일이 일어나는지 안다

파일 지도

파일 내용
asciiCode.py ord() / chr() — 문자 ↔ 숫자
parseInt.py ★ int() 변환, type() 확인, + 의 두 가지 의미
castingEx.py 실수 → 정수 절삭, (주석) 총점·평균 계산
inputTest1.py input() 기본 — 이름·성별·나이·신장·체중
inputTest2.py 연습문제 — 두 수를 입력받아 더하기

실행 방법

python3 step02_operator/asciiCode.py     # 입력 불필요
python3 step02_operator/parseInt.py      # 입력 불필요
python3 step02_operator/castingEx.py     # 입력 불필요

python3 step02_operator/inputTest1.py    # ← 프롬프트가 뜹니다
python3 step02_operator/inputTest2.py    # ← 프롬프트가 뜹니다

짚고 갈 지점

+ 는 상황에 따라 뜻이 달라진다

parseInt.py 가 이 챕터의 핵심입니다.

a = '100'      # 문자열
b = '200'
a1 = int(a)    # 숫자 100
b1 = int(b)

print(a + b)     # 100200  ← 이어 붙이기
print(a1 + b1)   # 300     ← 더하기

같은 + 인데 결과가 다릅니다. 파이썬은 좌우 값의 타입을 보고 무슨 일을 할지 정합니다. 문자열이면 이어 붙이고, 숫자면 더합니다.

그래서 항상 type() 으로 확인하는 습관이 필요합니다.

print(type(a))    # <class 'str'>
print(type(a1))   # <class 'int'>

input() 은 무조건 문자열을 준다

age1 = int(input('나이를 입력하세요 : '))   # 숫자로 바꿔서 받는다
age2 = input('나이를 입력하세요 : ')        # 문자열 그대로 받는다

inputTest1.py 는 나이를 두 번 물어봅니다. 같은 값을 넣어도 하나는 숫자, 하나는 문자열입니다. 출력 방식도 달라집니다.

print('나이는 ', age1, '세입니다')      # , 는 타입 안 가림
print('나이는 ' + age2 + '세입니다')    # + 는 문자열이라 가능

age1 을 + 로 이으려 하면 TypeError 가 납니다. 직접 해 보세요.

parseInt.py 의 주석이 요점을 짚습니다 — "키보드 파일 웹에서 읽어오는 데이터는 모두 문자열". 바깥에서 들어오는 값은 일단 전부 문자열이고, 계산하려면 변환해야 합니다.

실수를 정수로 바꾸면 버림이다

pay = 857650
tax = 0.088
rPay = pay - (pay * tax)

print("실 수령액 : ", rPay)        # 781677.2
print("실 수령액 : ", int(rPay))   # 781677   ← 반올림이 아니라 버림

int() 는 소수점 아래를 그냥 잘라 냅니다. 반올림이 필요하면 round() 를 씁니다. 돈 계산에서 이 차이는 중요합니다.

문자열 안의 숫자는 한 번에 정수가 안 될 수 있다

castingEx.py 의 주석에 있는 줄입니다.

c = '73.45'
print(int(c))          # ValueError!
print(int(float(c)))   # 73  ← 실수로 먼저 바꾼 뒤 정수로

int() 는 "정수처럼 생긴 문자열"만 받습니다. 소수점이 있으면 float() 를 거쳐야 합니다.

아스키 코드

print(ord('A'))   # 65   문자 → 숫자
print(chr(65))    # A    숫자 → 문자

'A' 는 65, 'a' 는 97입니다. 대소문자 차이가 정확히 32라는 걸 확인해 보세요.

asciiCode.py 에 주석 처리된 print(chr('A')+1) 이 있습니다. chr() 는 숫자를 받는데 문자를 넘겨서 에러가 납니다. 왜 안 되는지 생각해 보세요.

지금은 이렇게 바뀌었습니다

  • 출력은 f-string이 편합니다.

    print(f'이름은 {name}입니다')
    print(f'실 수령액 : {rPay:,.0f}원')    # 781,677원 — 천 단위 쉼표까지
  • input() 을 int() 로 감싸면 사용자가 숫자가 아닌 걸 넣었을 때 ValueError 로 프로그램이 죽습니다. 실무에서는 try/except 로 감싸 다시 묻습니다.

    while True:
        try:
            age = int(input('나이 : '))
            break
        except ValueError:
            print('숫자를 입력하세요.')
  • 아스키(7비트)는 영어만 담습니다. 한글을 포함한 지금의 표준은 유니코드이고, 파이썬 3의 문자열은 처음부터 유니코드입니다. ord('가') 를 찍어 보면 65보다 훨씬 큰 값이 나옵니다.

연습 과제

  1. inputTest1.py 에서 print('나이는 ' + age1 + '세입니다') 를 시도해 TypeError 를 직접 보세요.
  2. castingEx.py 의 주석 처리된 총점·평균 블록을 살려 실행하세요.
  3. inputTest2.py 에 사칙연산을 전부 추가하세요. 나눗셈에서 0 을 입력하면 어떻게 되나요?
  4. 위 3번의 ZeroDivisionError 와 숫자가 아닌 입력의 ValueError 를 try/except 로 각각 다르게 처리하세요.
  5. ord('가') 와 ord('힣') 를 출력하고, 그 사이에 한글 글자가 몇 개 있는지 계산하세요.