개발자 Saaad
[JAVA] 문자열 처리 과정에서 효율적인 방법 고찰 본문
Java에서 문자열 처리와 관련된 다양한 상황에서 입력과 출력 형태에 따라 효율적인 방법을 선택하는 것이 중요합니다.
특히 메모리 사용량과 처리 속도를 고려해 올바른 도구를 사용하는 것은 프로그램의 성능을 크게 향상시킬 수 있습니다.
아래에서는 문자열 처리에 따른 상황별 추천 방식을 정리했습니다.
1. 간단한 입력 + 다양한 출력 형태
설명
- 입력: 한 줄 문자열
- 출력: 여러 형식으로 가공된 결과 출력
- 추천 도구: StringBuilder + BufferedWriter (효율성 중시), Scanner 또는 BufferedReader (입력 방식 선택)
이유
- StringBuilder: 문자열을 추가하거나 수정할 때 빠른 성능을 제공합니다.
- BufferedWriter: 대량의 데이터를 출력할 때 효율적입니다.
- Scanner와 BufferedReader: 입력 방식은 간단한 작업에는 Scanner, 대량 데이터 작업에는 BufferedReader를 사용하는 것이 적합합니다.
1-1. Scanner를 활용한 예시
import java.util.Scanner;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
// 입력
System.out.println("Enter a string:");
String input = sc.nextLine();
// 다양한 출력 가공
sb.append(input.toUpperCase()).append("\n");
sb.append(input.toLowerCase()).append("\n");
sb.append(input.replace("World", "Java")).append("\n");
// 출력
bw.write(sb.toString());
bw.flush();
bw.close();
sc.close();
}
}
- Scanner 객체 sc를 이용해 간단한 입력을 받고, Stringbuilder 객체 sb를 이용해서 문자열을 가공합니다.
- 출력은 BufferedWriter객체 bw 를 이용해 sb 객체를 toString() 을 이용해 한번에 출력합니다.
1-2. BufferedReader를 활용한 예시
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
// 입력
System.out.println("Enter a string:");
String input = br.readLine();
// 다양한 출력 가공
sb.append(input.toUpperCase()).append("\n");
sb.append(input.toLowerCase()).append("\n");
sb.append(input.replace("World", "Java")).append("\n");
// 출력
bw.write(sb.toString());
bw.flush();
bw.close();
}
}
- BufferedReader 객체를 이용하여 문자열을 br.readLine()을 이용해 입력 받습니다.
- 마찬가지로 StringBuilder 객체를 이용해 입력받은 문자열을 자유롭게 가공할 수 있습니다.
- BufferedWriter 객체를 이용하여 문자열을 출력합니다.
결론
- 간단한 입력의 경우: Scanner가 직관적이고 사용하기 편리합니다.
- 대량 입력이나 성능이 중요한 경우: BufferedReader와 BufferedWriter의 조합이 적합합니다.
- 문자열 가공: StringBuilder를 사용하여 효율적인 작업이 가능합니다.
상황에 따라 입력 방식을 선택하고, 문자열 처리와 출력 방식은 항상 효율성을 염두에 두고 설계하는 것이 중요합니다
2. 복잡한 입력 + 출력 형태
예시
- 입력: 대량의 데이터, 다중 라인, 구분자로 구분된 값
- 출력: 가공된 결과를 파일이나 네트워크로 전송
추천 도구: BufferedReader + StringTokenizer + StringBuilder
- 이유:
- BufferedReader는 대량의 데이터를 빠르게 읽어들입니다.
- StringTokenizer는 복잡한 입력 데이터를 효율적으로 파싱합니다.
- StringBuilder는 처리된 데이터를 효율적으로 저장하며 추가 작업에 유리합니다.
예시:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line, " ");
while (st.hasMoreTokens()) {
sb.append(st.nextToken().trim()).append("\n");
}
}
System.out.println(sb.toString());
}
}
- BufferedReader 객체를 이용해 입력을 받고, 입력받은 문자열을 StringTokenizer 객체 st를 이용해 st.nextToken()을 이용해
공백을 통해 문자열을 분리하고 순차적으로 접근하며 "\n" 을 추가하여 sb 객체에 문자열을 추가합니다. - 공백을 통해 구분된 문자열을 sb객체에 추가하고, "\n"을 추가하는 방식
- 마지막에 System.out.println(sb.toString()); 을 통해 출력됩니다.
3. 간단한 입력 + 간단한 출력
예시
- 입력: 한 줄, 짧은 데이터
- 출력: 단순 결과 출력
추천 도구: Scanner + System.out.println
- 이유:
- 간단한 작업에는 직관적인 Scanner와 System.out.println 조합이 효율적입니다.
- 코드 작성과 이해가 용이하며, 부가적인 도구가 필요하지 않습니다.
코드 예시:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a number:");
int num = sc.nextInt();
System.out.println("You entered: " + num);
sc.close();
}
}
- 가장 간단한 방법입니다.
- 아주 복잡한 입력과 출력을 하는 것이 아니라면 사용해도 문제 없습니다.
성능 비교 표
상황추천 도구장점단점
간단한 입력 + 다양한 출력 | StringBuilder + BufferedWriter | 빠른 문자열 처리, 효율적인 출력 | 초기 학습 필요 |
복잡한 입력 + 출력 | BufferedReader + StringTokenizer + StringBuilder | 대량 데이터 처리에 최적화 | 코드가 다소 복잡 |
간단한 입력 + 간단한 출력 | Scanner + System.out.println | 직관적이고 간단한 코드 | 대량 데이터나 고성능 처리에는 부적합 |
결론
- 간단한 작업에는 직관적인 도구(Scanner, System.out.println)를 활용하여 코드 가독성을 유지합니다.
- 대량 데이터를 처리하거나 성능이 중요한 경우에는 BufferedReader와 StringBuilder 조합을 사용합니다.
- 작업의 복잡도에 따라 적절한 도구를 선택하면 성능을 높이고 메모리 사용을 줄일 수 있습니다.
마무리
작업의 특성과 목적에 맞는 문자열 처리 도구를 선택하는 것은 Java 프로그래밍에서 매우 중요합니다. 이 포스트를 통해 상황에 맞는 최적의 도구를 선택하는 기준을 정리했으니, 여러분의 코드 작성에 많은 도움이 되기를 바랍니다!
'학습 > kakao X goorm 풀스택12회차' 카테고리의 다른 글
[JAVA] BufferedReader를 이용해 값을 입력 받는 방법 (0) | 2025.01.14 |
---|---|
[React] React.memo, useCallback, useMemo (0) | 2025.01.08 |
[특강] 소프트웨어 개발 방법론에 의한 이슈트래커, 협업도구, 생산성 도구(1/6 1차 강의) (0) | 2025.01.06 |
[React] Redux 상태 관리 (redux-counterApp을 통해 실습) (1) | 2024.12.16 |
[JavaScript] 디자인 패턴 정리 (2) | 2024.12.14 |