초등학생에게 알려주는 자바 입출력 (2) – BufferedWriter vs System.out.print() (feat.StringBuilder)

Huiju Lee·2023년 10월 25일
2

알고리즘

목록 보기
2/9
post-thumbnail

배경

코딩 테스트를 하거나 자바로 프로그램을 만들 때, 출력을 잘하는 것이 아주 중요해요. 예를 들어, 게임에서 점수를 보여줄 때나, 프로그램의 결과를 화면에 출력할 때 제대로 나와야 해요. 우리가 자바를 처음 배울 때 사용했던 System.out.print()은 가장 기본적인 방법이에요. 하지만 데이터를 많이 출력할 때는 다른 방법이 더 빠르고 좋아요.

그래서 이번에는 자바의 여러 출력 방식 중에서 System.out.print()BufferedWriter를 비교해 보기로 했어요. 택배를 보내는 방법처럼 이해해 보자구요!


택배 배송해보기

저번시간에는 뷔페에서 음식을 가져오는 접시에 비유했었는데 오늘은 택배 상자로 이야기 해볼게요

자, 이제 출력 방식을 택배 배송으로 생각해볼게요. 택배를 보낼 때, 작은 상자를 여러 번 보내는 것과, 큰 상자에 여러 물건을 한꺼번에 담아서 보내는 것, 어떤 게 더 빠를까요?

System.out.print()

  • *System.out.print()**은 작은 상자를 한 번에 하나씩 보내는 것과 같아요. 물건을 바로바로 보내니까 편리하긴 하지만, 여러 번 보내야 하니까 시간이 많이 걸릴 수 있어요.
System.out.print("Hello World!");

이처럼 작은 데이터를 바로 화면에 출력하는데, 큰 데이터를 여러 번 보내야 할 때는 시간이 걸릴 수 있어요.

BufferedWriter

BufferedWriter는 큰 상자에 물건을 많이 담아 한꺼번에 보내는 것과 같아요. 한 번에 많은 양을 보내기 때문에 시간이 절약되고 더 효율적이에요. 그래서 데이터를 많이 출력해야 할 때는 BufferedWriter가 더 빨라요.

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("Hello World!"); // 데이터를 버퍼에 담아 두어요.
bw.flush(); // 버퍼에 있는 데이터를 한꺼번에 출력해요.
bw.close(); // 스트림을 닫아요.

Buffering이란 무엇일까?

BufferedWriter는 데이터를 버퍼라는 큰 통에 미리 담아두었다가 한꺼번에 꺼내서 출력해요. 그래서 데이터를 여러 번 출력하지 않아도 되니까 더 빠르고 효율적이에요. 마치 큰 상자에 물건을 많이 담아 택배를 한 번에 보내는 것처럼요!


String 그리고 StringBuffer/StringBuilder

자바에서는 문자열을 다루는 방법도 여러 가지가 있어요. String, StringBuffer, StringBuilder 세 가지 방법이 있는데, 어떤 게 어떤 상황에 좋을지 비교해볼게요.

String

  • String은 한 번 만들면 바꿀 수 없어요. 마치 택배 상자가 밀봉되어 있어서, 다시 열 수 없는 것과 같아요.
  • 여러 쓰레드가 동시에 사용할 때 안전해요.

StringBuffer

  • StringBuffer는 한 번 만든 후에도 바꿀 수 있어요. 그래서 여러 번 문자열을 수정하거나 추가할 때 좋아요.
  • 쓰레드가 여러 개 있을 때도 안전하게 쓸 수 있어요.

StringBuilder

  • StringBuilderStringBuffer처럼 바꿀 수 있지만, 여러 쓰레드가 동시에 사용할 때는 안전하지 않아요.
  • 대신, 쓰레드가 한 개일 때는 아주 빠르게 동작해요. 코딩 테스트처럼 빠른 작업이 필요할 때 사용하면 좋아요.
StringBuilder sb = new StringBuilder("Hello ");
sb.append("World!");
System.out.println(sb);

StringBuilder는 큰 상자에 물건을 계속 넣고 빼는 것처럼, 문자열을 빠르게 만들고 수정할 수 있어요!


결론

BufferedWriter는 큰 데이터를 출력할 때 아주 효율적이에요. 많은 데이터를 한꺼번에 보내니까 시간을 절약할 수 있거든요. StringBuilder는 문자열을 자주 수정해야 할 때 빠르게 사용할 수 있는 좋은 방법이에요. 이처럼 상황에 맞는 방법을 잘 선택하면, 코딩 테스트에서도 더 빠르고 좋은 프로그램을 만들 수 있어요!


쓰레드 참고

쓰레드를 쉽게 설명하면, 한 팀의 일꾼들이 동시에 여러 일을 나누어 하는 것이라고 생각하면 돼요. 예를 들어, 우리가 하나의 프로그램이라고 상상해보자구요. 그런데 이 프로그램 안에서 할 일이 너무 많아서 한 사람이 다 처리하면 시간이 오래 걸릴 거예요. 그래서 여러 명의 일꾼들이 동시에 일을 나누어 처리할 수 있도록 도와주는 게 바로 쓰레드예요.

피자 가게에서 일하기

피자 가게에서 피자를 만들고, 배달하고, 주문을 받는 일을 한다고 생각해봐요. 만약 피자 가게에 일꾼이 한 명만 있다면, 그 사람은 피자도 만들고, 배달도 하고, 주문도 받아야 할 거예요. 그래서 시간이 오래 걸리겠죠?

그런데 피자 가게에 일꾼이 세 명 있다면 어떻게 될까요? 한 사람은 피자를 만들고, 한 사람은 배달을 하고, 다른 한 사람은 주문을 받아요. 이렇게 되면 세 명이 동시에 일을 나누어 하니까, 피자가 더 빨리 만들어지고, 손님들도 빨리 피자를 받을 수 있겠죠?

쓰레드의 역할

쓰레드는 피자 가게의 일꾼들처럼, 프로그램 안에서 동시에 여러 가지 일을 처리할 수 있게 도와줘요. 하나의 쓰레드는 피자를 만드는 일처럼, 하나의 일을 처리해요. 그래서 프로그램이 더 빨리 동작하고, 여러 작업을 한꺼번에 할 수 있게 도와준답니다.


쓰레드 안전성(Thread Safety)이란?

쓰레드가 여러 개 있다 보면, 서로 동시에 일을 하다가 충돌이 일어날 수 있어요. 마치 피자 가게에서 피자를 만드는 일꾼과 배달을 하는 일꾼이 서로 부딪혀서 피자를 떨어뜨리는 것처럼요. 이런 충돌이 생기지 않도록 하는 것이 바로 쓰레드 안전성(Thread Safety)이에요.

예를 들어, 쓰레드가 여러 개 있을 때, 각자 맡은 일이 잘 나누어져 있어야 안전해요. 피자 가게에서 일꾼들이 서로 맡은 일을 잘 나누어 처리해야 가게가 문제 없이 운영될 수 있는 것처럼요!

참고 자료

자바 공식 문서 - https://docs.oracle.com/en/java/javase/17/docs/api/index.html

profile
이프로의 개발블로그

0개의 댓글