[Java] String 파헤치기

2026. 4. 23. 09:26·Language/Java

* 개념 복습과 학습 정도를 파악하고자 포스팅합니다.

 

문자열(String)

1. String?

문자들의 연속(문자열)을 표현하는 클래스입니다.

Java에서 String은 기본 타입이 아니라 참조 타입(클래스)이에요.

그런데도 기본 타입처럼 new 없이 사용할 수 있는 이유는 Java가 편의 문법을 제공하기 때문이죠.

// 문자열 리터럴 방식 (권장)
String name = "홍길동";

// new 키워드 방식
String name = new String("홍길동");

2. 리터럴 vs new (메모리 차이)

리터럴 방식의 경우 String Pool에 저장돼서 같은 내용이면 같은 객체를 공유합니다.

new로 만들면 매번 새 객체를 Heap에 생성합니다. 그래서 문자열 비교는 항상 equals()를 써야하죠

String a = "hello";
String b = "hello";
String c = new String("hello");
String d = new String("hello");

System.out.println(a == b);       // true  — 같은 풀 객체 공유
System.out.println(a == c);       // false — 다른 메모리 주소
System.out.println(c == d);       // false — 각각 다른 객체
System.out.println(a.equals(c));  // true  — 내용은 같음

3. String은 불면

Java의 String은 한 번 생성되면 내용을 변경할 수 없어요. 변경처럼 보이는 연산도 사실 새 객체를 만들어 반환하는 겁니다!

String str = "hello";
str = str + " world";
// "hello" 객체는 그대로 남아있고
// "hello world" 라는 새 객체가 만들어져서 str이 가리킴

System.out.println(str);  // hello world

이 특성 때문에 문자열을 반복해서 더하면 성능이 나빠지는데, 이를 해결하는 게 StringBuilder입니다.

// 나쁜 예 — 반복 연결 시 매번 새 객체 생성
String result = "";
for (int i = 0; i < 10000; i++) {
    result += i;  // 매번 새 String 객체 생성 → 느림
}

// 좋은 예 — StringBuilder 사용
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
    sb.append(i);  // 같은 객체에 추가 → 빠름
}
String result = sb.toString();

4. String 주요 메서드

length() - 문자열 길이

String str = "Hello, Java!";
System.out.println(str.length());  // 12

 

charAt() - 특정 인덱스 문자

String str = "Hello";
System.out.println(str.charAt(0));  // H
System.out.println(str.charAt(4));  // o

 

indexOf() / lastIndexOf() - 문자 위치 찾기

String str = "Hello, Java!";

System.out.println(str.indexOf("a"));      // 7  (처음 등장하는 위치)
System.out.println(str.lastIndexOf("a"));  // 10 (마지막 등장하는 위치)
System.out.println(str.indexOf("Python")); // -1 (없으면 -1)

 

subString() - 부분 문자열 추출

String str = "Hello, Java!";

System.out.println(str.substring(7));     // Java!   (7번부터 끝까지)
System.out.println(str.substring(7, 11)); // Java    (7번부터 11번 전까지)

 

contains() - 포함 여부

String str = "Hello, Java!";

System.out.println(str.contains("Java"));    // true
System.out.println(str.contains("Python"));  // false

 

equals() / equalsIgnoreCase() - 문자열 비교

String a = "Hello";
String b = "hello";

System.out.println(a.equals(b));          // false - 대소문자 구분
System.out.println(a.equalsIgnoreCase(b)) // true - 대소문자 무시

 

toUpperCase() / toLowerCase() - 대소문자 반환

String str = "Hello, Java!";

System.out.println(str.toUpperCase());  // HELLO, JAVA!
System.out.println(str.toLowerCase());  // hello, java!

 

trim() / strip() - 공백 제거

String str = "   Hello Java   ";

System.out.println(str.trim());   // "Hello Java"  (앞뒤 공백 제거)
System.out.println(str.strip());  // "Hello Java"  (trim 개선판, Java 11+)

// strip은 유니코드 공백도 처리 가능 — 권장

 

replace() / replaceAll() - 문자열 교체

String str = "Hello, Java! Java is fun!";

// replace — 일반 문자열 교체
System.out.println(str.replace("Java", "Python"));
// Hello, Python! Python is fun!

// replaceAll — 정규 표현식 사용 가능
String str2 = "a1b2c3d4";
System.out.println(str2.replaceAll("[0-9]", "*"));
// a*b*c*d*

 

split() - 문자열 분리

String csv = "사과,바나나,포도,딸기";

String[] fruits = csv.split(",");

for (String fruit : fruits) {
    System.out.println(fruit);
}
// 사과
// 바나나
// 포도
// 딸기

System.out.println(fruits.length);  // 4

 

startsWith() / endsWith() - 시작 / 끝 확인

String filename = "report_2025.pdf";

System.out.println(filename.startsWith("report"));  // true
System.out.println(filename.endsWith(".pdf"));       // true
System.out.println(filename.endsWith(".jpg"));       // false

 

valueOf() - 다른 타입 → String 변환

int n       = 42;
double d    = 3.14;
boolean b   = true;

String s1 = String.valueOf(n);    // "42"
String s2 = String.valueOf(d);    // "3.14"
String s3 = String.valueOf(b);    // "true"

// 간단하게 "" 더하기로도 가능
String s4 = n + "";  // "42"

 

Integer.parseInt() 등 - String → 숫자 변환

String numStr = "42";
String dblStr = "3.14";

int    n = Integer.parseInt(numStr);    // 42
double d = Double.parseDouble(dblStr);  // 3.14
long   l = Long.parseLong("99999");     // 99999

