본문 바로가기
IT⦁영어⦁하자보수/IT

6. 파이썬 기초 - 4장 파이썬의 입출력 [조코딩]

by csr1974m 2025. 9. 20.

파이썬 기초 - 4장 파이썬의 입출력 | 2023 점프 투 파이썬

 
여러분, 안녕하세요! 👨‍🏫 오늘은 '점프 투 파이썬' 강의의 네 번째 시간, **'입출력(Input/Output)'**에 대해 깊이 있는 이야기를 나눠볼까 합니다. 프로그래밍을 요리에 비유한다면, 입출력은 재료를 준비하고 완성된 음식을 손님에게 내어놓는 과정과 같아요. 👩‍🍳 재료를 받는 것(input), 완성된 요리를 내어주는 것(output)은 모든 프로그램의 필수적인 기능입니다. 컴퓨터 프로그램이 외부 세계와 소통하고, 데이터를 영구적으로 보관하며, 사용자와 상호작용하기 위해서는 이 입출력 개념을 완벽하게 이해해야 합니다.
이번 글에서는 파이썬에서 사용자, 파일, 그리고 함수와 상호작용하는 다양한 입출력 방식들을 마치 숙련된 셰프처럼 꼼꼼하게 분석해 드릴게요. 이 글을 읽고 나면, 여러분은 데이터를 자유자재로 다루는 능력뿐만 아니라, 효율적으로 코드를 구성하는 방법까지 터득하게 될 것입니다. 🔪✨


함수: 프로그램의 요리 재료를 만드는 도구 🧱

입출력의 핵심을 이해하려면 먼저 **함수(Function)**의 개념부터 완벽하게 파악해야 합니다. 함수는 특정 작업을 처리하는 코드의 '덩어리'입니다. 마치 공장 라인처럼 **입력(input)**을 받아 특정 작업을 처리하고, 그 결과인 **출력(output)**을 내뱉는 역할을 하죠. 🏭

  • 함수를 사용하는 이유:
    1. 코드의 재사용성: 반복적으로 사용되는 작업을 함수로 만들어 놓으면, 필요할 때마다 간단하게 호출하여 사용할 수 있습니다.
    2. 가독성 향상: 복잡한 코드를 기능별로 함수로 분리하면, 전체 프로그램의 구조를 한눈에 파악하기 쉬워집니다.
    3. 유지보수 용이: 특정 기능을 수정해야 할 때, 함수 내부만 고치면 되기 때문에 전체 코드를 수정할 필요가 없어집니다.
  • 함수의 구조: 함수는 def 키워드를 사용해 정의합니다.
    • 매개변수(Parameter): 함수를 정의할 때 사용하는 변수입니다. 함수의 '설계도'에 들어가는 부품 이름이라고 생각하면 쉽습니다.
    • 인수(Argument): 함수를 호출할 때 전달하는 실제 값입니다. 실제 '생산'에 들어가는 부품이라고 할 수 있죠.
  • def 함수이름(매개변수):
        # 함수가 실행할 코드
        return 결과값
    

다양한 형태의 함수들

함수에는 다양한 형태가 있습니다.

  • 입력도 있고, 리턴값도 있는 함수: 가장 일반적인 함수 형태로, 무언가를 받아서 처리하고 결과를 돌려줍니다.
  • def add(a, b):
        return a + b
    result = add(3, 4) # result는 7
    
  • 입력은 없고, 리턴값만 있는 함수: 입력 없이 고정된 값을 돌려주는 함수입니다.
  • def get_pi():
        return 3.141592
    pi = get_pi() # pi는 3.141592
    
  • 입력은 있고, 리턴값은 없는 함수: 특정 작업을 수행하지만 결과를 반환하지 않는 함수입니다. 이런 함수는 내부적으로 None 값을 반환합니다.
  • def print_greeting(name):
        print(f"안녕하세요, {name}님")
    print_greeting("김파이") # 화면에 "안녕하세요, 김파이님" 출력
    
  • 입력도 없고, 리턴값도 없는 함수: 단순히 특정 작업을 수행하고 끝내는 함수입니다.
  • def show_logo():
        print("Python")
    show_logo() # 화면에 "Python" 출력
    

