자바 표준 입출력 (키보드, 콘솔)

Kim taegwan·2026년 3월 31일

왜 반환값이 byte 가 아닌 int 인가요?

read() 가 반환하는 값의 종류:
  - 정상 데이터      : 0 ~ 255 (1바이트 범위) -  (부호 없는 바이트 읽음)
  - 더 읽을 게 없음  : -1       ← 이게 핵심!
  즉, -1 = "더 읽을 데이터가 없다" (끝 신호)를 
           **명확하게 표시하기 위해서 int로 반환 함**

InputStream.read()는 읽은 바이트를 부호 없는 값처럼 해석해서 돌려줘.

System.in.read() 의 한계

원리를 이해했으면 이제 솔직한 이야기를 해야 합니다.

System.in.read() 의 문제점 3가지:

1. 1바이트씩밖에 못 읽음  → 사용이 불편함
2. 한글 처리 불가          → 3바이트짜리 한글이 잘려서 깨짐
3. 타입 변환 직접 해야 함  → 숫자를 받으려면 직접 변환 코드 필요 

그래서 실무에서는 System.in 을 직접 쓰지 않고 더 편리한 도구로 감싸서 사용합니다.

간단한 입력  →  Scanner
빠른 입력   →  BufferedReader + InputStreamReader  (17단원에서 배웁니다)

이 단원에서 System.in.read() 를 직접 다루는 이유는 "내부에서 어떤 일이 벌어지는지 원리를 이해하기 위해서" 입니다.

핵심 요약

System.in
  → 키보드 입력을 1바이트씩 읽는 표준 입력 스트림
  → read() 반환값: 0~255 (데이터) 또는 -1 (끝)
  → 반환 타입이 int 인 이유: -1 을 끝 신호로 구분하기 위해
  → 한글 처리 불가, 실무에서는 Scanner / BufferedReader 로 감싸서 사용

System.out
  → println() : 출력 + 줄바꿈
  → print()   : 출력만 (줄바꿈 없음)
  → printf()  : 형식 지정 출력 (%s, %d, %f ...)

System.err
  → System.out 과 사용법 동일
  → 콘솔에서 빨간색으로 표시됨
  → 에러/경고 메시지 전용으로 구분해서 사용

FileInputStream

  • 파일에서 바이트 단위로 읽음
  • read() 반환값이 -1 이면 파일 끝 → while 문 종료 조건으로 사용
  • 반드시 close() 해야 함 → try-with-resources 사용 권장
  • 한글 텍스트는 깨질 수 있음 → 16단원 FileReader 에서 해결

0개의 댓글