출력과 입력
1 / 17

출력과 입력

컴퓨터와 주고받는 첫 대화

생각을 기계에 전달하고 계산 결과를 화면에 출력하는 과정

오늘의 수업 목표

  • 컴퓨터가 화면에 정보를 보여주는 원리(출력)를 이해하고 제어할 수 있다.
  • 사용자가 입력한 정보(입력)를 가져와 연산에 대입할 수 있다.
  • 한 줄에 뭉쳐서 들어오는 데이터를 알맞게 분할하고 형변환할 수 있다.

왜 배워야 할까요?

컴퓨터가 아무리 뛰어난 인공지능이고 슈퍼컴퓨터라 하더라도, 우리가 원하는 것을 말해주지 못하고(입력) 컴퓨터의 대답을 듣지 못한다면(출력) 아무 일도 할 수 없습니다.

이 수업을 통해 컴퓨터에게 명령을 내리고 결과를 돌려받는 진짜 프로그래밍의 첫 대화 창구를 여는 열쇠를 쥐게 됩니다.

자판기와의 대화 상상하기

우리가 늘 접하는 자판기는 입력과 출력의 대표적인 모델입니다.

  • 출력 (Output): 자판기 모니터에 "금액을 투입하세요" 멘트 띄우기
  • 입력 (Input): 사용자가 동전을 넣고 음료 버튼 클릭하기
  • 연산 및 결과: 투입된 액수를 확인하고 음료수를 배출구로 보냄

모든 소프트웨어 프로그램은 이처럼 기계와 사람 간의 입력과 출력(대화)으로 기획됩니다.

print() 화면에 출력하기

컴퓨터가 알고 있는 값을 화면에 띄워 사용자에게 알리는 도구

print("Hello, World!")    # 문자열 출력 (따옴표 사용 필수)
print(100)                 # 정수 숫자 출력
print(3.14)               # 실수 숫자 출력

# 쉼표(,)로 연결하면 값 사이에 빈칸이 자동으로 하나 생김
print("이름:", "홍길동")   # 이름: 홍길동
print("점수:", 100, "점")  # 점수: 100 점

구분자와 끝글자 조절 (sep & end)

print() 함수에서 출력 형식을 조절하는 두 옵션의 핵심 차이

  • sep (구분자): 출력할 값들 사이사이에 끼워 넣는 연결 문자 (기본값: 빈칸 한 칸)
  • end (끝 문자): 자동 엔터(줄바꿈) 대신 출력 마지막에 덧붙이는 문자. 줄바꿈을 하지 않고 다음 출력을 바로 이어지게 만듭니다. (기본값: 줄바꿈 \n)
# sep는 값 '사이'에만 작동
print("사과", "배", "감", sep=" 와 ")
# 출력: 사과 와 배 와 감

# end는 자동 엔터 대신 맨 끝에 지정된 문자 주입
print("사과", "배", "감", end=" 와 ")
print("귤")
# 출력: 사과 배 감 와 귤

f-string: 문자열 조립과 사용 장점

문장 사이에 변수의 값을 자연스럽게 끼워 넣는 가장 현대적인 기법

name = "홍길동"
score = 98
print(f"안녕하세요, {name}님. 이번 성적은 {score}점입니다.")

f-string을 꼭 사용해야 하는 이유:

  • 가독성: 쉼표(,)나 덧셈(+)으로 쪼개서 붙이지 않아 문장 전체 구조가 한눈에 파악됨
  • 자동 변환: 숫자를 결합하기 위해 str()로 형변환을 수동으로 처리하지 않아도 됨
  • 직관적 연산: 중괄호 `{score + 2}` 내에서 직접 연산을 처리하고 바로 결합 가능

input() 컴퓨터에 전달하기

키보드 신호가 입력되어 엔터를 치기 전까지 실행을 중지하고 대기합니다.

name = input("이름 입력: ")
print(f"반갑습니다, {name}님!")

중요한 시스템 약속: 키보드로 유입되는 모든 데이터는 무조건 글자(str) 취급됩니다.

x = input("수: ")     # 5를 타이핑하면
print(type(x))        #  (연산 불가능한 글자 상태)

변수 타입 명시와 타 언어 차이

C, C++, Java vs Python의 타입 규칙

  • 정적 타입 언어(C, Java): 변수 선언 시 타입을 강제 지정합니다. int score = 100;
  • 동적 타입 언어(Python): 값에 따라 타입을 자동 지정합니다. score = 100

파이썬에서도 타입을 지정(명시)할 수 있을까?

타입 힌팅(Type Hinting)을 사용하여 명시적으로 적을 수 있습니다.

