Java 26일 코스 - Day 7: 문자열

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);
    }
}

오늘의 연습문제

  1. 단어 세기: 문자열 "Java is a powerful and popular programming language"에서 공백으로 구분된 단어 수를 세고, 각 단어를 번호와 함께 출력하세요.

  2. 문자열 뒤집기: 문자열 "Hello Java"를 StringBuilder 없이 직접 char 배열로 변환하여 뒤집은 결과를 출력하세요.

  3. 이메일 파서: 이메일 주소 "developer@company.co.kr"에서 사용자명(developer), 도메인(company.co.kr), 최상위 도메인(kr)을 각각 추출하여 출력하는 프로그램을 작성하세요.

이 글이 도움이 되었나요?