효율적인 연결을 위한 StringBuilder
반복문과 복잡한 서식 지정 내부에서 문자열을 효율적으로 만들기 위해 StringBuilder를 사용합니다.
효율적인 연결을 위한 StringBuilder은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
효율적인 연결을 위한 StringBuilder
StringBuilder는 텍스트를 점진적으로 만들 때 사용할 수 있는, String의 가변적인 대안입니다. 많은 중간 String 객체가 생성되는 것을 방지합니다.
StringBuilder와 String 연결
많은 문자열을 연결할 때(특히 반복문 안에서) StringBuilder가 훨씬 빠릅니다. 새로운 객체를 만드는 대신 내부 char 버퍼를 변경하기 때문입니다.
// Inefficient: creates a new String every iteration
String result = "";
for (int i = 0; i < 1000; i++) {
result += i + ","; // 1000 new String objects!
}
// Efficient: StringBuilder uses a resizable char buffer
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i).append(',');
}
String efficient = sb.toString(); // one final String createdStringBuilder API
주요 메서드: append, insert, delete, replace, reverse, toString, 길이, charAt, setCharAt.
StringBuilder sb = new StringBuilder("Hello");
sb.append(", World"); // Hello, World
sb.insert(5, "!"); // Hello!, World
sb.delete(5, 6); // Hello, World
sb.replace(7, 12, "Java"); // Hello, Java
sb.reverse(); // avaJ ,olleH
sb.reverse(); // Hello, Java
System.out.println(sb); // Hello, Java
System.out.println(sb.length()); // 11
System.out.println(sb.charAt(0)); // Happend 호출 연결하기
모든 append 및 기타 변경 메서드는 this를 반환하므로 유창한 호출 연결이 가능합니다.
StringBuilder html = new StringBuilder()
.append("<div class=\"card\">")
.append("<h2>").append("Product Title").append("</h2>")
.append("<p>Price: $").append(String.format("%.2f", 29.99)).append("</p>")
.append("<button>Add to Cart</button>")
.append("</div>");
System.out.println(html.toString());초기 용량
예상 용량으로 StringBuilder의 크기를 미리 지정하면 내부 배열의 크기 조정을 방지하여 큰 문자열을 처리할 때 성능이 향상됩니다.
// Default capacity: 16 chars
StringBuilder small = new StringBuilder();
// Pre-sized: 10 items * ~50 chars each
StringBuilder report = new StringBuilder(500);
for (int i = 1; i <= 10; i++) {
report.append(String.format("%-3d. Record %04d: processed OK%n", i, i));
}
System.out.println(report.toString().substring(0, 30));
// " 1. Record 0001: processed OK"deleteCharAt 및 특정 문자 삭제
deleteCharAt은 문자 하나를 삭제합니다. delete(start, end)는 범위를 삭제합니다. 배열을 이동해야 하므로 이러한 연산의 시간 복잡도는 O(n)입니다.
StringBuilder sb = new StringBuilder("Hello, World!");
sb.deleteCharAt(5); // removes comma: "Hello World!"
sb.delete(5, 6); // removes space: "HelloWorld!"
System.out.println(sb); // HelloWorld!
// Replace to fix a typo
StringBuilder typo = new StringBuilder("Helo, Java!");
typo.replace(typo.indexOf("Helo"), typo.indexOf("Helo") + 4, "Hello");
System.out.println(typo); // Hello, Java!CSV 만들기
실용적인 패턴으로, StringBuilder를 사용하고 적절하게 구분자를 처리하여 CSV 줄을 만들 수 있습니다.
import java.util.List;
static String toCsv(List<String> values) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < values.size(); i++) {
if (i > 0) sb.append(',');
sb.append(escapeCsv(values.get(i)));
}
return sb.toString();
}
static String escapeCsv(String s) {
if (s.contains(",") || s.contains("\""))
return "\"" + s.replace("\"", "\"\"") + "\"";
return s;
}
System.out.println(toCsv(List.of("Alice", "Smith, Jr.", "30")));
// Alice,"Smith, Jr.",30구분자로 분리된 출력을 위한 StringJoiner
StringJoiner를 사용하면 구분자와 선택적인 접두사 및 접미사를 사용해 요소를 간단히 연결할 수 있으므로 구분자를 수동으로 처리할 필요가 없습니다.
import java.util.StringJoiner;
StringJoiner sj = new StringJoiner(", ", "[", "]");
sj.add("Alice");
sj.add("Bob");
sj.add("Charlie");
System.out.println(sj.toString()); // [Alice, Bob, Charlie]
// Equivalent with String.join
String joined = String.join(", ", "Alice", "Bob", "Charlie");
System.out.println(joined); // Alice, Bob, Charlie
// Streams: collect with joining collector
import java.util.stream.*;
List.of("a", "b", "c").stream()
.collect(Collectors.joining(", ", "(", ")"));
// (a, b, c)StringBuilder와 StringBuffer
StringBuffer는 StringBuilder의 스레드 안전 동기화 버전입니다. 잠금 때문에 더 느립니다. 단일 스레드 환경에서는(대부분의 경우인 99%) StringBuilder를 사용합니다.
// StringBuffer: thread-safe but slower (synchronized methods)
StringBuffer buf = new StringBuffer();
buf.append("Thread-safe");
buf.append(" but slow");
// StringBuilder: not thread-safe but faster
StringBuilder sb = new StringBuilder();
sb.append("Fast");
sb.append(" single-threaded");
// When to use StringBuffer:
// - Multiple threads write to the same buffer
// - Almost always a design smell — redesign to avoid sharing뒤집기와 회문 확인
StringBuilder에 내장된 reverse()를 사용하면 회문 확인을 우아하게 구현할 수 있습니다.
static boolean isPalindrome(String s) {
String cleaned = s.toLowerCase()
.replaceAll("[^a-z0-9]", ""); // remove non-alphanumeric
String reversed = new StringBuilder(cleaned).reverse().toString();
return cleaned.equals(reversed);
}
System.out.println(isPalindrome("A man, a plan, a canal: Panama")); // true
System.out.println(isPalindrome("race a car")); // false
System.out.println(isPalindrome("Was it a car or a cat I saw?")); // true실전: SQL 쿼리 빌더
조건에 따라 where 절을 추가하면서 StringBuilder를 사용해 동적인 SQL 쿼리를 만듭니다.
static String buildQuery(String category, Double minPrice, Double maxPrice) {
StringBuilder sql = new StringBuilder("SELECT * FROM products WHERE 1=1");
if (category != null)
sql.append(" AND category = '" + category + "'");
if (minPrice != null)
sql.append(" AND price >= ").append(minPrice);
if (maxPrice != null)
sql.append(" AND price <= ").append(maxPrice);
sql.append(" ORDER BY name");
return sql.toString();
}
System.out.println(buildQuery("Electronics", 50.0, null));
// SELECT * FROM products WHERE 1=1 AND category = 'Electronics' AND price >= 50.0 ORDER BY name빠른 확인
반복문에서 +를 사용한 문자열 연결이 비효율적인 이유는 무엇입니까?
복습: 효율적인 연결을 위한 StringBuilder
핵심 요점:
- StringBuilder는 가변적이므로 append/insert/delete가 내부 버퍼를 변경합니다
- 반복문에서는 StringBuilder를 사용하여 O(n²)의 문자열 생성을 방지합니다
- 모든 변경 메서드는 this를 반환하므로 유창한 호출 연결이 가능합니다
- 예상 용량으로 StringBuilder의 크기를 미리 지정하면 내부 크기 조정을 줄일 수 있습니다
- StringJoiner와 String.join은 구분자로 분리된 출력을 편리하게 처리합니다
- StringBuffer는 동기화된(스레드 안전한) 대안이지만 더 느립니다
자주 묻는 질문
“효율적인 연결을 위한 StringBuilder” 강의는 무료인가요?
네 — “효율적인 연결을 위한 StringBuilder” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“효율적인 연결을 위한 StringBuilder”에서 뭘 배우나요?
반복문과 복잡한 서식 지정 내부에서 문자열을 효율적으로 만들기 위해 StringBuilder를 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“효율적인 연결을 위한 StringBuilder” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 문자열 불변성과 문자열 풀
- 효율적인 연결을 위한 StringBuilder
- 텍스트 블록과 String.format
- Pattern과 Matcher를 사용한 정규 표현식