Java - 표준 입출력이란? 표준 입출력을 사용하는 이유는? 부제:기본이 전부다
📌 자바 표준 입출력이란? 왜 사용하는가
부제: 기본이 전부다 – 자바 표준 입출력 완전 정리
1. 자바 표준 입출력이란?
자바는 OS와 직접 통신할 수 없습니다. OS의 리소스(파일, 콘솔 등)에 접근하려면, 자바 언어 차원에서 마련된 중간 매개체가 필요합니다. 이게 바로 표준 입출력입니다.
자바에서는 아래와 같이 세 가지 기본 스트림이 제공됩니다.
-
System.out: 표준 출력 (모니터로 출력) -
System.in: 표준 입력 (키보드 입력) -
System.err: 표준 에러 출력 (에러 메시지 출력)
이들 모두 자바 프로그램이 외부와 데이터를 주고받는 가장 기본적인 통로입니다.
2. 왜 표준 입출력을 사용하는가?
표준 입출력을 사용하면 다음과 같은 장점이 있습니다:
-
코드 일관성 유지: 다양한 입출력(파일, 네트워크 등)과 구조가 유사해 확장하기 쉽다.
-
테스트와 디버깅에 유리: Scanner나 PrintStream 등을 활용해 QA 테스트 시 다양한 시나리오를 쉽게 재현 가능.
-
OS 독립적: OS별 차이를 신경쓰지 않아도 되며, JVM이 알아서 처리해준다.
예제:
Scanner key = new Scanner(System.in);
System.out.println("점수 입력:");
int num = key.nextInt();
if (num >= 90) {
System.out.println("통과");
} else {
System.out.println("재시험");
}
System.out.println("종료");
3. 표준 입출력의 핵심 클래스들
3.1 Scanner
System.in을 기반으로 입력을 받는 클래스. 문자열, 정수, 실수 등 다양한 타입으로 입력을 쉽게 받을 수 있다.
Scanner key = new Scanner(System.in);
String name = key.next(); // 문자열 입력
int age = key.nextInt(); // 정수 입력
3.2 InputStream / OutputStream
-
InputStream: 바이트 단위 입력 -
OutputStream: 바이트 단위 출력
(예: 키보드 입력, 파일, 네트워크 등)
InputStream myin = System.in;
int data = myin.read(); // 한 바이트 읽기
System.out.println((char)data); // 문자로 출력
→ 주의: System.in.read()는 한 글자씩만 처리 가능하며, 한글은 깨짐 (UTF-8 멀티바이트 문자)
4. InputStreamReader를 알아보자
InputStream vs InputStreamReader
-
InputStream: 바이트 단위로 읽음 -
InputStreamReader: 바이트 → 문자로 변환해서 읽음 (인코딩 고려)
InputStreamReader isr = new InputStreamReader(System.in);
int data = isr.read();
System.out.println((char)data);
InputStreamReader를 쓰면 한글도 정상적으로 처리할 수 있다.
5. 왜 엔터(13)을 만나면 종료될까?
int data = myin.read();
if (data == 13) {
break;
}
-
키보드 입력 후 Enter를 누르면
CR(Carriage Return), 즉 아스키코드 13이 발생. -
이걸 기준으로 루프 종료조건으로 사용하는 것.
6. 파일 입출력 기초 – FileInputStream
OS와 파일 통신을 할 때 가장 기본적으로 쓰이는 클래스.
FileInputStream fis = new FileInputStream("test.txt");
int data = fis.read(); // 파일에서 한 바이트 읽기
System.out.println(data);
fis.close(); // 반드시 닫아야 자원 누수 방지
파일 IO의 3단계
-
파일 열기
→new FileInputStream() -
파일 엑세스
→read(),write(),flush()등 -
파일 닫기
→close()
7. 자바 입출력의 큰 그림
자바의 입출력은 기본적으로 스트림(Stream) 구조로 되어 있다. 스트림은 데이터가 흘러가는 통로이며, 다음과 같은 분류로 나뉜다.
| 구분 | 바이트 기반 | 문자 기반 |
|---|---|---|
| 입력 스트림 | InputStream | Reader |
| 출력 스트림 | OutputStream | Writer |
| 예시 | FileInputStream, System.in | InputStreamReader, Scanner |
이 개념을 이해하면, 네트워크 IO, 파일 IO, DB IO 등 모든 입출력 구조를 쉽게 확장해서 이해할 수 있다.
8. 결론 – 기본이 전부다
-
표준 입출력은 자바의 모든 IO의 시작이자 끝이다.
-
입력과 출력이 어떻게 동작하는지 클래식한 방식으로 이해하고 넘어가야 이후에 나오는 Spring, JDBC, 네트워크 통신도 쉽게 이해 가능하다.
-
쉬운 것부터 찾지 말고, 기본부터 내부 구조까지 꿰뚫는 연습을 해야 진짜 실력이 된다.
🔖 마지막 Tip
-
한 번 배운 내용은 반드시 직접 그림으로 그려서 정리하자.
-
IO는 눈으로 읽는 것보다 손으로 그려보는 게 훨씬 이해가 빠르다.
-
표준 입출력 개념만 정확히 이해해도, 파일, 네트워크, DB IO 모두 꿰뚫을 수 있다.
📚 관련 자료
좋습니다. 아래에 자바 표준 입출력 관련 개념들을 시각적으로 정리한 도식, 흐름도, 클래스 다이어그램을 순차적으로 제공합니다.
모두 텍스트 기반으로 제공하지만, 원하시면 이미지 파일(PNG, SVG 등)로도 그려드릴 수 있습니다. 우선 지금은 글 기반으로 먼저 보여드릴게요.
🧠 1. 자바 표준 입출력 구조 (개념도)
[키보드] [모니터]
↓ ↑
+-------------+ +-------------+
| System.in | | System.out |
| (InputStream)| | (PrintStream)|
+-------------+ +-------------+
↓ ↑
[Scanner] [System.out.println()]
↓
사용자 입력 처리
-
System.in은 바이트 스트림 →Scanner또는InputStreamReader를 통해 문자로 변환 -
System.out은 텍스트 출력용 스트림 (PrintStream)
🔄 2. 입출력 분류 흐름도 (바이트 vs 문자)
┌────────────────────────────────────┐
│ 자바 입출력 (IO) │
└────────────────────────────────────┘
↓
┌────────────────────────┐
│ 스트림(Stream) │
└────────────────────────┘
↓ ↓
[입력 스트림] [출력 스트림]
↓ ↓
┌──────────────┐ ┌──────────────┐
│ 바이트 기반 │ │ 바이트 기반 │
└──────────────┘ └──────────────┘
| InputStream | OutputStream
| FileInputStream | FileOutputStream
| System.in | System.out(PrintStream)
┌──────────────┐ ┌──────────────┐
│ 문자 기반 │ │ 문자 기반 │
└──────────────┘ └──────────────┘
| Reader | Writer
| InputStreamReader | OutputStreamWriter
| BufferedReader | BufferedWriter
🧩 3. 클래스 다이어그램 – 주요 IO 클래스들 (간략 버전)
java.lang.Object
↑
┌─────────────┐
│ InputStream│ (추상 클래스)
└─────────────┘
↑
┌──────────────┐
│ FileInputStream
└──────────────┘
↑
┌──────────────┐
│ System.in │ (InputStream의 static 인스턴스)
└──────────────┘
↓
┌─────────────────────┐
│ InputStreamReader │ (InputStream → 문자 변환)
└─────────────────────┘
↓
┌─────────────────────┐
│ BufferedReader │ (라인 단위 입력)
└─────────────────────┘
java.lang.Object
↑
┌─────────────┐
│ OutputStream│ (추상 클래스)
└─────────────┘
↑
┌──────────────┐
│ FileOutputStream
└──────────────┘
↑
┌──────────────┐
│ System.out │ (PrintStream 인스턴스)
└──────────────┘
🔍 4. 입출력 실습 예제 흐름 (Scanner 예제 기준)
[사용자 키보드 입력]
↓
System.in (InputStream)
↓
Scanner
↓
next(), nextInt() 등 메서드로 가공
↓
변수에 저장 후 조건 분기
↓
System.out.println() 출력
↓
모니터 출력
📂 5. 파일 입출력 흐름도 (FileInputStream 기준)
[test.txt 파일]
↓
FileInputStream("test.txt")
↓
.read() 메서드로 바이트 단위 읽기
↓
데이터 가공 (byte → char 등)
↓
System.out으로 출력
📌 용어 요약 정리
| 용어 | 설명 |
|---|---|
| Stream | 데이터의 흐름을 추상화한 클래스 |
| InputStream | 바이트 단위 입력 스트림 |
| OutputStream | 바이트 단위 출력 스트림 |
| Reader | 문자 단위 입력 스트림 |
| Writer | 문자 단위 출력 스트림 |
| System.in | 표준 입력 (InputStream) |
| System.out | 표준 출력 (PrintStream) |
| Scanner | 다양한 타입으로 입력을 받기 위한 도구 |
| InputStreamReader | 바이트 스트림 → 문자 스트림 변환기 |
| BufferedReader | 문자 입력을 효율적으로 처리 (버퍼 사용) |
🖼 원한다면 이런 식으로 이미지로 그릴 수 있음
예를 들어 자바 입출력 구조 그림을 이미지화하면 다음과 같이 나올 수 있습니다:
[키보드 입력] --> [System.in] --> [Scanner / InputStreamReader] --> [변수에 저장 / 조건처리]
↓
[System.out.println()]
↓
[모니터 출력]
✅ 정리하자면…
-
자바 IO는 스트림 기반이고, 기본적으로
System.in,System.out을 사용 -
입출력은 바이트 스트림 ↔ 문자 스트림 으로 나뉜다
-
Scanner,InputStreamReader등의 도구로 입력을 더 편리하게 받을 수 있음 -
기본 구조를 그림으로 이해해야 JDBC, 네트워크 IO, 파일 IO 등 응용이 쉬움
필요하시면 위 내용 기반으로 직접 이미지(PNG/다이어그램 형태) 제작도 가능합니다.
예: Lucidchart, Draw.io 스타일의 다이어그램으로 제공해드릴 수 있어요.
이미지로 변환 원하세요? → "이미지로 그려줘"라고 알려주세요!
댓글
댓글 쓰기