[Python 시리즈 3편] 변수와 자료형으로 데이터 다루기

English version

2편에서 uv run으로 코드를 돌릴 준비를 마쳤으니, 이제는 코드 안에서 데이터를 다룰 차례입니다. 변수는 값을 이름에 담아두는 도구이고, 자료형은 그 값이 어떻게 생겼는지 설명하는 규칙입니다. 이번 글에서는 문자열과 숫자, 리스트와 딕셔너리까지 기본 자료형을 훑고, 사용자 입력을 받아 처리한 뒤 출력하는 짧은 예제를 만들어 봅니다.

이번 글에서 새로 나오는 용어

  1. snake_case: 단어 사이를 밑줄로 잇는 변수 표기법으로 Python에서 가장 흔한 이름 규칙
  2. JSON: 키-값 쌍과 배열로 데이터를 표현하는 텍스트 형식으로 딕셔너리·리스트와 거의 동일한 구조
  3. BMI: 체질량지수로 몸무게를 키의 제곱으로 나눠 건강 상태를 대략 판단하는 지표

핵심 개념

학습 메모

  • 소요 시간: 45분
  • 준비물: uv run으로 스크립트를 실행해 본 경험
  • 학습 목표: 기본 자료형을 선언·변환해 입력-출력 흐름 완성하기

변수는 "값에 붙인 이름"이고 자료형은 "값의 생김새"입니다. 문자열, 숫자, 리스트, 딕셔너리를 묶어서 이해하면 입력-처리-출력 흐름이 한 번에 잡힙니다.

코드로 따라하기

변수 선언과 재할당

Python에서는 타입을 따로 적지 않고 바로 값을 넣습니다. 중요한 건 "값이 바뀔 수 있는가"보다 "이 이름이 무엇을 가리키는가"를 명확히 하는 것입니다.

user_name = "지민"
login_count = 1

print(user_name)
login_count = login_count + 1
print(login_count)

변수 이름은 소문자와 밑줄을 조합해 snake_case로 작성하는 것이 일반적입니다. snake_case는 단어 사이를 밑줄로 잇는 표기법이라 읽기 쉽습니다.

숫자와 문자열

  • 정수 int: 1, 42, -5
  • 실수 float: 0.1, 3.14
  • 문자열 str: "hello"

문자열 포매팅은 f-string으로 작성하는 것이 가장 읽기 쉽습니다.

team = "backend"
members = 4

message = f"{team} 팀 인원은 {members}명입니다."
print(message)

불리언과 비교 연산

불리언은 참/거짓을 나타내는 자료형입니다. 조건문에서 자주 쓰이므로 비교 연산과 함께 익혀야 합니다.

score = 78
is_pass = score >= 70

print(is_pass)  # True

리스트와 딕셔너리

  • 리스트(list)는 순서가 있는 값들의 묶음입니다.
tasks = ["메일 확인", "데이터 백업", "리포트 작성"]
print(tasks[0])
tasks.append("배포 로그 점검")
  • 딕셔너리(dict)는 키-값 쌍으로 정보를 저장합니다.
user = {
    "name": "지민",
    "role": "analyst",
    "active": True,
}

print(user["role"])
user["active"] = False

리스트와 딕셔너리는 JSON과도 구조가 비슷해서 이후 API를 다룰 때 자연스럽게 연결됩니다.

🧠 JSON이란? JavaScript Object Notation의 약자로, 키-값 쌍과 배열로 구성된 텍스트 데이터 형식입니다. 대부분의 웹 API와 설정 파일이 JSON을 사용하기 때문에 Python의 딕셔너리·리스트 감각이 그대로 통합니다.

실전 예시: 동아리 출석표 자동 정리

CSV에서 읽은 데이터를 리스트와 딕셔너리로 재구성하면 웹 서비스 DB에 넣기 전 검증을 쉽게 할 수 있습니다.

rows = [
    "이름,지각,참여도",
    "민수,0,5",
    "하린,1,4",
]

headers = rows[0].split(",")
records = []

for row in rows[1:]:
    values = row.split(",")
    record = {key: value for key, value in zip(headers, values)}
    record["지각"] = int(record["지각"])
    record["참여도"] = int(record["참여도"])
    records.append(record)

print(records)

이렇게 만든 자료 구조는 바로 JSON으로 직렬화하거나 CSV·데이터베이스로 내보낼 수 있어 실무 연결이 빠릅니다.

입력-처리-출력 흐름 예제

간단한 체질량지수(BMI) 계산을 통해 자료형을 함께 써 봅니다.

height_cm = float(input("키(cm)를 입력하세요: "))
weight = float(input("몸무게(kg)를 입력하세요: "))

height_m = height_cm / 100
bmi = weight / (height_m ** 2)

result = {
    "height": height_cm,
    "weight": weight,
    "bmi": round(bmi, 2),
}

print(f"BMI는 {result['bmi']} 입니다.")

여기서 input()은 항상 문자열을 반환하기 때문에 숫자 연산을 하려면 float()int()로 변환해야 한다는 점을 기억하세요.

왜 중요한가

변수와 자료형 감각이 잡혀야 if문, for문 같은 제어문을 도입할 수 있습니다. 또 리스트·딕셔너리 구조는 JSON과 거의 같아서 이후 API 응답을 다룰 때 바로 연결됩니다. 입력-처리-출력 흐름을 코드로 한 번이라도 돌려 보면, "데이터를 담고 꺼내는 법"이 몸에 붙습니다.

실습

  • 따라 하기: BMI 예제를 그대로 따라 하면서 각 변수 타입을 print(type(...))로 확인합니다.
  • 확장하기: 리스트와 딕셔너리를 이용해 3명 이상의 BMI 결과를 저장하고 평균 BMI를 계산합니다.
  • 디버깅: 입력값을 빈 문자열로 넣어 ValueError를 발생시키고, if not value: 검증으로 예외를 막습니다.
  • 완료 기준: 사용자 입력을 받아 리스트·딕셔너리에 저장하고 요약 메시지를 출력하는 흐름을 완성했을 때입니다.

마무리

오늘은 변수와 자료형을 통해 "데이터를 담고 꺼내는 법"을 익혔습니다. 이 감각이 있어야 조건문과 반복문이 왜 필요한지도 자연스럽게 느껴집니다. 다음 글에서는 조건문과 반복문을 묶어서 프로그램 흐름을 제어하는 방법을 살펴보겠습니다.

💬 댓글

이 글에 대한 의견을 남겨주세요