// 숫자 형태가 아닌 문자열이면 NumberFormatException 발생
// Integer.parseInt("abc");  // 오류!

 

String.format() - 형식 지정 문자열

String name  = "홍길동";
int    age   = 25;
double score = 98.5;

String result = String.format("이름: %s, 나이: %d, 점수: %.1f", name, age, score);
System.out.println(result);
// 이름: 홍길동, 나이: 25, 점수: 98.5
서식 의미
%s 문자열
%d 정수
%f 실수
%.2f 소수점 2자리 실수
%n 줄바꿈

 

join() - 문자열 합치기

// String.join(구분자, 문자열들)
String result = String.join(", ", "사과", "바나나", "포도");
System.out.println(result);  // 사과, 바나나, 포도

// 배열도 가능
String[] arr = {"Java", "Python", "C++"};
System.out.println(String.join(" / ", arr));  // Java / Python / C++

 

isEmpty() / isBlank() - 빈 문자열 확인

String a = "";
String b = "   ";
String c = "hello";

System.out.println(a.isEmpty());   // true  (길이가 0)
System.out.println(b.isEmpty());   // false (공백이 있어서 길이 > 0)
System.out.println(b.isBlank());   // true  (공백만 있어도 true, Java 11+)
System.out.println(c.isEmpty());   // false
System.out.println(c.isBlank());   // false

 

toCharArray() - 문자 배열로 변환

String str = "Hello";
char[] chars = str.toCharArray();

for (char c : chars) {
    System.out.print(c + " ");  // H e l l o
}

5. StringBuilder

String은 불변이라 성능 문제가 있을 때 사용합니다.

변경 가능한 문자열 클래스입니다.

StringBuilder sb = new StringBuilder();

sb.append("Hello");       // "Hello"
sb.append(", ");          // "Hello, "
sb.append("Java");        // "Hello, Java"
sb.append("!");           // "Hello, Java!"
sb.insert(7, "Beautiful "); // "Hello, Beautiful Java!"
sb.delete(7, 17);         // "Hello, Java!"
sb.reverse();             // "!avaJ ,olleH"
sb.replace(0, 5, "Hi");   // "Hi, Beautiful Java!"

String result = sb.toString();
System.out.println(result);

 

StringBuilder 주요 메서드

메서드 설명
append(값) 뒤에 추가
insert(위치, 값) 특정 위치에 삽입
delete(from, to) 범위 삭제
replace(from, to, 문자열) 범위 교체
reverse() 문자열 뒤집기
toString() String으로 변환
length() 길이 변환
charAt(i) 특정 위치 문자 반환

6. 자주 쓰는 String 패턴 정리

// 문자열 뒤집기
String str = "hello";
String reversed = new StringBuilder(str).reverse().toString();
System.out.println(reversed);  // olleh

// 문자 개수 세기
String str2 = "hello world";
long count = str2.chars().filter(c -> c == 'l').count();
System.out.println(count);  // 3

// 특정 문자 제거
String str3 = "h e l l o";
String noSpace = str3.replace(" ", "");
System.out.println(noSpace);  // hello

// 팰린드롬 검사 (앞뒤로 읽어도 같은 문자열)
String word = "racecar";
String rev  = new StringBuilder(word).reverse().toString();
System.out.println(word.equals(rev));  // true

// 첫 글자 대문자로
String name = "hong gil dong";
String capitalized = Character.toUpperCase(name.charAt(0)) + name.substring(1);
System.out.println(capitalized);  // Hong gil dong

핵심 정리

1. 문자열을 비교할 때에는 ==대신 항상 equals()를 사용해야 합니다.

2. String은 변경이 불가하기 때문에 변경 시에는 새 객체를 생성해야 해요.

3. 반복 연결은 StringBuilder를 사용합니다.

4. 숫자에서 String 변환은 valueOf(), String에서 숫자 변환은 parseInt()

5. 공백 제거시 Java 11 이상부터는 strip()을 권장합니다.

6. 공백 포함 확인은 isBlank(), 길이 0만은 isEmpty()!

'Language > Java' 카테고리의 다른 글

[Java] 컬렉션 프레임워크  (0) 2026.04.23
[Java] 예외 처리 (Exception Handling)  (0) 2026.04.23
[Java]내부 클래스 정리  (0) 2026.04.22
[Java] 배열에 대해서  (0) 2026.04.22
[Java] 추상 클래스 & 인터페이스 완전히 정리해버리기  (0) 2026.04.22
'Language/Java' 카테고리의 다른 글
  • [Java] 컬렉션 프레임워크
  • [Java] 예외 처리 (Exception Handling)
  • [Java]내부 클래스 정리
  • [Java] 배열에 대해서
BackendInho
BackendInho
항상 열정적으로 부딪히고 깨닫는 주니어 백엔드 개발자의 여정을 기록합니다!
  • BackendInho
    Inho.devlog
    BackendInho
  • 전체
    오늘
    어제
    • 분류 전체보기 (41)
      • TIL (0)
      • Language (21)
        • Java (21)
      • Backend (8)
        • Spring (8)
      • Database (0)
        • SQL (0)
      • CS (8)
        • Computer Structure (2)
        • Network (2)
        • OS (1)
        • Data Structure & Algorithms (3)
      • Devops (0)
        • Docker & Kubernetes (0)
      • Coding-Test (1)
        • Programmers (3)
        • LeatCode (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    API
    CS
    HTTP
    java
    REST
    REST API
    Spring
    Spring Boot
    Web
    공간복잡도
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
BackendInho
[Java] String 파헤치기
상단으로

티스토리툴바