Day 7: 문자열
String은 Java에서 가장 많이 사용되는 클래스입니다. 문자열은 불변(immutable)이라서 한 번 생성되면 내용을 변경할 수 없습니다. 문자열을 변경하는 메서드는 항상 새로운 String 객체를 반환합니다.
String 기본 메서드
문자열을 다루는 핵심 메서드들을 알아봅니다.
public class StringMethods {
public static void main(String[] args) {
String text = "Hello, Java World!";
// 길이와 인덱스
System.out.println("길이: " + text.length()); // 18
System.out.println("3번째 문자: " + text.charAt(2)); // l
System.out.println("Java 위치: " + text.indexOf("Java")); // 7
// 대소문자 변환
System.out.println("대문자: " + text.toUpperCase());
System.out.println("소문자: " + text.toLowerCase());
// 부분 문자열
System.out.println("부분: " + text.substring(7, 11)); // Java
System.out.println("7번부터: " + text.substring(7)); // Java World!
// 공백 제거
String padded = " Hello ";
System.out.println("trim: [" + padded.trim() + "]");
System.out.println("strip: [" + padded.strip() + "]"); // Java 11+
// 포함 여부
System.out.println("Java 포함? " + text.contains("Java")); // true
System.out.println("Hello로 시작? " + text.startsWith("Hello")); // true
System.out.println("!로 끝남? " + text.endsWith("!")); // true
// 빈 문자열 확인
System.out.println("비어있나? " + "".isEmpty()); // true
System.out.println("공백만? " + " ".isBlank()); // true (Java 11+)
}
}
문자열 변환과 분리
문자열을 자르고, 합치고, 변환하는 방법을 알아봅니다.
public class StringTransform {
public static void main(String[] args) {
// replace: 문자열 치환
String original = "Java는 재미있다. Java를 배우자!";
String replaced = original.replace("Java", "Python");
System.out.println(replaced);
// split: 문자열 분리
String csv = "홍길동,25,서울,개발자";
String[] parts = csv.split(",");
for (String part : parts) {
System.out.println(part);
}
// join: 문자열 합치기
String joined = String.join(" - ", "Java", "Python", "Go");
System.out.println(joined); // Java - Python - Go
// format: 서식 지정
String name = "홍길동";
int age = 25;
double height = 175.5;
String formatted = String.format("이름: %s, 나이: %d세, 키: %.1fcm",
name, age, height);
System.out.println(formatted);
// 문자열 -> 숫자, 숫자 -> 문자열
int num = Integer.parseInt("123");
double dbl = Double.parseDouble("3.14");
String str = String.valueOf(456);
System.out.println(num + dbl); // 126.14
}
}
StringBuilder
문자열을 반복적으로 결합할 때는 StringBuilder를 사용해야 성능이 좋습니다.
public class StringBuilderExample {
public static void main(String[] args) {
// String 연결의 문제점 (매번 새 객체 생성)
String result = "";
for (int i = 0; i < 5; i++) {
result += i + " "; // 비효율적!
}
System.out.println(result);
// StringBuilder: 가변 문자열 (효율적)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5; i++) {
sb.append(i).append(" ");
}
System.out.println(sb.toString());
// StringBuilder 주요 메서드
StringBuilder builder = new StringBuilder("Hello");
builder.append(" World"); // 끝에 추가
builder.insert(5, ","); // 위치에 삽입
builder.replace(0, 5, "Hi"); // 범위 치환
builder.delete(2, 3); // 범위 삭제
builder.reverse(); // 뒤집기
System.out.println(builder);
// 체이닝 패턴
String html = new StringBuilder()
.append("<html>")
.append("<body>")
.append("<h1>제목</h1>")
.append("</body>")
.append("</html>")
.toString();
System.out.println(html);
}
}
문자열 비교와 검색
문자열 비교 시 주의사항과 정규식 기본 활용법입니다.
public class StringComparison {
public static void main(String[] args) {
// equals vs ==
String a = "hello";
String b = new String("hello");
System.out.println(a == b); // false (참조 비교)
System.out.println(a.equals(b)); // true (내용 비교)
System.out.println(a.equalsIgnoreCase("HELLO")); // true
// compareTo: 사전순 비교
System.out.println("apple".compareTo("banana")); // 음수 (apple이 앞)
System.out.println("banana".compareTo("apple")); // 양수 (banana가 뒤)
System.out.println("apple".compareTo("apple")); // 0 (같음)
// 정규식 기본
String email = "user@example.com";
boolean isValid = email.matches("[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+");
System.out.println("유효한 이메일: " + isValid); // true
// replaceAll (정규식)
String text = "전화번호: 010-1234-5678, 팩스: 02-999-0000";
String masked = text.replaceAll("\\d{3,4}-\\d{4}", "****-****");
System.out.println(masked);
// 텍스트 블록 (Java 15+)
String json = """
{
"name": "홍길동",
"age": 25
}
""";
System.out.println(json);
}
}
오늘의 연습문제
-
단어 세기: 문자열
"Java is a powerful and popular programming language"에서 공백으로 구분된 단어 수를 세고, 각 단어를 번호와 함께 출력하세요. -
문자열 뒤집기: 문자열
"Hello Java"를 StringBuilder 없이 직접 char 배열로 변환하여 뒤집은 결과를 출력하세요. -
이메일 파서: 이메일 주소
"developer@company.co.kr"에서 사용자명(developer), 도메인(company.co.kr), 최상위 도메인(kr)을 각각 추출하여 출력하는 프로그램을 작성하세요.