문자 기반 스트림 - 13

목차

    문자 기반 스트림

    💡 학습 목표
        1. 문자 기반 스트림의 사용 이유
        2. 문자 기반 스트림의 기본 클래스
        3. 문자 인코딩에 따른 바이트 수

    1. 문자 기반 스트림의 사용 이유

    문자 기반 스트림은 텍스트 데이터(문자 데이터)를 처리할 때 사용된다.

    • 문자 인코딩 처리 : 문자 기반 스트림은 자동으로 플랫폼의 기본 문자 인코딩을 사용하여 문자 데이터를 올바르게 인코딩하거나 디코딩한다. 이는 다양한 문자 인코딩을 처리하면서 발생할 수 있는 복잡성을 추상화하고, 개발자가 문자 데이터를 쉽게 처리할 수 있도록 돕는다.
    • 국제화 지원 : 유니코드와 같은 다국어 지원을 통해 전 세계적으로 소프트웨어를 배포할 때 필수적이다. 문자 기반 스트림을 사용하면 다양한 언어의 문자 처리가 간편해진다.
    • 가독성 및 편의성 : 문자 데이터를 읽고 쓰는 코드를 작성할 때, 문자 기반 스트림을 사용하면 바이트를 직접 처리하는 것보다 더 직관적이고 오류가 적은 코드를 작성할 수 있다.

    2. 문자 기반 스트림의 기본 클래스

    • Reader: 문자 입력 스트림의 모든 클래스의 상위 클래스.
    • Writer: 문자 출력 스트림의 모든 클래스의 상위 클래스.

    시나리오 코드 1 - 표준 입력출 확인 (복습)

    package io.ch02;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     * 한 바이트를 받아서 char로 변환 InputStreamReader 사용
     * 
     */
    public class SingleCharReader {
    
    	public static void main(String[] args) {
    		System.out.println("문자 하나를 입력하세요:");
    		// 시나리오 1 - InputStream 사용 
    		// 키보드에서 값을 받아 내는 표준 입력 복습 
    		// InputStream 은 추상클래스로 설계 되어 있다.
    		// InputStream isr = System.in(키보드) 사용
    		try (InputStream isr = System.in) {
    			// 첫 번째 문자를 읽습니다.
    			int charData = isr.read(); // 바이트를 읽고 int로 반환합니다.
    			if (charData != -1) { // 파일 끝(EOF)가 아니라면
    				char character = (char) charData; // int를 char로 변환합니다.
    				System.out.println("입력된 문자: " + character);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }

     

    표준 입출력 사용시 - 영어는 괜찮으나 한글 사용시 깨짐 발생 1byte 로 한글 표현 불가

    문자 하나를 입력하세요:
    한
    입력된 문자: í

    3. 문자 인코딩에 따른 바이트 수

    • ASCII : 모든 문자가 하나의 바이트로 표현.
    • UTF-8 : 가변 길이 문자 인코딩 방식을 사용하며, 문자에 따라 1바이트에서 4바이트까지 사용할 수 있다.
      영문자 및 숫자는 일반적으로 1바이트를 사용하고, 한글이나 다른 유니코드 문자는 2바이트 이상을 사용할 수 있다.
    • UTF-16 : 대부분의 문자가 2바이트를 사용하며, 일부 보충 문자는 4바이트를 사용한다.
    • ISO-8859-1 : 모든 문자가 1바이트로 표현된다.
    InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");

    시나리오 코드 2 - InputStreamReader의 사용

    InputStreamReader는 한 바이트씩 읽는게 아니라 한번에 하나의 문자를 읽음. 읽는 바이트 수는 사용되는 문자 인코딩에 따라 달라 진다.
    package io.file.ch04;
    
    import java.io.InputStreamReader;
    
    public class SingleCharReader {
    
    	public static void main(String[] args) {
    
    		// 문자 기반의 InputStreamReader 사용 방법
    		// ** 중요 **
    		// InputStreamReader 는 한 바이트 씩 데이터를 읽는 것이 아니라
    		// 하나의 문자 단위로 읽음 !!!
    
    		System.out.println("문자 하나를 입력 하세요");
    
    		// try catch resource
    		try (InputStreamReader isr = new InputStreamReader(System.in)) {
    			
    			// 한 <-- 통으로 읽음 --> InputStreamReader
    			// 한 <-- 한 바이트로는 못 읽음 --> InputStream
    			int charData = isr.read(); // 사용자가 키보드에 값을 입력할 때 까지 대기
    			if (charData != -1) {
    				// -1 --> 파일 끝 (EOF) 가 아니라면 출력 // EOF : End Of File
    				// char --> 2byte (한글은 2byte로 거의 모든 글자 표현이 가능하다
    				System.out.println("사용자가 입력한 값 : " + (char)charData);
    			}
    		} catch (Exception e) {
    			System.out.println("뭔가 잘못 되었습니다.");
    			e.printStackTrace();
    		}
    
    	} // end of main
    
    }

    시나리오 코드 3 - BufferedReader 사용해보기

    package io.file.ch04;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    public class MyBufferedReadConsoleIO {
    
    	public static void main(String[] args) {
    
    		// 문자 기반 스트림 + 보조 문자 기반 스트림을 사용한다. !!
    
    		try (InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");
    				BufferedReader br = new BufferedReader(isr)) {
    
    			// isr -> 한 문자씩 읽는 기능 read() 를 가짐
    			// br -> 한번에 한 라인씩 읽은 수 있는 기능을 가짐
    			System.out.println("더 많은 텍스트를 입력 하세요 (한줄 단위) -> 엔터");
    
    			// isr.read(); --> 기능의 확장인
    			String inputUserData = br.readLine();
    			System.out.println("입력 확인 : " + inputUserData);
    
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    	}
    
    }

    시나리오 코드 4 - BufferedReader 와 기능 확장 (while 문 사용)

    package io.file.ch04;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    // 문자 기반 스트림 + 보조 문자 기반 스트림 확인
    // 한줄 입력 하면 종료 됨
    // 여러줄 반복저으로 동작할 수 있도록 기능을 추가해주세요
    public class StandardInputExample {
    
    	public static void main(String[] args) {
    
    		// 데이터를 통으로 관리하고 싶다면 --> 자료구조 --> 적절한 자료 구조를 선택
    		List<String> lines = new ArrayList<String>();
    
    		System.out.println("여러 줄의 텍스트를 입력하세요");
    		System.out.println("입력을 종료하려면 빈 줄에서 엔터를 누르세요");
    
    		try (InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");
    				BufferedReader br = new BufferedReader(isr)) {
    
    			String line;
    			// "" --> 엔터 --> line.isEmpty() -- ! --> F --> 실행이 종료된다
    			while ((line = br.readLine()) != null && !line.isEmpty()) {
    				lines.add(line);
    				// System.out.println("입력 확인 : " + line);
    			}
    			for (String data : lines) {
    				System.out.println(data);
    			}
    			System.out.println("프로그램 종료 처리");
    
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    	}
    
    }

    Java 유용한 클래스 - 3 으로 돌아가기