함수 사용의 특별한 기술들

  • 리턴값은 오직 하나: 파이썬 함수는 리턴값이 여러 개인 것처럼 보일 수 있지만, 사실은 튜플(Tuple) 형태로 묶여서 하나의 리턴값을 반환합니다. 📦
  • def add_and_mul(a, b):
        return a + b, a * b # 튜플로 묶여 반환됨
    sum_val, mul_val = add_and_mul(3, 4) # 언패킹으로 각각 할당
    
  • return의 힘: return 키워드를 만나는 순간 함수는 즉시 종료됩니다. 이 특징을 이용해 특정 조건에 따라 함수를 일찍 끝낼 수 있습니다.
  • 매개변수 기본값: 매개변수에 미리 기본값을 설정해두면, 함수 호출 시 해당 인수를 생략할 수 있습니다. 단, 기본값이 있는 매개변수는 항상 맨 뒤에 위치해야 합니다.
  • def show_info(name, age=30):
        print(f"이름: {name}, 나이: {age}")
    show_info("홍길동") # 나이 생략 -> 기본값 30 사용
    show_info("홍길동", 25) # 나이 지정 -> 25 사용
    
  • 가변 인자: *args와 **kwargs
    • *args (arguments): 몇 개의 입력값이 들어올지 모를 때 사용합니다. 입력값들은 튜플 형태로 함수에 전달됩니다. 마치 '손님 몇 분이 오실지 모르니 일단 빈 의자를 모두 가져다 놓는 것'과 같습니다.
    • **kwargs (keyword arguments): 키-값 쌍의 입력값들이 들어올 때 사용합니다. 마치 '손님들이 각자 원하는 특별한 옵션(예: 소스 추가, 치즈 제외)을 주문하는 것'과 같습니다. 입력값들은 딕셔너리 형태로 전달됩니다.

사용자 입출력: 프로그램과 소통하기 💬

사용자 입출력은 말 그대로 사용자로부터 데이터를 받고(입력), 그 결과를 화면에 보여주는(출력) 과정입니다.

input() 함수: 사용자 입력 받기

input() 함수는 사용자로부터 키보드 입력을 받을 때 사용합니다. input() 함수가 실행되면 프로그램이 잠시 멈추고 사용자의 입력을 기다리죠. 여기서 가장 중요한 특징은, 사용자가 입력하는 모든 값은 숫자이든 문자이든 무조건 문자열(String)로 취급된다는 점입니다. 📝 만약 숫자로 사용하고 싶다면 반드시 int()나 float() 함수를 사용해 자료형을 변환해야 합니다.

user_input = input("숫자를 입력하세요: ") # "123" (문자열)
number = int(user_input) # 123 (정수)

print() 함수: 화면에 출력하기

print() 함수는 값을 화면에 출력하는 기본적인 함수입니다.

  • 여러 값 출력: 쉼표(,)를 사용해 여러 값을 출력하면, 값 사이에 자동으로 공백이 추가됩니다.
  • sep와 end: print() 함수는 출력 방식을 제어하는 sep (separator)와 end (ending character) 매개변수를 제공합니다.
    • sep: 여러 값을 출력할 때 값 사이에 들어갈 문자를 지정합니다.
    • end: 출력의 맨 끝에 들어갈 문자를 지정합니다. 기본값은 줄 바꿈(\n)입니다.
  • f-문자열: 가장 추천하는 출력 방식입니다. 변수를 문자열 안에 깔끔하게 삽입할 수 있어 코드가 직관적입니다.

파일 입출력: 데이터를 저장하고 불러오기 💾

지금까지는 프로그램을 종료하면 입력했던 데이터가 모두 사라졌죠. **파일 입출력(File I/O)**은 데이터를 파일 형태로 저장하여 영구적으로 보관하고, 필요할 때 다시 불러와서 사용할 수 있게 해줍니다.

open() 함수와 파일 모드

파일에 내용을 쓰고 읽기 위해서는 먼저 open() 함수로 파일을 열어야 합니다. open() 함수는 파일 경로와 **모드(Mode)**를 인자로 받습니다.

  • 텍스트 모드 (t): 기본값. 텍스트 파일을 다룰 때 사용합니다.
    • 읽기 (r): 읽기 전용으로 파일을 엽니다.
    • 쓰기 (w): 쓰기 전용으로 파일을 엽니다. 기존 파일의 내용을 모두 지우고 새로 씁니다.
    • 추가 (a): 기존 파일의 내용 뒤에 새로운 내용을 추가합니다.
    • 새로 만들기 (x): 파일이 이미 존재하면 오류를 발생시키고, 존재하지 않을 때만 파일을 새로 만듭니다.
  • 바이너리 모드 (b): 텍스트가 아닌 이미지, 동영상 등 이진 파일을 다룰 때 사용합니다.

파일 쓰기 (Writing to a file)

# 1. 파일 열기 (쓰기 모드 'w')
f = open("새파일.txt", "w")

# 2. 내용 작성
f.write("Hello, Python!")

# 3. 파일 닫기
f.close()

파일 읽기 (Reading from a file)

파일에서 내용을 읽기 위해서는 파일을 **읽기 모드 (r)**로 열어야 합니다. 읽기 모드로 파일을 열면 다양한 함수를 사용할 수 있습니다.

  • read(): 파일 전체의 내용을 한 번에 문자열로 읽어옵니다.
  • readline(): 파일의 내용을 한 줄씩 읽어옵니다. 더 이상 읽을 줄이 없으면 None을 반환합니다.
  • readlines(): 파일의 모든 줄을 읽어와 리스트 형태로 반환합니다. 각 줄 끝에는 줄바꿈 문자(\n)가 포함됩니다.

