C# 빠른 입출력
C# 에서는 빠른 입출력을 위해서 StreamReader
, StreamWriter
, BufferStream
, StringBuilder
를 지원한다.
BufferedStream
입출력 스트림
을 버퍼링
하여 성능을 향상 시키는 클래스
버퍼링
? : 입출력 작업을 한 번에 한 바이트씩 처리하는 것이 아니라블록
단위로 처리하는 개념으로한번에 많은양의 데이터를 처리
해서입출력 작업의 효율
을 높입니다.
스트림
? :데이터의 연속적인 흐름
을 나타내는 개념으로 파일, 네트워크 메모리 등 다양한 소스와 대상으로부터 데이터를 읽거나 쓸 때 사용되며,데이터의 흐름을 추상화
한것.
Stream 클래스는 이런 스트림을 다루는 여러 메소드를 제공하고
BufferedStream 클래스는 이런 Stream 클래스를 상속해서 스트림을 버퍼링하여 처리한다.
StreamReader , StreamWriter
System.IO
에 속해있는 클래스
StreamReader
는 어떤 Stream을 읽는다.
즉, 어떤 입력(파일 , 네트워크 , 메모리)
의 내용을 알아낼수있다.
StreamWriter
는 어떤 Stream을 쓴다.
즉, 어떤 목적지로 향하는 출력(파일, 네트워크 ,메모리)에 내용을 추가한다.
StringBuilder
StringBuilder는 문자열 클래스이다.
그렇다면 String과 다른점
은 무엇일까?
둘의 차이점은 String
은 불변
한 특성을 가지고 있기 때문에 값을 참조
(ref)로 받아서 새로운 문자열을 만들 때 기존 문자열은 그대로 두고
새로운 인스턴스(문자열)을 다시 생성한다.
즉, string에 문자열을 + 할때마다 우리는 계속해서 새로운 문자열을
생성
하고 있었다는 것이다.
하지만 StringBuilder는 내부적으로 값들을 조합하고 삭제해서
문자열을 +할때 새로운 인스턴스를 생성하지 않는다!!
Console.OpenStandardInput(), Console.OpenStandardOutput()
Console.ReadLine()이 텍스트 입력을 하나씩 읽어오는 메서드라면
OpenStandardInput()은 바이트 스트림
을 열어주는 메서드로,
OpenStandardInput()을 통해 스트림이 내 프로그램으로 흘러들어오게된다.
그럼 왜 ReadLine()만 입력했을때도 텍스트 == 스트림을 읽을 수 있었을까? 사실 ReadLine() 메서드는 내부적으로 OpenStandardInput()을 호출한후 스트림을 받아서 String으로 변경하고 있었다!
결국 OpenStandardInput()메소드가 실행된 후 어떠한 스트림
입력 있었다면
Console객체는 해당 스트림을 저장하게 된다!