Java의 하위 문자열 이해: 기본 가이드
본 기사에서는 자바(Java)에서 하위 문자열을 이해하는 데 필요한 모든 것을 제공합니다. 이론적인 설명은 물론, 실제 코드 예시를 통해 시각적인 이해를 돕고, 하위 문자열을 생성하고 문자열 내에서 찾는 방법을 상세히 알려드립니다.
시작하기 전에 하위 문자열의 기본 개념부터 확실히 다져보도록 하겠습니다.
문자열과 하위 문자열의 정의
자바에서 문자열은 문자들의 연속된 나열을 의미하며, 모든 문자열은 객체로 취급됩니다. 문자, 기호, 공백 등을 포함할 수 있습니다. 반면, 하위 문자열은 기존 문자열의 일부 또는 하위 집합을 가리킵니다.
예를 들어, "Geek"는 "koreantech.org"의 하위 문자열입니다. 하위 문자열은 문자열에서 특정 부분을 추출하는 데 유용하게 사용됩니다.
만약 "John Doe"라는 이름에서 "John"만을 추출하고 싶거나, "John, Jack, Jolly"라는 이름 목록에서 "John"이 있는지 확인하고 싶다면 하위 문자열을 활용하여 쉽게 처리할 수 있습니다. 이 외에도 하위 문자열은 다양한 상황에서 응용 가능합니다. 이러한 기본 개념을 확실히 이해하면 하위 문자열을 활용한 다양한 작업을 능숙하게 수행할 수 있습니다.
이제 자바에서 하위 문자열이 무엇인지 알았으니, 하위 문자열을 생성하고 조작하는 방법을 알아보겠습니다.
#1. 'substring()' 메서드 활용
'substring()' 메서드는 하위 문자열을 손쉽게 만드는 강력한 도구입니다. 이 메서드는 최대 두 개의 매개변수(startIndex 또는 startIndex와 endIndex)를 입력받아 원하는 하위 문자열을 반환합니다. 매개변수의 개수에 따라 두 가지 방식으로 사용될 수 있으며, 각 방식에 대해 자세히 알아보겠습니다.
substring(int startIndex)
'substring(startIndex)' 형식으로 사용되는 이 메서드는 정수 값(startIndex)을 입력으로 받습니다. 입력된 인덱스에서 시작하여 원래 문자열의 끝까지의 하위 문자열을 반환합니다.
다음 코드 예제를 통해 이해해 보겠습니다.
public class Substrings{
public static void main(String args[]){
String str="koreantech.org";
System.out.println("주어진 문자열: " + str);
System.out.println("하위 문자열: " +str.substring(4)); //문자열 인덱스는 0부터 시작
}
}
결과:
주어진 문자열: koreantech.org 하위 문자열: antech.org
위 출력 결과에서 입력 문자열 "koreantech.org"에 대해 'substring(4)'를 호출한 결과, 인덱스 4부터 문자열 끝까지인 "antech.org"가 하위 문자열로 반환되었습니다.
substring(int startIndex, int endIndex)
이 방식은 'substring(startIndex, endIndex)' 형식으로 사용되며, 두 개의 정수 값(시작 인덱스 및 끝 인덱스)을 인자로 전달합니다. 시작 인덱스부터 끝 인덱스 바로 앞까지의 하위 문자열을 반환합니다.
다음 코드를 통해 좀 더 자세히 살펴보겠습니다.
public class Substrings{
public static void main(String args[]){
String str="GeekFlareFans";
System.out.println("주어진 문자열: " + str);
System.out.println("하위 문자열: " +str.substring(4,9)); //인덱스 4부터 8까지의 하위 문자열을 얻음
}
}
결과:
주어진 문자열: GeekFlareFans 하위 문자열: Flare
위 예시에서 "GeekFlareFans"라는 문자열에 'substring(4,9)'를 호출한 결과, 인덱스 4부터 인덱스 8까지의 문자들로 구성된 "Flare"가 하위 문자열로 반환되었습니다. 이때, 끝 인덱스(endIndex)에 해당하는 문자는 결과에 포함되지 않는다는 점에 유의해야 합니다. 즉, 끝 인덱스 직전까지의 문자들만 하위 문자열에 포함됩니다.
#2. 'split()' 메서드 활용
'split()' 메서드는 자바 String 클래스에서 제공하는 또 다른 강력한 도구로, 문자열을 특정 구분자를 기준으로 나누어 하위 문자열들을 생성하는 데 사용됩니다. 여러 정보가 하나의 문자열에 저장되어 있고, 각 정보가 공통된 구분자로 분리되어 있을 때 특히 유용합니다.
정규식이라는 다소 생소한 용어가 등장하는데, 진행하기 전에 정규식이 무엇인지 먼저 이해해야 합니다. 정규식(Regular Expression)은 문자열 내에서 특정한 패턴을 표현하기 위한 일종의 문자 표현식입니다. 'split()' 메서드에서는 이 정규식이 구분자 역할을 합니다.
'split()' 메서드는 최대 두 개의 매개변수를 입력받을 수 있습니다. 하나는 정규식 문자열이고, 다른 하나는 제한 정수입니다. 정규식은 구분자 역할을 하며, 해당 구분자가 발견되면 원본 문자열을 구분자 앞부분과 뒷부분으로 나누어 하위 문자열을 생성합니다.
예를 들어, "abcdef" 문자열을 "bcd" 정규식으로 나누면, 하위 문자열 "a"와 "ef"를 얻게 됩니다. 'split()' 메서드는 이렇게 분리된 하위 문자열들을 배열 형태로 반환합니다. 정규식만 지정하거나, 정규식과 제한 값을 함께 지정할 수도 있습니다. 이제 각 방식에 대해 자세히 알아보도록 하겠습니다.
split(String regex)
'split(regex)' 형식으로 사용되는 첫 번째 방식은 정규식 문자열만을 매개변수로 받습니다. 제한 값은 따로 설정하지 않기 때문에, 구분자에 의해 분리될 수 있는 모든 하위 문자열이 배열에 담겨 반환됩니다.
코드를 통해 좀 더 자세히 살펴보겠습니다.
public class Substrings{
public static void main(String args[]){
String str="Geek%Flare";
String[] substrings=str.split("%");
System.out.println("주어진 문자열: " + str);
System.out.println("첫 번째 하위 문자열: " + substrings[0]);
System.out.println("두 번째 하위 문자열: " + substrings[1]);
}
}
결과:
주어진 문자열: Geek%Flare 첫 번째 하위 문자열: Geek 두 번째 하위 문자열: Flare
위 코드에서 주어진 문자열은 "Geek%Flare"이며, "%"를 구분자로 사용하여 문자열을 나누었습니다. 구분자는 단일 문자일 필요는 없으며, 여러 문자로 구성된 문자열도 구분자로 사용할 수 있습니다. 'split()' 메서드는 이 구분자를 기준으로 문자열을 나누어 배열 형태로 반환하며, 결과 배열에는 "Geek"와 "Flare"라는 두 개의 하위 문자열이 담겨 있습니다. 각각의 하위 문자열은 배열의 인덱스(0, 1)를 통해 접근할 수 있으며, 콘솔에 출력되었습니다.
메서드에 매개변수를 전달하지 않으면 오류가 발생하지만, 빈 문자열("")을 정규식으로 지정하면 문자열의 모든 개별 문자를 하위 문자열로 분리합니다. 다음 예시를 통해 확인해 보겠습니다.
import java.util.Arrays;
public class Substrings{
public static void main(String args[]){
String str="Geek%Flare";
String[] substrings=str.split("");
System.out.println(Arrays.toString(substrings));
}
}
결과:
[G, e, e, k, %, F, l, a, r, e]
위 예시에서는 정규식 매개변수로 빈 문자열("")이 지정되었으며, 결과적으로 문자열 내의 모든 문자가 분리되어 별도의 하위 문자열로 생성되었습니다. 'split()' 메서드의 출력 배열을 출력하여 이를 명확히 확인할 수 있습니다.
split(String regex, int limit)
두 번째 방식은 'split(regex, limit)' 형식으로 사용되며, 정규식과 함께 제한 값(limit)을 추가로 지정할 수 있습니다. 이를 통해 결과 문자열의 개수를 제어하고, 출력 결과에 대한 세밀한 조정을 할 수 있습니다. 제한 값은 출력될 하위 문자열의 최대 개수를 의미하며, 세 가지 시나리오를 고려해야 합니다.
경우 1: limit > 0인 경우 결과 배열에는 최대 (limit-1)번 분할을 적용한 결과가 포함됩니다. 결과 배열의 크기는 지정된 제한 값보다 클 수 없으며, 분할되지 않고 남은 부분은 그대로 유지됩니다. 코드를 통해 살펴보겠습니다.
import java.util.Arrays;
public class Substrings{
public static void main(String args[]){
String str="Geek%Flare%is%the%best";
String[] substrings=str.split("%",2);
System.out.println(Arrays.toString(substrings));
}
}
결과:
[Geek, Flare%is%the%best]
출력에서 볼 수 있듯이, 결과 배열에는 두 개의 요소만 존재하며, 이는 제한 매개변수에 지정된 값입니다. 또한 분할은 (limit-1)번, 즉 한 번만 적용되었습니다.
만약 정규식이 연속으로 두 번 나타나면("%%"), 빈 하위 문자열이 생성됩니다. 다음 코드를 통해 확인해 보겠습니다.
import java.util.Arrays;
public class Substrings{
public static void main(String args[]){
String str="Geek%Flare%is%%the%best%%%";
String[] substrings=str.split("%",5);
System.out.println(Arrays.toString(substrings));
}
}
결과:
[Geek, Flare, is, , the%best%%%]
기본적으로 "%" 다음에 다른 "%"가 오거나, 문자열의 끝이 오면 빈 하위 문자열로 처리됩니다.
경우 2: limit < 0인 경우, 분할 작업은 배열 크기에 제한 없이 가능한 한 많이 적용됩니다. 정규식이 연속으로 두 번 나타나면("%%"), 배열에 빈 하위 문자열이 포함됩니다.
import java.util.Arrays;
public class Substrings{
public static void main(String args[]){
String str="Geek%Flare%is%%the%best%%%";
String[] substrings=str.split("%",-1);
System.out.println(Arrays.toString(substrings));
}
}
결과:
[Geek, Flare, is, , the, best, , , ]
출력 결과를 통해 분할이 가능한 만큼 많이 적용되었고, 빈 하위 문자열 역시 배열에 포함되었음을 확인할 수 있습니다.
경우 3: limit = 0인 경우, 분할 작업은 가능한 한 많이 적용되지만, 문자열 끝에 위치한 모든 빈 하위 문자열은 배열에서 제거됩니다.
import java.util.Arrays;
public class Substrings{
public static void main(String args[]){
String str="Geek%Flare%is%%the%best%%%";
String[] substrings=str.split("%",0);
System.out.println(Arrays.toString(substrings));
}
}
결과:
[Geek, Flare, is, , the, best]
limit=-1일 때와 limit=0일 때의 결과가 매우 유사하지만, 후행 빈 하위 문자열이 없다는 차이점이 있습니다. 즉, 하위 문자열 배열의 끝에 있는 빈 문자열은 무시됩니다.
문자열에 정규식이 존재하지 않으면, 전체 원본 문자열이 결과로 반환됩니다.
문자열에 하위 문자열이 포함되어 있는지 확인
기존 문자열에서 하위 문자열을 생성하는 것 외에도, 특정 하위 문자열이 해당 문자열 안에 존재하는지 여부를 확인할 수 있습니다. 이 기능은 하위 문자열 검색을 위한 간단하고 빠른 방법이며, 다양한 사용 사례에서 유용하게 활용됩니다. 다양한 방법을 통해 이를 달성할 수 있으며, 각 방법을 하나씩 살펴보겠습니다.
'contains()' 메서드 활용
'contains()' 메서드를 사용하면 하위 문자열의 존재 여부를 매우 쉽게 확인할 수 있습니다. String 클래스에서 제공하는 이 메서드는 하위 문자열을 인자로 받고, 해당 하위 문자열이 원본 문자열 내에 존재하는지 여부를 나타내는 boolean 값을 반환합니다. 조건문, 삼항 연산자, 복잡한 로직을 구현하는 데 유용하게 사용될 수 있습니다.
코드 예제를 통해 좀 더 자세히 알아보겠습니다.
public class Substrings{
public static void main(String args[]){
String str="koreantech.org";
System.out.println("Flare를 포함하고 있나요? \n"+ str.contains("Flare"));
}
}
결과:
Flare를 포함하고 있나요? false
이 코드는 문자열 "koreantech.org" 내에 "Flare"라는 단어가 존재하는지 확인합니다. 결과적으로 해당 단어가 없으므로 boolean 값 "false"가 반환됩니다.
public class Substrings{
public static void main(String args[]){
String str="koreantech.org";
System.out.println("org를 포함하고 있나요? \n"+ str.contains("org"));
}
}
결과:
org를 포함하고 있나요? true
위 예제에서는 하위 문자열이 문자열 내부에 존재하므로 "true"를 반환합니다. 이를 통해 하위 문자열 존재 여부를 쉽게 확인할 수 있습니다.
하위 문자열의 위치 찾기
#1. 'indexOf()' 메서드 활용
'indexOf()' 메서드는 하위 문자열의 존재 여부와 함께 해당 하위 문자열이 처음 나타나는 인덱스를 찾는 데 활용됩니다. 이 메서드는 문자열이나 문자를 입력으로 받고, 문자열 내에서 해당 문자열이 처음으로 나타나는 위치의 인덱스를 반환합니다. 중요한 점은, 첫 번째 출현 위치의 인덱스만 제공하며, 다른 출현 여부를 확인하지 않는다는 점입니다. 또한, 하위 문자열이 존재하지 않는 경우, 이 메서드는 -1을 반환합니다.
예제를 통해 좀 더 자세히 알아보겠습니다.
public class Substrings{
public static void main(String args[]){
String str="GeekFlareGeekFlare";
System.out.println("Flare의 인덱스: "+ str.indexOf("Flare"));
}
}
결과:
Flare의 인덱스: 4
위 예제에서 "Flare" 하위 문자열은 "GeekFlareGeekFlare" 문자열의 인덱스 4부터 시작합니다. 따라서 함수는 예상대로 해당 인덱스 값을 반환했습니다.
#2. 'lastIndexOf()' 메서드 활용
'lastIndexOf()' 메서드는 'indexOf()' 메서드와 매우 유사합니다. 둘 다 하위 문자열을 인자로 받아 해당 하위 문자열의 인덱스를 반환하며, 문자열 내에서 해당 하위 문자열을 찾을 수 없는 경우 동일한 -1을 반환합니다.
주요 차이점은 'indexOf()'는 하위 문자열이 처음 나타나는 위치의 인덱스를 반환하는 반면, 'lastIndexOf()'는 하위 문자열이 마지막으로 나타나는 위치의 인덱스를 반환한다는 것입니다.
다음 코드를 통해 동작을 확인해 보겠습니다.
public class Substrings{
public static void main(String args[]){
String str="GeekFlareGeekFlare";
System.out.println("Flare의 마지막 인덱스: "+ str.lastIndexOf("Flare"));
}
}
결과:
Flare의 마지막 인덱스: 13
위 출력 결과를 통해 'lastIndexOf()' 메서드가 예상대로 동작하여, "GeekFlareGeekFlare" 문자열에서 하위 문자열 "Flare"가 마지막으로 나타나는 위치의 인덱스를 반환하는 것을 알 수 있습니다.
FAQ
빈 문자열이 아닌 하위 문자열을 생성하기 위해 'split()' 메서드를 사용하는 방법은 무엇인가요?
기본 문자열에 정규식 문자열의 정규식 인스턴스가 여러 개 있을 경우("Hello%%Hi", 여기서 정규식은 "%"), 'split()' 메서드는 첫 번째 인스턴스를 중단 문자로 간주하고 나머지는 빈 문자열을 출력합니다. 이러한 경우, limit 매개변수를 0으로 지정하여 빈 문자열 출력을 방지할 수 있습니다. 이 설정을 통해 비어있지 않은 문자열만 출력으로 얻을 수 있습니다.
'indexOf()'는 하위 문자열의 모든 인스턴스에 대한 인덱스를 반환하나요?
아니요, 'indexOf()' 메서드는 하위 문자열의 모든 인스턴스에 대한 인덱스를 반환하지 않습니다. 'indexOf()'를 사용하면 하위 문자열이 처음 나타나는 위치의 인덱스만 반환받을 수 있습니다. 하위 문자열을 찾을 수 없는 경우에는 -1을 반환합니다.
지정된 인덱스가 문자열에 존재하지 않을 때 'substring()' 메서드는 무엇을 반환하나요?
지정된 시작 및 끝 인덱스가 문자열의 범위를 벗어나는 경우, 컴파일러에서 오류가 발생합니다. 해당 오류 메시지는 "java.lang.StringIndexOutOfBoundsException"으로 시작되며, 프로그램은 실행되지 않습니다.
결론
본 기사에서는 하위 문자열을 생성하고 조작하기 위한 다양한 방법과 필수적인 요소들을 상세히 살펴보았습니다. 하위 문자열 생성 방법, 문자열 내에서 하위 문자열의 존재 여부 확인 방법, 그리고 하위 문자열의 위치를 찾는 방법까지 알아보았습니다. 이러한 학습을 통해 하위 문자열을 활용하는 방법에 대한 깊은 이해를 얻으셨기를 바랍니다. 제공된 예제를 직접 따라 해보고 더 많은 연습을 통해 하위 문자열의 개념을 확실히 익히시길 바랍니다.
다음으로 Java 인터뷰 질문 목록을 확인할 수 있습니다.