Java에서 문자열(String)은 일련의 문자들을 저장하는 데 사용되며, 객체로 취급됩니다. java.lang 패키지의 String 클래스가 문자열을 대표하며, new 키워드를 사용해 다른 객체처럼 생성하거나, 기본 자료형처럼 리터럴에 값을 할당하는 방식으로 만들 수 있습니다.
String stringObject = new String("Hello how are you");
String stringLiteral = "Welcome to Tutorialspoint";문자열은 내부적으로 문자 배열을 저장하기 때문에, 배열과 마찬가지로 각 문자의 위치가 인덱스(0부터 시작)로 표현됩니다. 예를 들어 다음과 같이 문자열을 생성했다면,
String str = "Hello";
각 문자는 아래와 같이 인덱스에 배치됩니다.
- 인덱스 0 → 'H'
- 인덱스 1 → 'e'
- 인덱스 2 → 'l'
- 인덱스 3 → 'l'
- 인덱스 4 → 'o'
StringIndexOutOfBoundsException 발생 원인
문자열의 길이보다 큰 인덱스에 있는 문자에 접근하려고 하면 StringIndexOutOfBoundsException이 발생합니다. 이는 유효 범위(0 ~ length-1)를 벗어난 인덱스에 접근했음을 의미하는 런타임 예외입니다.
예제 코드
Java의 String 클래스는 문자열을 조작할 수 있는 다양한 메서드를 제공합니다. 그중 charAt() 메서드를 사용하면 특정 인덱스에 위치한 문자를 조회할 수 있습니다. 이 메서드는 인덱스를 나타내는 정수 값을 매개변수로 받아, 해당 위치의 문자를 반환합니다.
다음 예제에서는 길이가 17인 문자열을 생성한 뒤, 인덱스 40에 있는 문자를 출력하려고 시도합니다.
public class Test {
public static void main(String[] args) {
String str = "Hello how are you";
System.out.println("Length of the String: "+str.length());
for(int i=0; i<str.length(); i++) {
System.out.println(str.charAt(i));
}
// 문자열 길이보다 큰 인덱스의 요소에 접근
System.out.println(str.charAt(40));
}
}실행 결과
런타임 예외 발생 −
문자열 길이(17)보다 큰 인덱스 40의 요소에 접근했기 때문에 StringIndexOutOfBoundsException이 발생합니다.
Length of the String: 17
H
e
l
l
o
h
o
w
a
r
e
y
o
u
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 40
at java.base/java.lang.StringLatin1.charAt(Unknown Source)
at java.base/java.lang.String.charAt(Unknown Source)
at Test.main(Test.java:9)예외를 방지하는 방법
이러한 예외를 피하려면 charAt(), substring() 등의 메서드를 호출하기 전에 반드시 인덱스가 0 이상, 문자열 길이 미만인지 확인해야 합니다. 예를 들어 다음과 같이 조건 검사를 추가하면 안전하게 처리할 수 있습니다.
int index = 40;
if(index >= 0 && index < str.length()) {
System.out.println(str.charAt(index));
} else {
System.out.println("유효하지 않은 인덱스입니다.");
}또한 루프를 돌며 문자에 접근할 때는 종료 조건을 i < str.length()로 설정하는 습관을 들이면, 범위를 벗어나는 접근을 사전에 차단할 수 있습니다.