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단계

  1. 파일 열기
    new FileInputStream()

  2. 파일 엑세스
    read(), write(), flush()

  3. 파일 닫기
    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 스타일의 다이어그램으로 제공해드릴 수 있어요.

이미지로 변환 원하세요? → "이미지로 그려줘"라고 알려주세요!

댓글