Python / str() / 자료형을 문자열로 변환하는 함수
Python의 str()은 객체를 사람이 읽을 수 있는 문자열로 표현하는 데 사용합니다. 숫자를 문자열과 연결하거나 결과를 변수에 보관할 때 유용하며, 원래 객체의 자료형을 바꾸는 대신 문자열 결과를 반환합니다. 다만 바이트 데이터를 문자로 해석하거나 JSON을 만들 때는 목적에 맞는 별도 처리가 필요합니다.
기본 사용법과 반환 자료형 확인
str(object)에 숫자·불리언 등 객체를 전달하면 str 객체를 반환하며, 인수를 생략한 str()은 빈 문자열을 만듭니다. 보통 객체의 __str__() 표현을 이용하므로 사용자 정의 클래스는 표시 내용을 바꿀 수 있습니다. 세부 동작은 Python str 자료형 공식 문서에서 확인할 수 있습니다.
아래 예제는 Python 3와 표준 라이브러리만 사용합니다. UTF-8로 str_example.py를 저장하고 터미널에서 python str_example.py로 실행합니다. 환경에 따라 명령 이름은 python3일 수 있습니다. 이후 예제도 같은 파일의 내용을 교체하여 독립적으로 실행할 수 있습니다.
number = 42
text = str(number)
print(number, type(number).__name__)
print(text, type(text).__name__)
print("ID-" + text)
print(repr(str()))
print(str(None))
예상 결과는 다음과 같습니다.
42 int
42 str
ID-42
''
None
두 값이 화면에는 모두 42로 보이지만 자료형은 다릅니다. number는 여전히 정수이며 text만 문자열입니다. repr()로 확인한 ''은 길이가 0인 문자열이고, str(None)은 빈 값이 아닌 문자 None을 만듭니다.
숫자 변환과 표시 서식은 구분합니다
str()은 숫자를 기본 문자열 표현으로 바꿀 뿐 소수점 자릿수나 통화 형식을 지정하지 않습니다. 소수점 아래 두 자리처럼 표시 규칙이 필요하면 서식 문자열인 f-string 등을 사용합니다.
price = 12.5
print(str(price))
print(f"{price:.2f}")
print("price=" + str(price))
12.5
12.50
price=12.5
12.50은 두 자리 표시를 적용한 문자열입니다. 원래 숫자 price를 변경하지 않으며, 화면 표시를 위한 반올림과 실제 계산 정확도는 별개의 문제입니다.
bytes를 텍스트로 읽으려면 디코딩합니다
bytes는 바이트 단위 데이터이고 str은 유니코드 문자열입니다. str(raw)만 호출하면 바이트 객체의 표시가 나오므로, 원래 문자를 얻으려면 실제 인코딩을 지정해 decode() 또는 str(raw, encoding)을 사용합니다.
raw = "café".encode("utf-8")
print(str(raw))
print(raw.decode("utf-8"))
print(str(raw, "utf-8"))
b'caf\xc3\xa9'
café
café
첫 줄의 b와 역슬래시 이스케이프는 바이트 객체의 표현입니다. 뒤의 두 줄만 UTF-8로 해석한 문자열입니다. 파일이나 응답의 실제 인코딩이 다르면 그 인코딩을 사용해야 하며, 오류를 없애려고 무조건 errors="ignore"를 지정하면 일부 데이터가 사라질 수 있습니다.
str(), repr(), JSON 중 무엇을 선택할까요?
str()은 읽기 위한 표시, repr()은 개발 중 객체 표현을 확인하는 데 주로 사용합니다. repr()도 모든 객체를 복원 가능한 코드로 만드는 기능은 아닙니다. 데이터 교환용 JSON이 필요하면 json.dumps()를 사용합니다. JSON은 JavaScript Object Notation의 약자로, 언어 간에 데이터를 주고받는 표준 텍스트 형식입니다.
import json
data = {"active": True, "count": 0}
print(str(data))
print(json.dumps(data))
print(str("hello\nworld"))
print(repr("hello\nworld"))
{'active': True, 'count': 0}
{"active": true, "count": 0}
hello
world
'hello\nworld'
딕셔너리의 str() 결과는 Python의 따옴표와 True 표기를 쓰므로 그대로 JSON이라고 가정하면 안 됩니다. 문자열의 줄바꿈은 str()로 출력하면 실제 줄을 바꾸지만, repr()은 \n처럼 이스케이프된 표현을 보여줍니다.
None을 빈 문자열로 바꿀 때 주의할 점
결측값인 None만 빈 문자열로 바꾸려면 is None으로 구분합니다. str(value or "")처럼 작성하면 0과 False까지 빈 문자열로 처리하므로 값이 달라질 수 있습니다.
for value in (None, 0, False):
text = "" if value is None else str(value)
print(repr(text))
''
'0'
'False'
문자열 연결과 디코딩 오류 해결
문자열에 숫자를 +로 바로 붙이면 TypeError가 발생합니다. 숫자를 str()로 바꾸거나 f-string으로 구성합니다. 바이트를 지정한 인코딩으로 해석할 수 없으면 UnicodeDecodeError가 발생하므로 원래 인코딩과 데이터가 완전한지 확인합니다.
try:
print("ID-" + 42)
except TypeError:
print("TypeError")
try:
str(b"\xff", "utf-8")
except UnicodeDecodeError:
print("UnicodeDecodeError")
TypeError
UnicodeDecodeError
마지막 예제는 오류 종류를 확인할 수 있도록 예외를 잡았습니다. 사용자 정의 __str__()이 잘못된 자료형을 반환하거나 내부에서 예외를 발생시키는 경우에도 변환이 실패할 수 있으므로, 실패 원인을 모두 숫자 연결 문제로 단정하지 않습니다.




