티스토리 뷰
반응형
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. 요약 및 팁
- 끝 인덱스는 미포함(Exclusive)이라는 점을 항상 기억하세요.
- 동적인 문자열을 자를 때는 반드시 indexOf()로 위치를 먼저 파악한 후 substring()을 호출하세요.
- 문자열을 반복문 안에서 너무 많이 자르고 붙여야 한다면, StringBuilder의 delete()나 insert() 사용을 고려해 보세요.
#Java #자바강좌 #Substring #문자열자르기 #String클래스 #자바기초 #코딩테스트 #JavaProgramming #문자열파싱 #IndexOutOfBoundsException #자바예제 #백엔드개발 #SoftwareDevelopment
'Java' 카테고리의 다른 글
| JAVA(Spring Boot) 로그인 기능 구현 방법 (0) | 2026.06.01 |
|---|---|
| JAVA Session Life Cycle 세션 생명주기 내용 정리 (0) | 2026.05.11 |
| JAVA 함수 실행시간 측정 currentTimeMillis(), nanoTime() 사용법 (0) | 2026.05.10 |
| facebook graph api로 게시글 가져오기 (1) | 2019.09.23 |
| 구글, 파파고 번역 API 성능 비교 (1) | 2019.09.18 |
| google translate api v3 사용법 (1) | 2019.09.16 |
| java spring pwa fcm web push 구현 (2) | 2019.09.10 |
| Object 클래스에 대해 (0) | 2018.11.04 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 상속
- 블루투스
- 자바
- 문자열
- Android
- String
- C++
- c#
- 알고리즘
- html
- 파일처리
- 벡터
- 배열
- OpenCV
- DB연동
- Class
- MySQL
- 파이썬
- C
- 클래스
- 리스트
- 자료구조
- 아두이노
- 데이터베이스
- 정보처리기사
- C언어
- 안드로이드
- 문제풀이
- C++ 클래스
- Java
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함
반응형
