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