티스토리 뷰

반응형

Java에서 문자열을 다루는 데 있어 substring()은 가장 기본적이면서도 강력한 메서드입니다. 자바의 String 클래스가 제공하는 이 함수는 특정 인덱스를 기준으로 문자열을 자르고 부분 문자열(Sub-string)을 추출하는 데 사용됩니다.

입문자부터 고급 개발자까지 모두 참고할 수 있도록 기본 문법, 동작 원리, 주의사항, 관련 함수, 그리고 실무형 고급 예제까지 상세히 정리해 드립니다.


1. Substring 기본 문법 및 특징

자바의 substring() 메서드는 크게 두 가지 형태로 오버로딩되어 있습니다.

① substring(int beginIndex)

  • 설명: beginIndex부터 문자열의 끝까지를 잘라서 반환합니다.
  • 특징: 인덱스는 0부터 시작합니다.

② substring(int beginIndex, int endIndex)

  • 설명: beginIndex부터 endIndex 전까지의 문자열을 반환합니다.
  • 공식: 추출되는 문자열의 길이는 endIndex - beginIndex입니다.
  • 주의: endIndex 위치의 문자는 결과에 포함되지 않습니다. (Exclusive)

2. 기초 예제 코드

Java
 
public class SubstringExample {
    public static void main(String[] args) {
        String str = "HelloJavaWorld";

        // 1. 끝까지 자르기
        String sub1 = str.substring(5); 
        System.out.println("sub1: " + sub1); // 결과: JavaWorld

        // 2. 중간만 자르기 (5번 인덱스부터 9번 전까지)
        String sub2 = str.substring(5, 9);
        System.out.println("sub2: " + sub2); // 결과: Java

        // 3. 빈 문자열 추출 (시작과 끝이 같을 때)
        String sub3 = str.substring(5, 5);
        System.out.println("sub3: '" + sub3 + "'"); // 결과: ''
    }
}

3. 관련 핵심 함수 및 비교

substring과 함께 쓰면 시너지가 나거나, 유사한 역할을 하는 함수들을 정리했습니다.

함수명 설명 비고
indexOf(String s) 특정 문자의 위치(인덱스)를 찾음 substring의 인자를 동적으로 계산할 때 필수
lastIndexOf(String s) 뒤에서부터 특정 문자의 위치를 찾음 확장자 추출 등에 유용
split(String regex) 구분자를 기준으로 문자열 배열 생성 데이터 파싱 시 substring보다 편리할 수 있음
charAt(int i) 특정 인덱스의 문자 하나만 반환 단일 문자 검사 시 사용
replace() 문자열의 일부를 치환 특정 구간을 바꾸고 싶을 때 사용

반응형

4. 실무형 고급 활용 예제

A. 파일 경로에서 파일명과 확장자 분리하기

가장 흔하게 사용되는 패턴입니다. lastIndexOf와 조합합니다.

Java
 
String filePath = "C:/users/documents/resume.pdf";

int lastSlash = filePath.lastIndexOf("/");
int lastDot = filePath.lastIndexOf(".");

String fileName = filePath.substring(lastSlash + 1, lastDot);
String extension = filePath.substring(lastDot + 1);

System.out.println("파일명: " + fileName); // resume
System.out.println("확장자: " + extension); // pdf

B. 개인정보 마스킹 처리

이름이나 전화번호의 일부를 별표(*)로 처리할 때 사용합니다.

Java
 
String phone = "010-1234-5678";
// 중간 번호만 마스킹
String maskedPhone = phone.substring(0, 4) + "****" + phone.substring(9);
System.out.println(maskedPhone); // 010-****-5678

C. 고정 길이 데이터(Flat File) 파싱

은행이나 레거시 시스템에서 사용하는 전문 데이터를 처리할 때 유용합니다.

Java
 
String rawData = "20231027ITEM001  5000";
String date = rawData.substring(0, 8);
String itemId = rawData.substring(8, 15).trim();
String price = rawData.substring(15).trim();

System.out.println("날짜: " + date + ", 아이디: " + itemId + ", 가격: " + price);

5. 주의사항 및 성능 (Internal Memory)

① StringIndexOutOfBoundsException

  • 시작 인덱스가 0보다 작거나, 종료 인덱스가 문자열 길이보다 클 때, 혹은 시작 인덱스가 종료 인덱스보다 클 때 발생합니다.
  • 방어 코드 예시: if (str.length() >= targetIndex) { ... }

② 메모리 누수 (Memory Leak) 이슈 (과거 버전)

  • Java 6 이전: substring()이 생성된 문자열이 원본 문자열의 char[] 배열을 공유했습니다. 아주 큰 문자열에서 아주 작은 조각 하나만 substring해도 원본 전체가 메모리에 남아있는 문제가 있었습니다.
  • Java 7 이후: 새로운 char[] 배열을 복사하여 생성하도록 변경되었습니다. 현재 대부분의 환경(Java 8~21+)에서는 메모리 공유 걱정 없이 사용하셔도 됩니다.

6. 요약 및 팁

  1. 끝 인덱스는 미포함(Exclusive)이라는 점을 항상 기억하세요.
  2. 동적인 문자열을 자를 때는 반드시 indexOf()로 위치를 먼저 파악한 후 substring()을 호출하세요.
  3. 문자열을 반복문 안에서 너무 많이 자르고 붙여야 한다면, StringBuilder의 delete()나 insert() 사용을 고려해 보세요.

 

#Java #자바강좌 #Substring #문자열자르기 #String클래스 #자바기초 #코딩테스트 #JavaProgramming #문자열파싱 #IndexOutOfBoundsException #자바예제 #백엔드개발 #SoftwareDevelopment

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함
반응형