String 클래스는 문자열의 추출, 비교, 찾기, 분리, 변환 등과 같은 다양한 메소드를 가지고 있습니다. 그중에서도 사용 빈도수가 높은 10가지 메소드를 소개합니다.
리턴 타입 | 메소드 이름(매개 변수) | 설명 |
char | charAt(int index) | 특정 위치의 문자를 리턴합니다. |
boolean | equals(Object anObject) | 두 문자열을 비교합니다. |
byte[] | getBytes() | byte[]로 리턴합니다. |
byte[] | getBytes(Charset charset) | 주어진 문자셋으로 인코딩한 byte[]로 리턴합니다. |
int | indexOf(String str) | 문자열 내에서 주어진 문자열의 위치를 리턴합니다. |
int | length() | 총 문자의 수를 리턴합니다. |
String | replace(CharSequence target, CharSequence replacement) | target 부분을 replacement로 대치한 새로운 문자열을 리턴합니다. |
String | substring(int beginIndex) | beginIndex 위치에서 끝까지 잘라낸 새로운 문자열을 리턴합니다. |
String | substring(int beginIndex, int endIndex) | beginIndex 위치에서 endIndex 전까지 잘라낸 새로운 문자열을 리턴합니다. |
String | toLowerCase() | 알파벳 소문자로 변환한 새로운 문자열을 리턴합니다. |
String | toUpperCase() | 알파벳 대문자로 변환한 새로운 문자열을 리턴합니다. |
String | trim() | 앞뒤 공백을 제거한 새로운 문자열을 리턴합니다. |
String | valueOf(int i) valueOf(double d) |
기본 타입 값을 문자열로 리턴합니다. |
✅문자 추출(charAt( ))
charAt( ) 메소드는 매개값으로 주어진 인덱스의 문자를 리턴합니다. 여기서 인덱스란 0에서부터 ‘문자열 길이-1’까지의 번호를 말합니다.
String subject = "자바 프로그래밍";
char charValue = subject.charAt(3);
“자바 프로그래밍” 문자열은 다음과 같이 인덱스를 매길 수 있습니다. charAt(3)은 3번 인덱스 위치에 있는 문자를 말합니다. 즉 ‘프’ 문자가 해당됩니다.
자 | 바 | 프 | 로 | 그 | 래 | 밍 | |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
✅문자열 비교(equals( ))
기본 타입(byte, char, short, int, long, float, double, boolean) 변수의 값을 비교할 때에는 == 연산자를 사용합니다. 그러나 문자열을 비교할 때에는 == 연산자를 사용하면 원하지 않는 결과가 나올 수 있습니다.
String strVar1 = new String(“신민철”);
String strVar2 = “신민철”;
String strVar3 = “신민철”;
자바는 문자열 리터럴이 동일하다면 동일한 String 객체를 참조하도록 되어 있습니다. 그래서 strVar2와 strVar3은 동일한 String 객체를 참조합니다. 그러나 strVar1은 new 연산자로 생성된 다른 String 객체를 참조합니다.
이 경우 변수 strVar1과 strVar2의 == 연산은 false를 산출하고 strVar2와 strVar3의 == 연산은 true를 산출합니다. == 연산자는 각 변수에 저장된 번지를 비교하기 때문에 이러한 결과가 나옵니다.
strVar1 == strVar2 //false
strVar2 == strVar3 //true
만약 두 String 객체의 문자열만을 비교하고 싶다면 == 연산자 대신에 equals( ) 메소드를 사용해야 합니다. 원래 equals( )는 Object 클래스의 번지 비교 메소드이지만, String 클래스가 재정의해서 문자열을 비교하도록 변경했습니다.
strVar1.equals(strVar2) //true
strVar2.equals(strVar3) //true
✅바이트 배열로 변환(getBytes( ))
종종 문자열을 바이트 배열로 변환하는 경우가 있는데요, 대표적인 예로 네트워크로 문자열을 전송하거나, 문자열을 암호화할 때 문자열을 바이트 배열로 변환하는 경우가 있습니다. 문자열을 바이트 배열로 변환하는 메소드는 다음 두 가지가 있습니다.
byte[] bytes = "문자열".getBytes();
byte[] bytes = "문자열".getBytes(Charset charset);
getBytes( ) 메소드는 시스템의 기본 문자셋으로 인코딩된 바이트 배열을 리턴합니다. 만약 특정 문자셋으로 인코딩된 바이트 배열을 얻으려면 두 번째 메소드를 사용하면 됩니다. 다음은 EUC-KR과 UTF-8로 각각 인코딩된 바이트 배열을 리턴합니다.
try {
byte[] bytes1 = "문자열".getBytes("EUC-KR");
byte[] bytes2 = "문자열".getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
}
어떤 문자셋으로 인코딩하느냐에 따라 바이트 배열의 크기가 달라집니다. EUC-KR은 getBytes( )와 마찬가지로 알파벳은 1바이트, 한글은 2바이트로 변환하고, UTF-8은 알파벳은 1바이트, 한글은 3바이트로 변환합니다. getBytes(Charset charset) 메소드는 잘못된 문자셋을 매개값으로 줄 경우, java.io.UnsupportedEncodingException이 발생하므로 예외 처리가 필요합니다.
바이트 배열을 다시 문자열로 변환(디코딩)할 때에는 어떤 문자셋으로 인코딩된 바이트 배열이냐에 따라서 디코딩 방법이 다릅니다. 단순하게 String(byte[] bytes) 생성자를 이용해서 디코딩하면 시스템의 기본 문자셋을 이용합니다. 시스템 기본 문자셋과 다른 문자셋으로 인코딩된 바이트 배열일 경우 다음 String 생성자를 이용해서 디코딩해야 합니다.
String str = new String(byte[] bytes, String charsetName);
✅문자열 찾기(indexOf( ))
indexOf( ) 메소드는 매개값으로 주어진 문자열이 시작되는 인덱스를 리턴합니다. 만약 주어진 문자열이 포함되어 있지 않으면 -1을 리턴합니다.
String subject = "자바 프로그래밍";
int index = subject.indexOf("프로그래밍");
index 변수에는 3이 저장되는데, “자바 프로그래밍”에서 “프로그래밍” 문자열의 인덱스 위치가 3이기 때문입니다.
자 | 바 | 프 | 로 | 그 | 래 | 밍 | |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
indexOf( ) 메소드는 if문의 조건식에서 특정 문자열이 포함되어 있는지 여부에 따라 실행 코드를 달리할 때 자주 사용됩니다. -1 값을 리턴하면 특정 문자열이 포함되어 있지 않다는 뜻입니다.
if( 문자열.indexOf("찾는문자열") != -1 ) {
//포함되어 있는 경우
} else {
//포함되어 있지 않은 경우
}
✅문자열 길이(length( ))
length( ) 메소드는 문자열의 길이(문자의 수)를 리턴합니다.
String subject = "자바 프로그래밍";
int length = subject.length();
length 변수에는 8이 저장됩니다. subject 객체의 문자열 길이는 공백을 포함해서 8개이기 때문입니다.
자 | 바 | 프 | 로 | 그 | 래 | 밍 | |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
✅문자열 대치(replace( ))
replace( ) 메소드는 첫 번째 매개값인 문자열을 찾아 두 번째 매개값인 문자열로 대치한 새로운 문자열을 생성하고 리턴합니다.
String oldStr = "자바 프로그래밍";
String newStr = oldStr.replace("자바", "JAVA");
String 객체의 문자열은 변경이 불가능한 특성을 갖기 때문에 replace( ) 메소드가 리턴하는 문자열은 원래 문자열의 수정본이 아니라 완전히 새로운 문자열입니다. 따라서 newStr 변수는 다음 그림과 같이 새로 생성된 “JAVA 프로그래밍” 문자열을 참조합니다.
✅문자열 잘라내기(substring( ))
substring( ) 메소드는 주어진 인덱스에서 문자열을 추출합니다. substring( ) 메소드는 매개값의 수에 따라 두 가지 형태로 사용됩니다. substring(int beginIndex, int endIndex)는 주어진 시작과 끝 인덱스 사이의 문자열을 추출하고, substring(int beginIndex)는 주어진 인덱스부터 끝까지문자열을 추출합니다.
String ssn = "880815-1234567";
String firstNum = ssn.substring(0, 6);
String secondNum = ssn.substring(7);
상기 코드에서 firstNum 변수값은 “880815”이고, secondNum 변수값은 “1234567”입니다. ssn.substring(0, 6)은 인덱스 0(포함)~6(제외) 사이의 문자열을 추출하는 것이고, substring(7)은 인덱스 7부터 끝까지 문자열을 추출합니다.
8 | 8 | 0 | 8 | 1 | 5 | – | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
✅알파벳 소·대문자 변경(toLowerCase( ), toUpperCase( ))
toLowerCase( ) 메소드는 문자열을 모두 소문자로 바꾼 새로운 문자열을 생성한 후 리턴합니다. 반대로 toUpperCase( ) 메소드는 문자열을 모두 대문자로 바꾼 새로운 문자열을 생성한 후 리턴합니다.
String original = "Java Programming";
String lowerCase = original.toLowerCase();
String upperCase = original.toUpperCase();
lowerCase 변수는 새로 생성된 “java programming” 문자열을 참조하고 upperCase 변수는 새로 생성된 “JAVA PROGRAMMING” 문자열을 참조합니다. 이때 원래 original 변수의 “Java Programming” 문자열이 변경된 것은 아닙니다.
toLowerCase( )와 toUpperCase( ) 메소드는 영어로 된 두 문자열을 대소문자와 관계없이 비교할 때 주로 이용됩니다. 다음 예제에서는 두 문자열이 대소문자가 다를 경우 어떻게 비교하는지를 보여줍니다. equals( ) 메소드를 사용하려면 사전에 toLowerCase( )와 toUpperCase( )로 대소문자를 맞추어야 하지만, equalsIgnoreCase( ) 메소드를 사용하면 이 작업이 생략됩니다.
✅문자열 앞뒤 공백 잘라내기(trim( ))
trim( ) 메소드는 문자열의 앞뒤 공백을 제거한 새로운 문자열을 생성하고 리턴합니다. 다음 코드를 보면 newStr 변수는 앞뒤 공백이 제거된 새로 생성된 “자바 프로그래밍” 문자열을 참조합니다. trim( ) 메소드는 앞뒤의 공백만 제거할 뿐 중간의 공백은 제거하지 않습니다.
String oldStr = " 자바 프로그래밍 ";
String newStr = oldStr.trim();
trim( ) 메소드를 사용한다고 해서 원래 문자열의 공백이 제거되는 것은 아닙니다. 다음 그림에서 oldStr.trim( )은 oldStr의 공백을 제거하는 것이 아닙니다.
✅문자열 변환(valueOf( ))
valueOf( ) 메소드는 기본 타입의 값을 문자열로 변환하는 기능을 가지고 있습니다. String 클래스에는 매개 변수의 타입별로 valueOf( ) 메소드가 다음과 같이 오버로딩되어 있습니다.
static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(int i)
static String valueOf(long l)
static String valueOf(double d)
static String valueOf(float f)
위 내용은 『혼자 공부하는 자바』의 일부분을 재구성하여 작성하였습니다.
핵심 내용 위주로 구성하여 이제 막 자바를 배우기 시작한 입문자도 포기하지 않고 완독할 수 있습니다. 자바 입문부터 복습까지, 혼자 공부하는 자바를 펼쳐보세요!
👀 도서 자세히 보기
✍️ 유튜브 강의
🙋 신용권 저자님께 질문하기
Leave A Comment