[Java 개념노트 38] String 클래스 이해하기
안녕하세요. Java 개념노트 시리즈 서른여덟 번째 글입니다.
지난 글에서는 자바의 모든 클래스가 상속받는 최상위 부모 클래스인 Object 클래스에 대해 정리했습니다. 이번 글에서는 자바에서 문자열을 다룰 때 가장 많이 사용하는 String 클래스에 대해 알아보겠습니다.
문자열은 프로그램에서 정말 자주 사용됩니다. 이름, 아이디, 비밀번호, 제목, 내용, 검색어, 파일명, 메시지 등 대부분의 텍스트 데이터는 문자열로 다룹니다. 자바에서는 이런 문자열을 String 클래스로 표현합니다.
1. String이란?
String은 문자열을 저장하고 다루기 위한 자바의 클래스입니다.
문자 하나를 저장할 때는 char를 사용하지만, 여러 글자로 이루어진 문자열을 저장할 때는 String을 사용합니다.
char grade = 'A';
String name = "Java";
쉽게 말하면String은 여러 글자를 하나의 값처럼 다룰 수 있게 해주는 문자열 클래스입니다.
2. String은 기본 자료형이 아니다
int, double, boolean, char는 기본 자료형입니다. 하지만 String은 기본 자료형이 아니라 클래스입니다.
| 구분 | 예시 | 설명 |
| 기본 자료형 | int, double, boolean, char |
값 자체를 저장합니다. |
| 참조 자료형 | String, 배열, 객체 |
객체를 참조합니다. |
다만 String은 워낙 자주 사용되기 때문에 기본 자료형처럼 편하게 사용할 수 있도록 특별하게 지원됩니다.
3. 문자열 만들기
문자열은 보통 큰따옴표 " "를 사용해서 만듭니다.
String language = "Java";
String message = "안녕하세요.";
String blog = "GWDEVELBlog";
이렇게 큰따옴표로 만든 문자열을 문자열 리터럴이라고 합니다.
또는 new 키워드를 사용해서 문자열 객체를 만들 수도 있습니다.
String language = new String("Java");
하지만 일반적으로는 문자열 리터럴 방식을 더 많이 사용합니다.
4. 문자열 출력하기
문자열은 System.out.println()으로 쉽게 출력할 수 있습니다.
public class Main {
public static void main(String[] args) {
String name = "Java";
System.out.println(name);
System.out.println("Hello String");
}
}
실행 결과는 다음과 같습니다.
Java
Hello String
5. 문자열 연결하기
문자열은 + 연산자를 사용해서 이어 붙일 수 있습니다.
String first = "Java";
String second = "Study";
String result = first + " " + second;
System.out.println(result);
실행 결과는 다음과 같습니다.
Java Study
숫자와 문자열을 함께 연결할 수도 있습니다.
String name = "Java";
int score = 100;
System.out.println(name + " 점수: " + score);
실행 결과는 다음과 같습니다.
Java 점수: 100
6. 문자열과 숫자 덧셈 주의하기
문자열과 숫자를 +로 연결하면 숫자 계산이 아니라 문자열 연결이 될 수 있습니다.
System.out.println("결과: " + 10 + 20);
System.out.println("결과: " + (10 + 20));
실행 결과는 다음과 같습니다.
결과: 1020
결과: 30
첫 번째 코드는 왼쪽부터 문자열 연결이 진행되어 1020이 됩니다. 두 번째 코드는 괄호 안의 10 + 20이 먼저 계산되어 30이 됩니다.
주의
문자열과 숫자를 함께 사용할 때 계산이 먼저 필요하면 괄호를 사용해야 합니다.
7. String은 불변 객체다
자바의 String은 불변 객체입니다. 불변 객체란 한 번 만들어진 객체의 내부 값을 바꿀 수 없는 객체를 말합니다.
String text = "Java";
text = text + " Study";
System.out.println(text);
실행 결과는 다음과 같습니다.
Java Study
겉으로 보면 기존 문자열이 바뀐 것처럼 보입니다. 하지만 실제로는 기존 "Java" 문자열이 바뀐 것이 아니라, "Java Study"라는 새로운 문자열이 만들어지고 text 변수가 새 문자열을 가리키게 된 것입니다.
핵심 포인트String은 한 번 만들어지면 내용이 바뀌지 않습니다. 문자열을 수정하는 것처럼 보이는 코드는 대부분 새로운 문자열을 만드는 방식입니다.
8. 문자열 비교에서 ==를 쓰면 안 되는 이유
문자열을 비교할 때 가장 많이 하는 실수는 ==를 사용하는 것입니다.
String a = new String("Java");
String b = new String("Java");
System.out.println(a == b);
System.out.println(a.equals(b));
실행 결과는 다음과 같습니다.
false
true
==는 두 참조변수가 같은 객체를 가리키는지 비교합니다. 반면 equals()는 문자열의 내용을 비교합니다.
| 비교 방법 | 비교 기준 | 문자열 비교에 적합한가? |
== |
같은 객체인지 비교 | 보통 적합하지 않음 |
equals() |
문자열 내용 비교 | 적합함 |
9. 문자열은 equals()로 비교하기
문자열의 내용이 같은지 비교할 때는 equals()를 사용해야 합니다.
String input = "admin";
if (input.equals("admin")) {
System.out.println("관리자입니다.");
} else {
System.out.println("일반 사용자입니다.");
}
실행 결과는 다음과 같습니다.
관리자입니다.
문자열을 조건문에서 비교할 때도 ==가 아니라 equals()를 사용하는 습관을 들이는 것이 좋습니다.
10. equalsIgnoreCase()
대소문자를 구분하지 않고 문자열을 비교하고 싶다면 equalsIgnoreCase()를 사용할 수 있습니다.
String a = "java";
String b = "JAVA";
System.out.println(a.equals(b));
System.out.println(a.equalsIgnoreCase(b));
실행 결과는 다음과 같습니다.
false
true
equals()는 대소문자를 구분하므로 false입니다. equalsIgnoreCase()는 대소문자를 무시하고 비교하므로 true입니다.
11. length() 메서드
length()는 문자열의 길이를 반환합니다.
String text = "Java";
System.out.println(text.length());
실행 결과는 다음과 같습니다.
4
문자열 "Java"는 글자가 4개이므로 결과가 4입니다.
12. charAt() 메서드
charAt()은 문자열에서 특정 위치의 문자 하나를 꺼낼 때 사용합니다.
String text = "Java";
System.out.println(text.charAt(0));
System.out.println(text.charAt(1));
System.out.println(text.charAt(2));
System.out.println(text.charAt(3));
실행 결과는 다음과 같습니다.
J
a
v
a
문자열의 위치도 배열처럼 0부터 시작합니다. 따라서 text.charAt(0)은 첫 번째 문자를 의미합니다.
13. substring() 메서드
substring()은 문자열의 일부를 잘라낼 때 사용합니다.
String text = "Hello Java";
System.out.println(text.substring(6));
System.out.println(text.substring(0, 5));
실행 결과는 다음과 같습니다.
Java
Hello
substring(6)은 6번 인덱스부터 끝까지 잘라냅니다. substring(0, 5)는 0번 인덱스부터 5번 인덱스 바로 전까지 잘라냅니다.
주의substring(시작, 끝)에서 끝 인덱스의 문자는 포함되지 않습니다.
14. indexOf() 메서드
indexOf()는 특정 문자열이 처음 등장하는 위치를 반환합니다. 찾지 못하면 -1을 반환합니다.
String text = "Hello Java";
System.out.println(text.indexOf("Java"));
System.out.println(text.indexOf("Spring"));
실행 결과는 다음과 같습니다.
6
-1
"Java"는 6번 인덱스에서 시작합니다. "Spring"은 문자열 안에 없으므로 -1이 반환됩니다.
15. contains() 메서드
contains()는 특정 문자열이 포함되어 있는지 확인할 때 사용합니다. 결과는 true 또는 false입니다.
String text = "Hello Java";
System.out.println(text.contains("Java"));
System.out.println(text.contains("Spring"));
실행 결과는 다음과 같습니다.
true
false
검색어 포함 여부를 확인할 때 자주 사용할 수 있는 메서드입니다.
16. startsWith()와 endsWith()
startsWith()는 문자열이 특정 값으로 시작하는지 확인합니다. endsWith()는 문자열이 특정 값으로 끝나는지 확인합니다.
String fileName = "report.pdf";
System.out.println(fileName.startsWith("report"));
System.out.println(fileName.endsWith(".pdf"));
실행 결과는 다음과 같습니다.
true
true
17. replace() 메서드
replace()는 문자열의 일부를 다른 문자열로 바꿀 때 사용합니다.
String text = "Hello Java";
String result = text.replace("Java", "Spring");
System.out.println(text);
System.out.println(result);
실행 결과는 다음과 같습니다.
Hello Java
Hello Spring
여기서 중요한 점은 원본 text가 바뀌지 않는다는 것입니다. replace()는 변경된 새 문자열을 반환합니다.
18. trim() 메서드
trim()은 문자열 앞뒤의 공백을 제거할 때 사용합니다.
String text = " Java ";
System.out.println("[" + text + "]");
System.out.println("[" + text.trim() + "]");
실행 결과는 다음과 같습니다.
[ Java ]
[Java]
사용자가 입력한 값의 앞뒤 공백을 정리할 때 자주 사용합니다.
19. toUpperCase()와 toLowerCase()
toUpperCase()는 문자열을 대문자로 바꾸고, toLowerCase()는 문자열을 소문자로 바꿉니다.
String text = "Java";
System.out.println(text.toUpperCase());
System.out.println(text.toLowerCase());
실행 결과는 다음과 같습니다.
JAVA
java
20. split() 메서드
split()은 문자열을 특정 기준으로 나누어 배열로 만들 때 사용합니다.
String text = "Java,Spring,SQL";
String[] words = text.split(",");
for (int i = 0; i < words.length; i++) {
System.out.println(words[i]);
}
실행 결과는 다음과 같습니다.
Java
Spring
SQL
쉼표 ,를 기준으로 문자열을 나누어 배열에 저장했습니다.
21. null 문자열 주의하기
문자열 변수가 null인 상태에서 메서드를 호출하면 오류가 발생할 수 있습니다.
String text = null;
System.out.println(text.length()); // 오류 발생
text는 실제 문자열 객체를 가리키고 있지 않습니다. 따라서 length() 같은 메서드를 호출할 수 없습니다.
null 가능성이 있는 문자열은 먼저 확인하는 것이 안전합니다.
String text = null;
if (text != null) {
System.out.println(text.length());
} else {
System.out.println("문자열이 없습니다.");
}
22. String 주요 메서드 정리
자주 사용하는 String 메서드를 정리하면 다음과 같습니다.
| 메서드 | 역할 | 예시 |
equals() |
문자열 내용 비교 | a.equals(b) |
equalsIgnoreCase() |
대소문자 무시 비교 | a.equalsIgnoreCase(b) |
length() |
문자열 길이 확인 | text.length() |
charAt() |
특정 위치 문자 반환 | text.charAt(0) |
substring() |
문자열 일부 자르기 | text.substring(0, 5) |
indexOf() |
문자열 위치 찾기 | text.indexOf("Java") |
contains() |
포함 여부 확인 | text.contains("Java") |
replace() |
문자열 바꾸기 | text.replace("A", "B") |
trim() |
앞뒤 공백 제거 | text.trim() |
split() |
문자열 나누기 | text.split(",") |
23. 직접 연습해보기
아래 코드를 직접 작성하고 실행해보세요.
public class Main {
public static void main(String[] args) {
String text = " Java,Spring,SQL ";
String trimmed = text.trim();
System.out.println("원본: [" + text + "]");
System.out.println("공백 제거: [" + trimmed + "]");
System.out.println("길이: " + trimmed.length());
System.out.println("Java 포함 여부: " + trimmed.contains("Java"));
System.out.println("Spring 위치: " + trimmed.indexOf("Spring"));
String replaced = trimmed.replace("SQL", "Oracle");
System.out.println("변경 결과: " + replaced);
String[] words = replaced.split(",");
for (int i = 0; i < words.length; i++) {
System.out.println((i + 1) + "번째 단어: " + words[i]);
}
String input = "java";
if (input.equalsIgnoreCase("JAVA")) {
System.out.println("대소문자를 무시하고 같습니다.");
}
}
}
실행 결과는 다음과 같습니다.
원본: [ Java,Spring,SQL ]
공백 제거: [Java,Spring,SQL]
길이: 15
Java 포함 여부: true
Spring 위치: 5
변경 결과: Java,Spring,Oracle
1번째 단어: Java
2번째 단어: Spring
3번째 단어: Oracle
대소문자를 무시하고 같습니다.
24. String 사용 시 자주 하는 실수
String을 처음 배울 때는 아래와 같은 실수를 자주 합니다.
| 실수 | 문제점 | 해결 방법 |
문자열 비교에 == 사용 |
내용 비교가 아니라 참조 비교가 됨 | equals() 사용 |
| String이 수정된다고 생각 | String은 불변 객체 | 결과 문자열을 새 변수에 저장 |
| substring 끝 인덱스 포함으로 착각 | 끝 인덱스 문자는 포함되지 않음 | 시작은 포함, 끝은 미포함으로 기억 |
| charAt 인덱스 범위 초과 | 실행 중 오류 발생 가능 | 0부터 length() - 1까지 사용 |
| null 문자열에서 메서드 호출 | NullPointerException 발생 가능 | 메서드 호출 전 null 확인 |
25. 이번 글 정리
이번 글에서는 자바에서 문자열을 다루는 String 클래스에 대해 정리했습니다. 핵심 내용은 다음과 같습니다.
String은 문자열을 저장하고 다루는 클래스이다.String은 기본 자료형이 아니라 참조 자료형이다.- 문자열은 보통 큰따옴표로 만든다.
- 문자열은
+연산자로 연결할 수 있다. - 문자열과 숫자를 함께 사용할 때는 연산 순서에 주의해야 한다.
String은 불변 객체이다.- 문자열을 수정하는 것처럼 보이는 코드는 새 문자열을 만드는 경우가 많다.
- 문자열 내용 비교는
==가 아니라equals()를 사용한다. - 대소문자를 무시하고 비교할 때는
equalsIgnoreCase()를 사용할 수 있다. length(),charAt(),substring(),indexOf(),contains()같은 메서드를 자주 사용한다.- null 문자열에서 메서드를 호출하면 오류가 발생할 수 있다.
한 줄 요약String은 문자열을 다루는 클래스이며, 불변 객체이므로 문자열 비교는 equals()로 하고 문자열 메서드는 새 결과를 반환한다는 점을 기억해야 합니다.
다음 글 예고
다음 글에서는 [Java 개념노트 39] StringBuilder 이해하기라는 주제로 문자열을 자주 수정해야 할 때 더 효율적으로 다루는 방법을 정리해보겠습니다.
GWDEVELBlog Java 개념노트 시리즈

'Computer Science > Java' 카테고리의 다른 글
| [Java ]개념노트 40 Wrapper 클래스 이해하기 (0) | 2026.06.14 |
|---|---|
| [Java ] 개념노트 39 StringBuilder 이해하기 (0) | 2026.06.14 |
| [Java ] 개념노트 37 Object 클래스 이해하기 (0) | 2026.06.14 |
| [Java] 개념노트 36 추상 클래스와 인터페이스 비교하기 (1) | 2026.06.14 |
| [Java ]개념노트 35 인터페이스 이해하기 (0) | 2026.06.13 |