작성자 | 이재영 |
일 시 | 2024. 10. 01 (화) 18:00 ~ 21:00 |
장 소 | 복지관 b128-1호 |
참가자 명단 | 임혜진, 이재영, 성창민, 김명원, 장원준 |
사 진 |
목차
- print, println, printf
- BufferedWriter
- StringBuilder, StringBuffer
이번 주차에는 출력을 주제로 스터디를 진행하려고 한다. 자바가 어렵게 느끼는 이유 중 하나가 나는 이런 '기본기' 때문이라고 생각한다. 입/출력의 방식이 다른 언어와 비교해서 너무 다양해 어느 상황에 뭐를 사용해야 더 효율적인지 판단하기 힘들다. 그래서 이번 주차에서 다양한 출력 방식에 대해 공부하고 기본을 더 다져보려고 한다.
1. print, println, printf
자바를 공부하면 가장 먼저 배우는 출력 방식이다. 3가지 방법 모두 콘솔에 출력을 할 때 사용되지만, 각각의 기능과 동작 방식에 차이가 있다.
전달된 값을 줄바꿈 없이 출력하는 메서드이다.
System.out.print("Hello ");
System.out.print("World");
이런 식으로 print() 메서드는 연속해서 호출하면, 출력이 한 줄에 이어서 나타난다. 즉, 출력 후 커서가 같은 줄에 머무르는 것이다.
println
전달된 값을 출력한 후 자동으로 줄바꿈을 해주는 메서드이다.
System.out.println("Hello");
System.out.println("World");
이런 식으로 println() 메서드는 각 출력 후 자동으로 줄바꿈이 이루어져, 다음 출력이 새로운 줄에 시작된다.
printf
형식화된 출력을 할 때 사용되는 메서드로, 포맷팅된 문자열을 출력할 수 있다. C언어의 printf()와 유사한 포맷 타입을 가지고 있다.
포맷 문자열
- %d : 정수
- %f : 실수
- %s : 문자열
- %c : 문자
int age = 25;
String name = "John";
System.out.printf("Name: %s, Age: %d%n", name, age);
이런 식으로 printf()는 형식 지정자를 사용하여 다양한 자료형을 형식화된 방식으로 출력할 수 있다. 자동 줄바꿈이 되지 않음으로, 줄바꿈이 필요할 때는 \n을 명시적으로 사용해야 한다.
2. BufferedWriter
BufferedWriter는 Java에서 제공하는 문자 기반 출력 스트림으로, 데이터를 버퍼에 저장한 후 출력하는 역할을 한다. 즉, 파일이나 다른 출력 스트림에 효율적으로 문자 데이터를 쓰기 위해 사용된다. 버퍼링을 통해 출력을 효율적으로 처리하므로, 자주 쓰기 작업을 수행할 때 성능을 크게 향상시킬 수 있다.
주요 특징 및 동작
- 버퍼링(buffering) 기능:
- BufferedWriter는 데이터를 버퍼에 모아두었다가 한꺼번에 출력한다. 이를 통해 매번 출력할 때마다 디스크나 네트워크와 같은 느린 I/O 장치로 접근하는 것을 줄이고, 출력 작업의 효율성을 높인다..
- 작은 단위로 자주 쓰기보다 버퍼에 모아서 한꺼번에 쓰기 때문에 성능이 향상된다.
- 연결 방식:
- BufferedWriter는 다른 Writer 객체를 감싸는 방식으로 사용된다. 예를 들어, FileWriter를 감싸서 사용하면, 파일에 데이터를 버퍼링하여 효율적으로 출력할 수 있다.
- 버퍼 플러시(flush):
- 버퍼에 쌓인 데이터를 실제로 출력 장치로 내보내려면, flush() 메서드를 호출해야 한다. flush()는 버퍼에 남아 있는 데이터를 모두 출력하고 버퍼를 비운다.
- close() 메서드를 호출할 때 자동으로 flush()가 호출되지만, 중간중간 강제로 데이터를 출력하고 싶을 때 flush()를 수동으로 호출할 수 있다.
- 자동 줄바꿈 기능:
- BufferedWriter는 newLine() 메서드를 제공해 운영체제에 맞는 줄바꿈 문자를 자동으로 추가한다. 이 방식으로 줄바꿈을 안전하게 처리할 수 있다.
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) {
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out))) {
writer.write("Hello, World!"); // 문자열을 버퍼에 씀
writer.newLine(); // 줄바꿈
writer.write("This is a BufferedWriter example.");
writer.flush(); // 버퍼에 있는 데이터를 파일로 강제 출력
} catch (IOException e) {
e.printStackTrace();
}
}
}
주요 메서드
- write(String str) : 문자열을 버퍼에 쓴다.
- newLine() : 줄바꿈을 추가한다. 운영체제에 맞는 줄바꿈 문자를 자동으로 삽입한다.
- flush() : 버퍼에 있는 데이터를 실제 출력 장치로 내보낸다.
- close() : 스트림을 닫고, 남아있는 데이터를 모두 출력한 후 자원을 해제한다.
장점
- 성능 향상 : 데이터를 버퍼링하여 한꺼번에 출력함으로써 빈번한 출력 작업에 따른 성능 저하를 방지합니다.
- 줄바꿈 처리의 편리함 : newLine() 메서드를 통해 운영체제에 맞는 줄바꿈을 처리할 수 있어, 플랫폼 간 호환성을 유지할 수 있다.
BufferedWriter는 문자 데이터를 출력할 때 버퍼링을 통해 효율성을 높이는 클래스로, 특히 반복적인 쓰기 작업에서 성능을 개선할 수 있어, 데이터를 효율적으로 처리하는 데 유용하다.
3. StringBuilder, StringBuffer
이 두 클래스는 둘 다 Java에서 가변 문자열을 다루는 클래스이다. 모두 문자열을 효율적으로 조작할 수 있는 방법을 제공하지만, 가장 큰 차이는 스레드 안전성과 성능에 있다.
StringBuilder
- 동기화 여부: StringBuilder는 동기화되지 않는다. 즉, 멀티스레드 환경에서 안전하지 않다.
- 성능: StringBuilder는 동기화 처리가 없기 때문에 단일 스레드 환경에서 더 빠른 성능을 제공한다.
- 사용 시기: 단일 스레드 환경에서 문자열을 자주 변경하거나 조작할 때 사용된다.
- 주요 특징:
- 문자열을 추가, 수정, 삭제하는 작업을 효율적으로 처리한다.
- 불필요한 메모리 할당을 방지하며, String과 달리 객체가 변경될 때 새로운 객체를 생성하지 않기 때문에 메모리 효율이 좋다.
StringBuilder sb = new StringBuilder();
sb.append("Hello ");
sb.append("World");
System.out.println(sb.toString());
StringBuffer
- 동기화 여부: StringBuffer는 동기화된다. 즉, 멀티스레드 환경에서도 스레드 안전성을 보장한다.
- 성능: 동기화 처리로 인해 StringBuilder에 비해 성능이 다소 느리다. 하지만 여러 스레드가 동시에 문자열을 조작해야 할 경우에는 안정성을 보장한다.
- 사용 시기: 멀티스레드 환경에서 문자열을 자주 변경해야 할 때 사용된다.
- 주요 특징:
- StringBuffer는 동기화 덕분에 멀티스레드 환경에서도 안전하게 문자열을 처리할 수 있지만, 동기화 처리로 인해 단일 스레드 환경에서는 속도가 느릴 수 있다.
StringBuffer sbf = new StringBuffer();
sbf.append("Hello ");
sbf.append("World");
System.out.println(sbf.toString());
오늘은 출력의 종류에 대해서 알아보고 직접 사용해보았다. 확실히 내가 모르는 클래스가 많다는 것을 느꼈고, 여러가지 방면에서 입출력을 사용해봐야겠다고 느꼈다.