학습 목표
· String의 생성자
· String to byte[]
- java.nio.Charset 클래스 API에 정의된 표준 캐릭터 셋
· String 내용을 비교하고 검색하는 메소드
- 문자열의 길이 확인하는 메소드
- 문자열이 비어있는지 확인하는 메소드
- 문자열이 같은지 비교하는 메소드
- 특정 조건에 맞는 문자열이 있는지 확인하는 메소드
· String 내에서 위치를 찾아내는 방법
· String 값의 일부를 추출하기 위한 메소드
- char 단위의 값을 추출
- char 배열의 값을 String으로 변환
- String의 값을 char 배열로 변환
- 문자열의 일부 값을 잘라내는 메소드
- 문자열을 여러 개의 String 배열로 나누는 메소드
· String 값을 바꾸는 메소드
- 문자열 합치기
- 문자열 공백 없애기
- 문자열 내용 교체
- 특정 형식에 맞춰 값을 치환
- 대소문자 바꾸기
- 기본 자료형을 문자열로 변환
· 절대 사용하면 안되는 메소드 - intern
String의 생성자
생성자 | 설명 |
String() | 비어있는 String 객체 생성 전혀 의미가 없으므로, 차라리 다음과 같이 선언하는 것이 효율적 String name = null; |
String(byte[] bytes) | 현재 사용중인 플랫폼의 캐릭터 셋을 사용하여 제공된 byte배열을 디코딩한 String 객체 생성 |
String(byte[] bytes, Charset charset) | 지정한 캐릭터 셋을 사용하여 제공된 byte 배열을 디코딩한 String 객체 생성 |
String(byte[] bytes, String charsetName) | 지정한 이름을 갖는 캐릭터 셋을 사용하여 지정한 byte 배열을 디코딩한 String 객체 생성 |
String(byte[] bytes, int offset, int length) | 현재 사용중인 플랫폼의 기본 캐릭터 셋을 사용하여 지정한 byte 배열의 일부를 디코딩한 String 객체를 생성 |
String(byte[] bytes, int offset, int length, String charsetName) |
지정한 이름을 갖는 캐릭터 셋을 사용하여 byte 배열의 일부를 디코딩한 String 객체를 생성 |
String(char[] value) | char 배열의 내용을 붙여 String 객체 생성 |
String(char[] value, int offset, int count) | char 배열의 일부 내용을 붙여 String 객체 생성 |
String(int[] codePoints, int offset, int count) |
유니코드 코드 위치(Unicode code point)로 구성된 배열의 일부로 새로운 String 객체 생성 |
String(String original) | 매개 변수로 넘어온 String과 동일한 값을 갖는 String 객체 생성 |
String(StringBuffer buffer) | 매개 변수로 넘어온 StringBuffer 클래스에 정의되어 있는 문자열의 값과 동일한 String 객체 생성 |
String(StringBuilder builder) | 매개 변수로 넘어온 StringBuilder 클래스에 정의되어 있는 문자열의 값과 동일한 String 객체 생성 |
예시
String str = "Hello";
byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
String str2 = new String(bytes, StandardCharsets.UTF_8); // byte[] + charset
String str3 = new String(bytes,"UTF-8"); // byte[] + charsetName
String to byte[]
String 클래스에는 현재의 문자열 값을 byte 배열로 변환하는 getBytes() 메소드들이 존재
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
byte[] | getBytes() | 기본 캐릭터 셋의 바이트 배열을 생성 |
byte[] | getBytes(Charset charset) | 지정한 캐릭터 셋 객체 타입으로 바이트 배열 생성 |
byte[] | getBytes(String charsetName) | 지정한 이름의 캐릭터 셋을 갖는 바이트 배열 생성 |
· 같은 프로그램 내에서 문자열을 byte 배열로 만들 때는 첫 번째 메소드를 사용
· 다른 시스템에서 전달 받은 문자열은 (다른 캐릭터 셋일 수도 있어서) 두번째나 세번째 메소드 사용을 추천
java.nio.Charset 클래스 API에 정의된 표준 캐릭터 셋
캐릭터 셋 이름 | 설명 |
US-ASCII | 7비트 아스키 |
ISO-8859-1 | ISO 라틴 알파벳 |
UTF-8 | 8비트 UCS 변환 포맷 |
UTF-16BE | 16비트 UCS 변환 포맷. big-endian 바이트 순서를 가진다. |
UTF-16LE | 16비트 UCS 변환 포맷. little-endian 바이트 순서를 가진다. |
UTF-16 | 16비트 UCS 변환 포맷. 바이트의 순서는 byte-order mark라는 것에 의해서 정해진다. |
EUC-KR | 8비트 문자 인코딩으로, EUC의 일종이며 대표적인 "한글 완성형" 인코딩 |
MS949 | Microsoft에서 만든 "한글 확장 완성형" 인코딩 |
· 사용하는 캐릭터 셋에 따라 배열의 크기가 다름
ex) 한글 두 글자를 표현하는 경우 EUC-KR은 4바이트, UTF-16은 6바이트를 사용
· 국내에서 개발하면서 자바에서 한글이 몇 바이트를 점유하는지 알아 두는 것은 중요
· 주의! 문자열을 잘못된 캐릭터 셋으로 변환하면 알아 볼 수 없다
예시
String str = "Hello";
byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
String correctedEncoding = new String(bytes, StandardCharsets.UTF_8);
String incorrectedEncoding = new String(bytes, StandardCharsets.UTF_16);
System.out.println(correctedEncoding);
System.out.println(incorrectedEncoding);
String 내용을 비교하고 검색하는 메소드
문자열의 길이 확인하는 메소드
리턴 타입 | 메소드 이름 및 매개 변수 |
int | length() |
문자열이 비어있는지 확인하는 메소드
리턴 타입 | 메소드 이름 및 매개 변수 |
boolean | isEmpty |
문자열이 같은지 비교하는 메소드
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
boolean | equals(Object anObject) | 문자열 객체가 매개변수로 넘어온 객체와 같은지 비교 |
boolean | equalsIgnoreCase(String anotherStr) | 대소문자를 구분하지 않고 equals 메소드를 실행 |
int | compareTo(String anotherStr) | · 입력된 문자열 객체가 알파벳 순으로 앞에 있으면 양수, 뒤에 있으면 음수, 같으면 0리턴 · 알파벳 순서만큼 숫자값이 커짐 · 정렬(sorting)에 주로 사용 |
int | compareToIgnoreCase(String str) | 대소문자를 구분하지 않고 compareTo 메소드를 실행 |
boolean | contentEquals(CharSequence cs) | 문자열 객체가 매개변수로 넘어온 CharSequence 객체와 같은지 비교 |
boolean | contentEquals(StringBuffer sb) | 문자열 객체가 매개변수로 넘어온 StringBuffer 객체와 같은지 비교 |
특정 조건에 맞는 문자열이 있는지 확인하는 메소드
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
boolean | startsWith(String prefix) | 매개변수로 넘겨준 값으로 시작하는지 확인 |
boolean | startsWith(String prefix, int toffset) | 매개변수로 넘겨준 값으로 시작하는지 확인 - toffset: 비교 대상 문자열의 확인 시작 위치를 지정 |
boolean | endsWith(String suffix) | 매개변수로 넘겨준 값으로 끝나는지 확인 |
boolean | contains(CharSequence s) | 매개변수로 넘겨준 값이 문자열에 존재하는지 확인 |
boolean | matches(String regex) | 매개변수로 넘겨준 정규 표현식 값이 문자열에 존재하는지 확이니 |
boolean | regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) |
· 문자열 중에서 특정 영역이 매개 변수로 넘어온 문자열과 동일한지 확인 · 대소문자 구분 여부 선택 가능 - ignoreCase: true일 경우 대소문자 구분을 하지 않고, 값을 ㅂ교 - toffset: 비교 대상 문자열의 확인 시작 위치를 지정 - other: 존재하는지 확인할 문자열 - oofset: other 객체의 확인 시작 위치를 지정 - len: 비교할 char의 개수를 지정 |
boolean | regionMatches(int toffset, String other, int ooffset, int len) |
· 문자열 중에서 특정 영역이 매개 변수로 넘어온 문자열과 동일한지 확인 · 대소문자 구분 여부 선택 불가 |
· startsWith, endsWith 메소드로 indexOf() 메소드가 문자열의 모든 내용을 확인하는 단점 보완 가능
· 정규 표현식은 이메일, 웹페이지 URL 등 공식에 따라 만든 식을 말한다 ex) 010-xxxx-xxxx, xxxx@naver.com
String 내에서 위치를 찾아내는 방법
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
int | indexOf(int ch) | 매개변수로 넘겨준 char를 왼쪽에서 오른쪽 방향으로 찾아 위치를 반환 |
indexOf(int ch, int fromIndex) | 매개변수로 넘겨준 char를 fromIndex 위치부터 오른쪽 방향으로 찾아 위치를 반환 | |
indexOf(String str) | 매개변수로 넘겨준 문자열을 왼쪽에서 오른쪽 방향으로 찾아 위치를 반환 | |
indexOf(String str, int fromIndex) | 매개변수로 넘겨준 문자열을 fromIndex 위치부터 오른쪽 방향으로 찾아 위치를 반환 | |
lastIndexOf(int ch) | 매개변수로 넘겨준 char를 오른쪽에서 왼쪽 방향으로 찾아 위치를 반환 | |
lastIndexOf(int ch, int fromIndex) | 매개변수로 넘겨준 char를 fromIndex 위치부터 왼쪽 방향으로 찾아 위치를 반환 | |
lastIndexOf(String str) | 매개변수로 넘겨준 문자열을 오른쪽에서 왼쪽 방향으로 찾아 위치를 반환 | |
lastIndexOf(String str, int fromIndex) | 매개변수로 넘겨준 문자열을 fromIndex 위치부터 왼쪽 방향으로 찾아 위치를 반환 |
· char는 정수형이므로, 매개변수가 int인 메소드에 char를 넘겨주면 자동으로 형 변환이 일어남
String 값의 일부를 추출하기 위한 메소드
char 단위의 값을 추출
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
char | charAt(int index) | 특정 위치의 char 값을 리턴 |
void | getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | · 매개 변수 dst라는 char 배열 내에 srcBegin에서 srcEnd에 있는 char를 저장 · dst 배열의 시작위치는 dstBegin |
int | codePointAt(int index) | · 특정 위치의 유니코드 값을 리턴 · 리턴 타입은 int지만, 이 값을 char로 형 변환하면 char 값을 출력 |
int | codePointBefore(int index) | · 특정 위치 앞에 있는 char의 유니코드 값을 리턴 · 리턴 타입은 int지만, 이 값을 char로 형 변환하면 char 값을 출력 |
int | codePointCount(int beginIndex, int endIndex) |
지정한 범위에 있는 유니코드 개수 리턴 |
int | offsetByCodePoints(int index, int codePointOffset) |
지정된 index부터 offset이 설정된 인덱스를 리턴 |
· offsetByCodePoints() 메소드드의 용도: 문자열 인코딩과 관련된 문제를 해결
char 배열의 값을 String으로 변환
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
static String | copyValueOf(char[] data) | char 배열에 있는 값을 문자열로 변환 |
static String | copyValueOf(char[] data, int offset, int count) | · char 배열에 있는 값을 문자열로 변환 · 단, offset 위치부터 count까지의 개수만큼만 문자열로 변환 |
String의 값을 char 배열로 변환
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
char[] | toCharArray() | 문자열을 char 배열로 변환하는 메소드 |
· 어떠한 String 객체를 만들더라도, 그 객체는 내부에 char 배열을 포함
문자열의 일부 값을 잘라내는 메소드
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
String | substring(int beginIndex) | beginIndex부터 끝까지 대상 문자열을 잘라 String으로 리턴 |
String | substring(int beginIndex, int endIndex) |
beginIndex부터 endIndex까지 문자열을 잘라 String으로 리턴 |
CharSequence | subSequence(int beginIndex, int endIndex) |
beginIndex부터 endIndex까지 문자열을 잘라 CharSequence 타입으로 리턴 |
문자열을 여러 개의 String 배열로 나누는 메소드 - Split()
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
String[] | split(int regex) | regex에 있는 정규 표현식에 맞추어 문자열을 잘라 String 배열로 리턴 |
String[] | split(int regex, int limit) | · regex에 있는 정규 표현식에 맞추어 문자열을 잘라 String 배열로 리턴 · 이때 String 배열의 크기는 limit 보다 크면 안된다. |
· 자바에서 문자열을 여러 개의 문자열 배열로 나누는 방법:
1. String 클래스의 split() 메서드: 정규 표현식을 사용하여 문자열 나누기
2. java.util.StringTokenizer 클래스: 특정 String으로 문자열 나누기
이때 특정 알파벳이나 기호 하나로 나누려고 한다면 둘 중 무엇을 사용해도 상관 x
· split 조건(구분자)을 여러 개 사용하기
split() 메서드 인자로 입력하는 구분자를 '|' 문자로 나누어 여러 개 입력한다.
String str = "1@2#3@4&&5";
String splittedStrArr[] = str.split("#|@|&");
for (String splittedStr : splittedStrArr) {
System.out.print(splittedStr);
}
String 값을 바꾸는 메소드
문자열 합치기
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
String | concat(String str) | 매개 변수로 받은 str을 기존 문자열의 우측에 붙인 새로운 문자열 객체를 생성하여 리턴 |
문자열 공백 없애기
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
String | trim() | 문자열의 맨 앞과 맨 뒤에 있는 공백들을 제거한 문자열 객체를 리턴 |
예시 - 공백을 제외한 char 값이 하나라도 존재하는지 확인
String text = " a ";
if(text!=null && text.trim().length() > 0)
System.out.println("OK");
문자열 내용 교체
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
String | replace(char oldChar, char newChar) | 해당 문자열에 있는 oldChar의 값을 newChar로 대치 |
String | replace(CharSequence target, CharSequence replacement) |
해당 문자열에 있는 target과 같은 값을 replacement로 대치 |
String | replaceAll(String regex, String replacement) | 해당 문자열의 내용 중 regex에 표현된 정규 표현식에 포함되는 모든 내용을 replacement로 대치 |
String | replaceFirst(String regex, String replacement) | 해당 문자열의 내용 중 regex에 표현된 정규 표현식에 포함되는 첫번쨰 내용을 replacement로 대치 |
· 주의! - 위 메소드를 수행해도 기존 문자열이 바뀌는 것은 아니다(바뀐 문자열을 반환함)
· replace 관련 메소드는 대소문자를 구분
· replace vs replaceAll의 차이 https://jamesdreaming.tistory.com/85
· 특정 문자열 사이의 문자열 추출하기
'구분자A추출을원하는문자열구분자B' 형태의 문자열이 있을 때, '추출을원하는문자열'만 추출하고 싶다면
아래 형식의 정규식을 replaceAll() 메서드의 인자로 넣어서 해결할 수 있다.
[구분자A](.*?)[구분자B]
replaceAll() 메서드의 첫 번째 인자는 정규식, 두 번째 인자는 대체하길 원하는 문자열을 의미한다.
아래 코드는 추출을 원하는 문자열 앞 뒤의 "||" 문자열을 공백으로 바꾸는 예제다.
String str = "||innerContent||";
String regExpression = "[||](.*?)[||]";
String replacedStr = str.replaceAll(regExpression, "");
System.out.println(replacedStr);
https://pingukim.tistory.com/13
특정 형식에 맞춰 값을 치환
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
static String | format(String format, Object... args) | format에 있는 문자열의 내용 중 변환해야 하는 부분을 args의 내용으로 변환 |
static String | format(Locale l, String format, Objecct... args | · format에 있는 문자열의 내용 중 변환해야 하는 부분을 args의 내용으로 변환 · 단, Locale 타입 l에 선언된 지역에 맞추어 출력 |
· 자바에서는 %s는 String, %d는 정수형, %f는 소수점이 있는 숫자, %%는 %를 의미 (자세한 내용 java.util.Formatter 참조)
· 출력만을 위해서라면 해당 메소드 대신 System.out.format() 메소드를 사용할 수 있음
· 대치해야할 문자열 보다 매개변수가 적게 나열되면 MissingFormatArgumentException 발생
· Locale은 지역적으로 다른 표현 형식을 제공하기 위한 것으로, 지정하지 않으면 자바 프로그램이 수행되는 OS의 지역 정보를 따름
예시
String text = "이름:%s 나이:%d 시력:%f 재산상위:%d%%";
String realText = String.format(text, "Ted",28,0.5,50);
System.out.println(realText);
대소문자 바꾸기
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
String | toLowerCase() | 모든 문자열의 내용을 소문자로 변경 |
String | toLowerCase(Locale locale) | 지정한 지역 정보에 맞추어 모든 문자열의 내용을 소문자로 변경 |
String | toUppserCase() | 모든 문자열의 내용을 대문자로 변경 |
String | toUppserCase(Locale locale) | 지정한 지역 정보에 맞추어 모든 문자열의 내용을 대문자로 변경 |
기본 자료형을 문자열로 변환
리턴 타입 | 메소드 이름 및 매개 변수 |
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) |
static String | valueOf(Object obj) |
· 기본 자료형을 String과 합치는 과정을 거치면, 기본 자료형이 String으로 자동으로 바뀐다. (이때는 valueOf가 필요 없다.)
· valueOf 메소드에 null인 객체를 넘겨주면 "null"이라는 문자열을 리턴
예시
byte b=1;
String byte1=String.valueOf(b);
String byte2=b+byte1;
절대 사용하면 안되는 메소드 - intern
· 문자열에 대해 String.intern()을 수행하면 동일한 내용을 가진 모든 문자열이 동일한 메모리를 공휴하게 된다.
예시
String text = "java";
String text2 = new String("java");
System.out.println(text==text2);
text2 = text2.intern();
System.out.println(text==text2);
· 사용하면 심각한 성능 저하를 발생시킬 수도 있음
- 새로운 문자열을 계속 만드는 프로그램에서 intern() 메소드를 사용하여 억지로 문자열 풀에 값을 할당하게 만들면, 저장되는 영역은 한계가 있으므로 그 영역에 대해서 별도로 메모리를 청소하는 단계를 거치게 된다. 따라서, 작은 연산 하나를 빠르게 하기 위해 전체 자바 스스템 성능에 악영향을 주게 된다.
· 자바가 아닌 C로 구현된 native 메소드
추가내용
String 효율적으로 사용하기 (StringBuilder, StringBuffer, StringJoiner, Collectors.joining)
출처
자바의신
https://stackoverflow.com/questions/10578984/what-is-java-string-interning
'자바' 카테고리의 다른 글
[Java] 제네릭(Generics) (0) | 2021.08.30 |
---|---|
[자바] Annotations, 자바에서 메타 데이터를 제공하는 방법 (0) | 2021.08.29 |
[Java] 자바의 예외처리 방법 (0) | 2021.08.27 |
[Java] Nested Class, 클래스 안의 클래스 (0) | 2021.08.27 |
[Java] JVM 메모리 사용 영역 (0) | 2021.08.20 |
댓글