-
String 클래스Java 2020. 1. 6. 21:45반응형
특징
immutable한 Object
- immutable : 불변의
- 한 번 생성되면 더 이상 그 값을 변경할 수 없음
즉, String 문자열을 더할 경우 새로운 String 객체가 생성되고 기존 객체는 버려짐
- 기존 객체는 버려지며, 나중에 GC(Garbage collection)의 대상이 됨
자주 쓰이는 생성자
String Object는 대부분 ""로 생성하기 때문에 굳이 생성자를 사용하지는 않음
아래 생성자들은 한글을 사용하는 우리나라에서 자주 사용하는 생성자
// 현재 사용중인 플랫폼의 charset을 이용하여 제공된 byte array를 decoding한 String Object 생성 String(byte[] bytes) // 지정한 charset을 이용하여 제공된 byte array를 decoding한 String Object 생성 String(byte[] bytes, String charsetName)
String을 byte Array로 변환
// Default CharSet의 byte Array를 생성 byte[] getBytes() // 지정한 Charset Type으로 Byte Array 생성 byte[] getBytes(Charset charset) // 지정한 이름의 Charset을 갖는 Byte Array 생성 byte[] getBytes(String charset)
java.nio.Charset 클래스 API - Standard charsets
US-ASCII Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode character set ISO-8859-1 ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1 UTF-8 Eight-bit UCS Transformation Format UTF-16BE Sixteen-bit UCS Transformation Format, big-endian byte order UTF-16LE Sixteen-bit UCS Transformation Format, little-endian byte order UTF-16 Sixteen-bit UCS Transformation Format, byte order identified by an optional byte-order mark 객체의 Null 체크
Object==Null && Object!=Null
길이 확인
int length() jamieStr.length();
비어있는지 확인
boolean isEmpty(); jamieStr.length()==0; jamieStr.isEmpty(); // 간단
같은지 비교
boolean equals(Object anObject) boolean equalsIgnoreCase(String anotherStr) // 대소문자 구분 X /* sorting시 주로 사용 * 비교하려는 매개 변수가 알파벳 순으로 앞이라면 양수, 뒤라면 음수 리턴 * 알파벳 순서만큼 숫자값 증가 */ int compareTo(String anotherStr) int compareToIgnoreCase(String str) // 대소문자 구분 X // CharSequence or StringBuffer 객체와 String 비교 boolean contentEqauls(CharSequence cs) boolean contentEqauls(SpringBuffer sb)
위치 찾기
// 왼쪽부터 검사 int indexOf(int ch) int indexOf(int ch, int fromIndex) int indexOf(String str) int indexOf(String str, int fromIndex) // 오른쪽부터 검사 int lastIndexOf(int ch) int lastIndexOf(int ch, int fromIndex) int lastIndexOf(String str) int lastIndexOf(String str, int fromIndex) /* Java Index는 0부터 시작함, FromIndex = 몇 번째부터 검사할지 * 포함되어 있지 않다면 둘 다 -1을 리턴 */
특정 조건에 맞는 문자열이 있는지 확인
// 매개 변수 값으로 시작하는지 검증 boolean startsWith(String prefix) boolean startsWith(String prefix, int toffset) // 매개 변수 값으로 끝나는지 검증 boolean endsWith(String suffix) // 매개 변수 값이 문자열에 존재하는지 확인 boolean contains(CharSequence s) // 매개 변수 정규식이 문자열에 매칭되는지 확인 boolean matches(String regex) /* 특정 영역이 매개 변수로 넘어온 문자열과 동일한지 확인 * ignoreCase : true인 경우 대소문자 구분을 하지 않고 값을 비교 * toffset : 비교 대상 문자열의 확인 시작 위치 지정, 음수면 false, toffset+len > 비교대상이면 false * other : 존재하는지 확인할 문자열 * ooffset : other 객체의 확인 시작 위치를 지정, 음수면 false, ooffset+len > other이면 false * len : 비교할 char의 개수를 지정 */ boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) boolean regionMatches(int toffset, String other, int ooffset, int len)
일부 추출
char
// 특정 위치의 char 값 리턴 char charAt(int index) // 지정된 index부터 offset이 설정된 index를 리턴 - 문자열 인코딩과 관련된 문제를 해결하기 위해 사용 int offsetByCodePoints(int index, int codePointOffset)
char Array → String
// char 배열을 문자 값으로 변환 static String copyValueOf(char[] data) // char 배열을 문자 값으로 변환, 단 offset ~ count까지의 개수만큼 static String copyValueOf(Char[] data, int offset, int count)
String → Char Array
// 문자열을 char 배열로 변환 char[] toCharArray()
String 일부 자르기
// beginIndex ~ 끝까지 String을 잘라 String으로 리턴 String substring(int beginIndex) /* beginIndex ~ endIndex까지 String을 잘라 String으로 리턴 * 단, endIndex >= beginIndex * 그렇지 않으면 StringIndexOutOfBoundsException 발생 */ String substring(int beginIndex, int endIndex) // beginIndex ~ endIndex까지 String을 잘라 CharSequence 타입으로 리턴 CharSequence subSequence(int beginIndex, int endInex)
String을 여러 개의 String Array로 나누기
// regex에 있는 정규 표현식에 맞추어 String을 잘라 String Array로 리턴 String[] split(String regex) // regex에 있는 정규 표현식에 맞추어 String Array로 리턴, 단 limit보다 배열의 크기가 클 수 없음 String[] split(String regex, int limit) /* 정규식을 사용하지 않고 특정 String으로 나눈다면 StringTokenizer 클래스를 사용하는 것이 편함 * 특정 알파벳이나 기호 하나로 나눈다면, split()이던 StringTokenizer던 상관 없음 */
String 값 변경
공백 제거
// 앞 뒤의 공백을 제거한 String 리턴 String trim()
내용 대치(replace)
// oldChar의 값을 newChar로 대치 String replace(char oldChar, char newChar) // target과 같은 값을 replacement로 대치 String replace(CharSequence target, CharSequence replacement) // regex에 표현된 정규표현식에 포함되는 모든 내용을 replacement로 대치 String replaceAll(String regex, String replacement) // regex에 표현된 정규표현식에 포함되는 첫번째 내용을 replacement로 대치 String replaceFirst(String regex, String replacement)
형식에 맞춰 값을 치환
// format 중 변환해야 하는 부분을 args로 변환 static String format(String format, Object... args) // 출력만 하려면 아래 메서드 이용해도 상관 없음 System.out.format() /* 매개 변수 수 < 변경해야 할 대상 수 * java.util.MissingFormatArgumentException */
대소문자 변경
// 소문자로 String toLowerCase() // 대문자로 String toUpperCase()
자료형을 String으로 변환
static String valueOf(boolean b) static String valueOf(char c) static String valueOf(char[] data) static String valueOf(char[] data, int offset, int count) static String valueOf(double d) static String valueOf(float f) static String valueOf(int i) static String valueOf(long l) // 객체가 null이라면 "null"이라는 String을 리턴함 static String valueOf(Object obj) /* +"" vs valueOf * 아래 두 개는 결과는 같지만, 별도의 문자열과 합치는 과정이 없을 경우엔 valueOf 사용 권장 */ String.valueOf(jamieStr); jamieStr+"";
주의, 사용하지 말 것 - intern()
C로 구현되어 있는 native 메서드 중 하나
시스템의 심각한 성능 저하를 발생시킬 수도 있음
- 억지로 Constant pool에 값을 할당하도록 만드므로, 저장되는 영역은 한계가 있으므로 그 영역에 대해서 메모리를 지우는 단계를 거치게 됨
- equlals() 보다 ==이 빠르지만, 이 작은 차이를 위해서 intern()을 사용하기엔 매우 비생산적
// Constant pool에 해당 값이 없으므로 새로 생성 String jamieStr1 = "Jamie"; // 같은 문자열이 Constant pool에 있으므로 해당 값을 사용 String jamieStr2 = "Jamie"; // 즉 jamieStr1==jamieStr2 System.out.println(jamieStr1==jamieStr2); // true // 같은 문자열이 있건 말건 새로운 객체 생성 String jamieStr3 = new String("Jamie"); // 즉 jamieStr1!=jamieStr3 System.out.println(jamieStr1==jamieStr3); // false // 같은 문자열이 있건 말건 새로운 객체 생성 String jamieStr4 = new String("Jamie"); /* intern()은 풀에 해당 값이 있으면, 풀에 있는 값을 리턴, 없다면 풀에 해당 값을 추가 * 성능에 악영향을 끼치는 부분 */ jamieStr4 = jamieStr4.intern(); // 즉 jamieStr1==jamieStr4 System.out.println(jamieStr1==jamieStr4); // true
StringBuffer와 StringBuilder
immutable한 String의 단점을 보완하기에 나온 클래스
- 문자열을 더하더라도 새로운 객체를 생성하지 않음
append() 메서드
매개 변수로 모든 기본 자료형과 참조 자료형 사용 가능
StringBuilder jamieSb = new StringBuidler(); jamieSb.append("Hello"); jamieSb.append(" world"); jamieSb.append(" Hello").append(" world");
특징
JDK 5 ~ String의 더하기 연산시, 컴파일할 때 자동으로 해당 연산은 StringBuilder로 변환해줌
- 일일이 더하는 작업을 변환해줄 필요는 없음
- for 루프와 같은 반복 연산시에는 자동 변환이 안되므로 꼭 필요함
공통점
모두 문자열을 다룸
CharSequence 인터페이스를 구현
= String / StringBuffer / StringBuilder를 사용하여 매개 변수로 받는 작업을 할 때 CharSequence 타입으로 받는 것이 좋음
차이점
StringBuffer == Thread Safe (더 안전함)
- 어떤 클래스에 문자열을 생성하여 더하기 위한 문자열을 처리하기 위한 인스턴스 변수가 선언
- 어떤 쓰레드에서 해당 변수를 동시에 접근하는 경우
StringBuilder != Thread Safe (속도는 더 빠름)
- 하나의 메서드 내에서 문자열을 생성하여 더할 경우
반응형'Java' 카테고리의 다른 글
java.lang.Math & StrictMath Class (0) 2020.01.07 java.lang.System Class (0) 2020.01.07 java.lang 기본 자료형 타입 클래스 (0) 2020.01.07 java.lang 패키지 구조 (0) 2020.01.07 JAVA API 문서 보기 (기준 JDK8) (0) 2020.01.06