with 문: 파일을 안전하게 다루는 법 ✅

open() 후 close()를 잊어버리면 파일이 제대로 닫히지 않아 문제가 생길 수 있습니다. 이를 방지하기 위해 with 문을 사용합니다. with 문은 open() 함수의 '컨텍스트 관리자(Context Manager)' 기능을 활용하여, 코드 블록이 끝나는 순간 자동으로 파일을 닫아주는 편리한 구문입니다.

with open("test.txt", "w") as f:
    f.write("Hello, Python!")
# with 문이 끝나면 f.close()가 자동으로 실행되어 자원 누수를 막습니다.

전역 변수 vs. 지역 변수: 변수의 활동 영역 🗺️

변수는 자신이 활동할 수 있는 '영역'이 정해져 있습니다. 이를 **변수 스코프(Scope)**라고 합니다. 변수가 속한 스코프에 따라 그 변수를 사용할 수 있는 범위가 달라지죠.

  • 지역 변수(Local Variable): 함수 안에서 선언된 변수로, 함수가 종료되면 사라집니다. 함수 바깥에서는 사용할 수 없습니다. 마치 회사에서 '팀 프로젝트'를 위해 고용된 인턴처럼, 프로젝트가 끝나면 그의 역할도 끝나는 것과 같습니다.
  • 전역 변수(Global Variable): 함수 바깥에서 선언된 변수로, 프로그램 전체에서 사용할 수 있습니다. 회사 전체의 '정직원'처럼 어느 부서에서든 접근할 수 있습니다.

주의사항: 함수 안에서 전역 변수와 같은 이름의 변수를 사용해도, 이는 새로운 지역 변수로 간주됩니다. 만약 함수 안에서 전역 변수를 직접 수정하고 싶다면 global 키워드를 사용해야 합니다. ⚠️

count = 10 # 전역 변수

def increase_count():
    count = 20 # 새로운 지역 변수 'count' 생성
    print(f"함수 안 지역 변수: {count}") # 20

def increase_global_count():
    global count # 전역 변수 'count'를 사용하겠다고 선언
    count += 1
    print(f"함수 안 전역 변수: {count}") # 11

increase_count()
print(f"함수 밖 전역 변수: {count}") # 10 (변화 없음)
increase_global_count()
print(f"함수 밖 전역 변수: {count}") # 11 (변화 있음)

이처럼 global 키워드는 전역 변수의 값을 함수 안에서 변경해야 할 때 필수적으로 사용됩니다.


명령 프롬프트에서 입출력: 터미널과 소통하기 💻

파이썬 스크립트를 명령 프롬프트나 터미널에서 실행할 때, 스크립트 이름과 함께 입력값을 전달받을 수 있습니다. 이를 **명령행 인수(Command-line arguments)**라고 합니다. 이는 사용자가 매번 코드를 수정하지 않고도 프로그램에 다른 데이터를 전달할 수 있게 해줍니다.
sys 모듈의 sys.argv 리스트를 사용하면 명령행 인수를 손쉽게 다룰 수 있습니다. sys.argv는 스크립트 이름부터 시작하여 모든 인자들을 리스트 형태로 포함합니다.

# my_program.py 파일
import sys

# sys.argv는 리스트 형태로 인자를 받음
# 첫 번째 요소는 항상 파일 이름
args = sys.argv[1:] # 파일 이름 제외

if len(args) == 2:
    num1 = int(args[0])
    num2 = int(args[1])
    print(f"두 수의 합: {num1 + num2}")
else:
    print("숫자 2개를 입력해주세요.")

# 터미널에서 실행
# python my_program.py 10 20
# 출력: 두 수의 합: 30

이러한 방식은 프로그램을 더 유연하고 재사용 가능하게 만들어줍니다.


정리하며... ✍️

오늘은 파이썬의 입출력, 그리고 이를 가능하게 하는 함수와 변수의 개념에 대해 깊이 있는 이야기를 나눠봤습니다.

  • 함수는 코드를 재사용 가능한 단위로 묶어 프로그램의 구조를 체계적으로 만들어줍니다.
  • 사용자 입출력은 input()과 print() 함수를 통해 사용자와 소통하는 창구 역할을 합니다.
  • 파일 입출력은 데이터를 영구적으로 저장하고 관리하는 강력한 수단입니다.
  • 변수의 스코프를 이해하는 것은 오류를 줄이고 코드를 깔끔하게 만드는 데 필수적입니다.
  • 명령행 인수는 외부에서 프로그램에 데이터를 전달하는 또 다른 중요한 방법입니다.

이러한 입출력 개념들을 마스터하는 것은 단순히 코드를 짜는 것을 넘어, 외부 세계와 상호작용하는 살아있는 프로그램을 만드는 첫걸음입니다. 🚀 이 지식들을 바탕으로 여러분의 프로그램을 더욱 강력하고 유연하게 만들어 보세요!