score: int = 100
name: str = "홍길동"

def greet(name: str) -> None:
    print(name)

수식 연산을 위한 형변환

문자로 유입된 데이터를 연산 가능한 숫자 성향으로 변환합니다.

# 잘못된 예
n = input()       # "5" (문자)
print(n + 3)      # TypeError (글자와 숫자는 합칠 수 없음)

# 올바른 예
n = int(input())  # 5 (정수형 변환)
print(n + 3)      # 8 (연산 성공)

* int("10") = 10(정수) | float("3.14") = 3.14(실수) | str(100) = "100"(문자)

split() — 한 줄 데이터 공백으로 쪼개기

사용자가 공백(스페이스바)을 사이에 두고 입력한 데이터들을 조각조각 잘라내어 변수에 분배합니다.

# 사용자가 "홍길동 95"를 입력했을 때
name, score = input().split()

# 쪼개진 각각의 값은 여전히 글자(str) 상태입니다.
print(name)   # 출력: 홍길동
print(score)  # 출력: 95 (글자 형태, 숫자 연산 불가)

map() — 여러 데이터 한 번에 형변환하기

쪼개진 문자열 조각들에 형변환 함수를 일괄적으로 적용하여 변수들에 정수형이나 실수형으로 대입시킵니다.

# map(적용할_함수, 대상_데이터)
a, b = map(int, input().split())

# 사용자가 "3 5"를 입력했을 때:
# 1. input().split()으로 ["3", "5"] 생성
# 2. map이 각각 int()를 취해 숫자 3과 5로 변환
# 3. 변수 a와 b에 정수 3과 5가 대입되어 연산 가능 상태가 됨

print(a + b)  # 출력: 8

왜 int()가 아니라 int일까요?

파이썬에서 함수 이름 뒤에 괄호 ()를 붙이는 것은 "지금 당장 이 함수를 실행하라"는 의미입니다.

  • int(): 함수를 지금 당장 실행하여 결과물(숫자 0)을 만들어 냅니다.
  • int: 함수를 실행하지 않고, 함수를 실행하는 레시피(공식) 자체를 전달합니다.

map 함수에는 완성된 결과물이 아니라, 데이터 조각들을 만날 때마다 처리할 수 있는 레시피(int)를 넘겨주어야 정상적으로 작동합니다.

자주 하는 실수 — map 객체 그대로 출력하기

map()의 결과물을 list()로 감싸지 않고 바로 출력하면 원치 않는 주소 값이 나오게 됩니다.

# 잘못된 예: map 객체를 그대로 출력
numbers = map(int, input().split())
print(numbers)
# 출력: 

# 올바른 예: list() 함수를 이용해 실제 리스트로 변환하여 출력
numbers = list(map(int, input().split()))
print(numbers)
# 출력: [1, 2, 3]

왜 a, b = map(...) 은 잘 작동할까요?

파이썬의 다중 대입 (언패킹, Unpacking) 기능 덕분입니다.

  • a, b = map(...): 좌변에 변수가 여러 개 있으면, map 객체에서 값을 하나씩 순서대로 꺼내 a와 b에 자동으로 나눠 담아줍니다.
  • numbers = map(...): 좌변에 변수가 하나뿐이면, 값을 꺼내지 않고 map 객체 자체를 통째로 변수에 담아버립니다.

따라서 여러 변수에 나누어 대입할 때는 list()가 필요 없지만, 하나의 변수에 목록 전체를 통째로 담을 때는 list()가 필수입니다.

온라인 저지(OJ) 빈출 입력 유형

# 1. 하나의 정수만 주어질 때
n = int(input())

# 2. 한 줄에 공백을 두고 두 정수가 나열될 때
a, b = map(int, input().split())

# 3. 한 줄에 여러 정수들이 뭉쳐서 전달될 때 (리스트화)
numbers = list(map(int, input().split()))

# 4. 데이터 건수 N이 들어오고 그 다음 줄부터 N회 데이터가 제공될 때
n = int(input())
for _ in range(n):
    data = int(input())

오늘 배운 핵심 요약

도구역할핵심 개념
print() 결과 화면 출력 문자는 따옴표 필수, sep/end 조절 가능
input() 키보드 데이터 수신 받은 값은 무조건 문자열(str) 형태
int() / float() 숫자 타입 변형 연산 이전에 변환해야 덧셈 가능
split() / map() 문자열 쪼개기 및 적용 한 줄에 유입되는 데이터 분배 처리 핵심
ESC — 수업으로 돌아가기  ·  F — 전체화면