[C#] 빠른 입력과 출력

Learning 

When: 1학년 5월 4일

 

How:

백준 문제를 풀다가 출력할 숫자를 입력 받은 후 숫자 두 개를 입력받고, 그대로 더해서 출력을 하는 아주 간단한 문제가 나왔는데, 처음에 살짝 이상하긴 했지만 그냥 for문으로 해결을 하였습니다. 거기서 제가 간과한 사실은 출력을 할 숫자가 너무나도 많아서 시간 초과가 난다는 것이었습니다.

 

Understanding:

학교에서 최적화는 배우지 않아서 어떤 방식으로 해결해야 할지조차 몰랐기 때문에 해설을 봤는데, 해설을 봐도 이해가 안 돼서 그냥 GPT에게 물어보았습니다. 이 문제를 해결하기 위해서는 StreamReader와 StreamWriter에 대해 배워보았습니다.

조금 어려운 내용이라 완벽하게 알지는 못한 것 같지만 일단 설명해보자면, 둘 다 Console에 입력, 출력을 하는 Console 클래스와 비슷한데, 이 클래스들은 Console 말고도 파일, 네트워크 등 다른 곳에서 읽고 쓸 수 있고, 빠른 출력과 입력을 도와주는 클래스입니다.

        var reader = new StreamReader(Console.OpenStandardInput());
        var writer = new StreamWriter(Console.OpenStandardOutput());

        int n = int.Parse(reader.ReadLine());
        for (int i = 0; i < n; i++)
        {
            int[] s = Array.ConvertAll(reader.ReadLine().Split(), int.Parse);
            writer.Write(s[0] + s[1] + "\n");
        }
        writer.Flush();

StreamReader

일단 StreamReader부터 설명을 해보겠습니다. StreamReader는 클래스이기 때문에 new StreamReader() 생성자로 선언을 해주면 되는데, 이때 생성자의 매개변수에는 Console.OpenStandardInput()이라는 메서드를 넣어서 Console의 입력을 받을 것이라는 것을 알려주면 됩니다. (이것에 대해 더 자세하게는 알 필요가 없다고 GPT가 말해주었습니다... 파일이나 네트워크의 입력을 받겠다는 메서드도 있습니다.)

그리고 그 생성자를 참조하는 변수를 하나 생성한 다음, 그 변수.ReadLine() 메서드를 사용하면 Console.ReadLine() 메서드와 거의 비슷하게 사용할 수 있지만 이것이 조금 더 빠른 특징이 있습니다.

그럼 왜 이것을 쓰지 않고 Console을 쓰냐 하면 여러 이유가 있는데, 첫 번째로 이것은 Console만을 위한 것이 아니라 다른 것에도 사용해야 하기 때문에 Console.ReadLine() 같이 콘솔에서만 사용할 수 있게 만들지 않고, 객체지향주의인 C#에 맞게 객체를 만들어서 생성자에서 어떤 것에서 값을 받을 것인지 선언을 해줘야 합니다. 즉, 조금 더 귀찮고 줄이 깁니다.

그리고 이것은 입력 형식이 바뀌거나 줄 수가 달라지면 예외 처리도 신경 써야 하기에 일반적인 상황에서 몇 줄 입력받고 몇 줄 쓰는 것을 생각하면 StreamReader를 사용할 이유가 없다고 볼 수 있습니다.

StreamWriter

StreamWriter는 Console.ReadLine과 거의 비슷하게 사용되었던 StreamReader와 다르게, Console.WriteLine과는 조금 다르게 쓰였는데, 일단 이것도 이름이 비슷하듯 객체지향주의의 성격을 가지고 있어 사용할 때 객체를 만들어서 콘솔, 파일, 네트워크 등 어디에 사용할지 new 생성자로 정해야 하고, 그 생성자를 참조하는 변수에서 메서드를 사용해서 사용하는 등 StreamReader와 비슷하게 사용됩니다.

StreamWriter는 따로 콘솔을 만든 다음, Write(), WriteLine() 등의 메서드로 그곳에 미리 출력을 하고 Flush() 메서드로 한꺼번에 전부 실제로 사용하는 Console에 출력하는 방식이라고 생각할 수 있습니다.

이것도 StreamReader와 마찬가지로, Console.WriteLine() 메서드보다는 빠르지만 사용하기 귀찮고, 보통은 몇 줄밖에 출력하지 않는다는 등 여러 이유로 Console.WriteLine보다 덜 쓰입니다.

 

Result: 출력과 입력이 많아 시간이 오래 걸린다면 StreamReader와 StreamWriter 클래스를 사용해 출력과 입력을 하여 빠르게 할 수 있지만, 일반적인 상황에선 굳이 사용할 필요가 없습니다.

'C#' 카테고리의 다른 글

[C#] 프로퍼티  (0) 2025.05.13
[C#] 다형성  (0) 2025.05.12
[C#] switch문  (0) 2025.05.03
[C#] 동기와 비동기  (0) 2025.04.30
[C#] 오브젝트 풀링과 스택  (0) 2025.04.29