[Day 9 | Java] I/O Stream을 활용한 Scanner 기능 구현

y♡ding·2024년 10월 24일
0

데브코스 TIL

목록 보기
51/163

자바에서 표준 입력(키보드 입력)을 받기 위해 보통 Scanner 클래스를 많이 사용하지만, InputStream보조 스트림을 통해 동일한 기능을 구현할 수 있습니다. 이를 통해 다양한 방식으로 사용자 입력 처리다국어 지원을 할 수 있습니다. 여기서는 InputStream, InputStreamReader, BufferedReader를 사용하여 입력을 처리하는 방법을 사용합니다.


1. InputStream을 사용한 입력 받기

System.in을 통해 바이트 스트림InputStream을 사용하여 한 글자씩 입력받을 수 있습니다. 하지만, 기본적으로 ASCII 문자만 처리할 수 있기 때문에 다국어 지원이 어렵습니다.

코드 예시:

package com.io1;

import java.io.IOException;
import java.io.InputStream;

public class IOEx21 {
    public static void main(String[] args) {
        InputStream is = null;
        try {
            is = System.in;

            System.out.print("입력 : ");
            int data = is.read(); 
            System.out.println("입력값 : " + (char) data); // 다운캐스팅
        } catch (IOException e) {
            System.out.println("[에러] " + e.getMessage());
        } finally {
            if (is != null) { try { is.close(); } catch (IOException e) {} }
        }
    }
}

결과:
입력: aaa
입력값: a

2. 다국어 지원: InputStreamReader 사용

InputStreamReaderInputStream문자 스트림으로 변환하는 역할을 하여 다국어(유니코드) 입력을 지원합니다.

코드 예시:

package com.io1.systen;

import java.io.IOException;
import java.io.InputStreamReader;

public class IOEx22 {
    public static void main(String[] args) {
        InputStreamReader isr = null;
        try {
            isr = new InputStreamReader(System.in);

            System.out.print("입력 : ");
            int data = isr.read(); // 한 글자 입력
            System.out.println("입력값 : " + (char) data);
        } catch (IOException e) {
            System.out.println("[에러] " + e.getMessage());
        } finally {
            if (isr != null) { try { isr.close(); } catch (IOException e) {} }
        }
    }
}

결과:
입력:
입력값:

3. BufferedReader 사용하여 효율적인 다국어 처리

BufferedReader버퍼링 기능을 추가하여 입력 속도를 향상시키고, 한 글자가 아닌 한 줄을 처리할 수 있는 기능을 제공합니다.

코드 예시 (한 글자 읽기):

package com.io1.systen;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class IOEx22 {
    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(System.in));

            System.out.print("입력 : ");
            int data = br.read(); // 한 글자 입력
            System.out.println("입력값 : " + (char) data);
        } catch (IOException e) {
            System.out.println("[에러] " + e.getMessage());
        } finally {
            if (br != null) { try { br.close(); } catch (IOException e) {} }
        }
    }
}

결과:
입력:
입력값:


4. BufferedReader로 한 줄 입력 받기

BufferedReaderreadLine() 메서드를 사용하여 한 줄을 입력받을 수 있습니다. 이 메서드는 사용자가 입력을 완료할 때까지 대기하며, 줄 단위로 데이터를 처리합니다.

코드 예시:

package com.io1.systen;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class IOEx22 {
    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(System.in));

            System.out.print("입력 : ");
            String line = br.readLine(); // 한 줄 입력
            System.out.println("입력값 : " + line);
        } catch (IOException e) {
            System.out.println("[에러] " + e.getMessage());
        } finally {
            if (br != null) { try { br.close(); } catch (IOException e) {} }
        }
    }
}

결과:
입력: 가나다
입력값: 가나다


5. 무한 입력 루프 구현

입력을 계속 반복하다가 특정 조건(예: "exit" 입력)을 만나면 종료하는 무한 루프를 구현할 수 있습니다. 아래 코드는 사용자가 "exit"을 입력하면 루프를 빠져나갑니다.

코드 예시:

package com.io1.system;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class IOEx23 {
    public static void main(String[] args) {
        BufferedReader br = null;
        br = new BufferedReader(new InputStreamReader(System.in));

        try {
            while (true) {
                System.out.print("동이름을 입력하세요. 입력을 마치려면 'exit' 입력 > ");
                String strDong = br.readLine(); // 한 줄 입력

                if (strDong.equals("exit")) { // exit 입력 시 종료
                    break;
                }
                System.out.println("동 이름: " + strDong);
            }
            System.out.println("프로그램 종료");
        } catch (IOException e) {
            System.out.println("[에러] " + e.getMessage());
        } finally {
            if (br != null) { try { br.close(); } catch (IOException e) {} }
        }
    }
}

결과:

동이름을 입력하세요. 입력을 마치려면 'exit' 입력 > 서초동  
동 이름: 서초동  
동이름을 입력하세요. 입력을 마치려면 'exit' 입력 > exit  
프로그램 종료

정리

  1. InputStream: 기본적인 바이트 스트림으로 한 글자씩 입력받으며, ASCII 문자만 처리할 수 있어 다국어 지원에 한계가 있음.
  2. InputStreamReader: InputStream문자 스트림으로 변환하여 유니코드를 처리할 수 있음.
  3. BufferedReader: InputStreamReader에 버퍼링 기능을 추가하여 입력 속도를 높이고, 줄 단위 입력 처리 가능.
  4. 무한 루프: BufferedReaderreadLine()을 사용하여 사용자가 원하는 때까지 입력을 받을 수 있고, 특정 조건을 충족하면 루프를 종료하도록 설계할 수 있음.

0개의 댓글

관련 채용 정보