이번에는 절차적 프로그래밍에 대하여 공부해 보겠습니다.
간단한 게임을 만들 겁니다. 굉장히 재밌겠죠!

절차적 프로그래밍(Procedural Programming)은 물이 위에서 아래로 흐르듯 순차적인 처리를 중요시하는 프로그래밍 기법입니다.
단, 무조건 일직선으로만 코드가 실행되는 것은 아니며, 조건문(if)과 반복문(while, for)이라는 '흐름 제어'를 통해 로직을 유연하게 통제합니다.
파편화된 파이썬 기초 문법(변수, 타입, 연산자, 흐름 제어, 입출력 함수)을 하나로 통합하여 실질적인 목적을 가진 프로그램을 작성해 보겠습니다.
구현할 내용은 터미널(콘솔) 환경에서 동작하는 머드(MUD) 게임 스타일의 '숫자 맞추기 게임'입니다.
컴퓨터가 1부터 100 사이의 임의의 난수를 생성하면, 플레이어가 힌트를 바탕으로 최소 시도 횟수로 해당 숫자를 찾아내는 것이 게임의 목표입니다.
Stage 1: 게임 제목 입력받기 (무한 루프와 유효성 검사)
요구사항
프로그램 시작 시 사용자에게 게임 제목을 입력받습니다.
|
코드의 진화 과정
위의 요구사항을 하나하나 조금씩 차례대로 적용합니다.
Step 1: 기본 형태 구성
입력값이 비어있는 경우를 우선적으로 차단합니다.
while True: # 언제까지? 사용자가 정확하게 입력할 때까지 무한 반복
prompt = '게임 제목을 입력해 주세요. (최대 28자이내(<=28), 반드시 영문 or 숫자 만 사용 가능)\n'
game_title = input(prompt)
# 입력값 체크: 비어있는 문자열은 조건식에서 False로 평가됩니다.
if not game_title:
print("정확하게 입력하세요")
Step 2: 다중 조건 처리 (elif)
입력값이 비어있는 경우와 28자를 초과하는 경우를 나누어 에러 메시지를 분기 처리합니다.
while True:
prompt = '게임 제목을 입력해 주세요. (최대 28자이내(<=28), 반드시 영문 or 숫자 만 사용 가능)\n'
game_title = input(prompt)
if not game_title:
print("입력 없음. 정확하게 입력하세요")
elif len(game_title) > 28:
print("입력수 초과. 정확하게 입력하세요")
Step 3: strip()을 통한 공백 제거 (데이터 전처리)
사용자가 스페이스바(공백)만 입력하고 엔터를 칠 경우를 통제하기 위해 strip() 함수를 추가합니다.
데이터를 입력받는 즉시 양쪽 공백을 제거하는 것이 핵심입니다.
while True:
prompt = '게임 제목을 입력해 주세요. (최대 28자이내(<=28), 반드시 영문 or 숫자 만 사용 가능)\n'
game_title = input(prompt).strip()
# 공백만 입력 시 strip()에 의해 빈 문자열이 되므로 첫 번째 조건에 걸리게 됩니다.
if not game_title:
print("입력 없음. 정확하게 입력하세요")
elif len(game_title) > 28:
print("입력수 초과. 정확하게 입력하세요")
Step 4: 상수 분리 및 코드 최적화 (최종)
유지보수와 확장성을 고려하여 텍스트나 고정 수치(Magic Number, Magic String)는
환경 변수(상수) 형태로 외부로 분리하는 것이 절차적 프로그래밍의 좋은 관행입니다.
GAME_TITLE_MAX_LEN = 28
GAME_TITLE_PROMPT = f'게임 제목을 입력해 주세요. (최대 {GAME_TITLE_MAX_LEN}자이내(<={GAME_TITLE_MAX_LEN}), 반드시 영문 or 숫자 만 사용 가능)\n'
GAME_TITLE_ERR_MSG1 = '입력 없음. 정확하게 입력하세요'
GAME_TITLE_ERR_MSG2 = '입력수 초과. 정확하게 입력하세요'
while True:
game_title = input(GAME_TITLE_PROMPT).strip()
if not game_title:
print(GAME_TITLE_ERR_MSG1)
elif len(game_title) > GAME_TITLE_MAX_LEN:
print(GAME_TITLE_ERR_MSG2)
else:
break # 유효성 검사를 모두 통과하면 반복문을 탈출합니다.
print(f'game_title => {game_title}')
Stage 2: 플레이어 이름 입력받기 (continue 활용)
Stage 1과 동일한 절차로 플레이어 이름을 입력받습니다.
이번에는 오류 상황에서 continue 제어문을 사용하여 아래 코드를 무시하고
루프의 맨 처음(조건 확인)으로 즉시 점프하도록 구현합니다.
요구사항
|
PLAYER_NAME_MAX_LEN = 28
PLAYER_NAME_PROMPT = f'플레이어의 이름을 입력해 주세요. (최대 {PLAYER_NAME_MAX_LEN}자이내(<={PLAYER_NAME_MAX_LEN}), 반드시 영문 or 숫자 만 사용 가능)\n'
while True:
player_name = input(PLAYER_NAME_PROMPT).strip()
if not player_name:
print(GAME_TITLE_ERR_MSG1)
continue # 즉시 다음 반복(input 단계)으로 건너뜁니다.
elif len(player_name) > PLAYER_NAME_MAX_LEN:
print(GAME_TITLE_ERR_MSG2)
continue
break # 정상 입력 시 탈출
print(f'player_name => {player_name}')
Stage 3: 게임 타이틀 화면 출력 (포매팅)
지금까지 입력받은 변수를 활용하여 요구사항에 맞는 게임 시작 UI를 출력합니다.
요구사항
|
💡 추가 지식: f-string 정렬 문법 파이썬의 문자열 포매팅에서 {변수:^28}과 같이 작성하면, 총 28칸의 공간을 확보한 뒤 해당 변수의 값을 중앙(^)으로 정렬합니다. 왼쪽 정렬은 <, 오른쪽 정렬은 >를 사용합니다.
OUTLINE_ICON = '-'
# 텍스트 영역 28자 + 양쪽 테두리 기호 2자 = 총 30자
TOTAL_WIDTH = GAME_TITLE_MAX_LEN + 2
# 다중 문자열(Triple Quotes)을 활용한 UI 일괄 구성
title_ui = f'''{OUTLINE_ICON * TOTAL_WIDTH}
-{game_title:^28}-
-{player_name:^28}-
-{"press any key":^28}-
{OUTLINE_ICON * TOTAL_WIDTH}'''
print(title_ui)
# (참고) 개별 print()를 활용하여 동일하게 구성하는 방식
# print(OUTLINE_ICON * TOTAL_WIDTH)
# print(f'{OUTLINE_ICON}{game_title:^28}{OUTLINE_ICON}')
# print(f'{OUTLINE_ICON}{player_name:^28}{OUTLINE_ICON}')
# print(f'{OUTLINE_ICON}{"press any key":^28}{OUTLINE_ICON}')
# print(OUTLINE_ICON * TOTAL_WIDTH)
실행 결과
정상적으로 실행 시 다음과 같이 콘솔에 중앙 정렬된 깔끔한 타이틀 화면이 출력되며 메인 게임(숫자 찾기)으로 진입할 준비를 마칩니다.
------------------------------
- gameTitle -
- playerName -
- press any key -
------------------------------
절차적 프로그래밍을 하면서 느낀건데 이전에는 매번 급하게 프로그래밍을 하면서 모든 요구사항을 한번에 처리하려고 한 것 같습니다.ㅠㅠ
오늘의 한 마디
역시 어떠한 곳을 가기 위해서는 절차적으로 진행해야겠습니다. 인생을 프로그래밍처럼 살아간다면 효율화되고 정답에 다다를 수 있을까요?
근데 웃긴 것은 프로그래밍을 하다가 결국 또 요구사항이 바뀌는 경우도 있고 있던 것을 없애야하는 상황도 나오게 됩니다. 그러니까 그런 상황에 잘 대비하기 위해 절차적으로 함수 지향적으로 대비를 해놓으면 좀 편할 것 같습니다.
'코딩 개발 > Python' 카테고리의 다른 글
| Python - 함수 (Function) (0) | 2026.07.17 |
|---|---|
| Python - 절차적 프로그래밍2 (숫자 맞추기 게임 만들기 step4 ~ step7) (0) | 2026.07.16 |
| Python - 반복문(break, continue, else, while) (0) | 2026.07.14 |
| Python - 반복문 (for) (0) | 2026.07.13 |
| Python - 흐름제어, 조건식 (0) | 2026.07.12 |