티스토리 뷰

github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/src/java.base/share/classes/java/lang/String.java

 

AdoptOpenJDK/openjdk-jdk11

Mirror of the jdk/jdk11 Mercurial forest at OpenJDK - AdoptOpenJDK/openjdk-jdk11

github.com

github.com/AdoptOpenJDK/openjdk-jdk16/blob/master/src/java.base/share/classes/java/lang/String.java

 

AdoptOpenJDK/openjdk-jdk16

JDK16 mirror from https://github.com/openjdk/jdk16 - AdoptOpenJDK/openjdk-jdk16

github.com

String replace(char oldChar, char newChar) : 첫 인자로 들어온 문자를 찾은 뒤 이후 나타나는 모든 문자를 두번째 인자로 반환한다. 이 때 새로운 문자열이 리턴되며, 두 인자가 같으면 자기 자신이 리턴된다. 11버전에선 StringLatin1, StringUTF16이 따로 기능을 구현한다. 이 구현은 16에서도 동일하다. 이 구현의 차이는 latin1 문자열에 UTF16이 들어온 경우를 대비한 것으로 Latin1에선 old가 대체 불가능하면 null을, new가 대체가능하면 UTF16문자열이 새로 출력된다. 이는 16도 마찬가지다. StringUTF16에서 문자열 모두 압축 가능하면 LATIN1 문자가 리턴된다.

boolean matches(String regex) : 이것은 Pattern 클래스의 구현을 따른다.

boolean contains(CharSequence s) : 이것은 indexOf의 구현을 이용하여 -1 이 아닌 값이 리턴되는 경우 참값을 리턴한다.

String replaceFirst(String regex, String replacement) : Matcher 의 구현을 이용한다.

tring replaceAll(String regex, String replacement) :  Matcher 의 구현을 이용한다.

String replace(CharSequence target, CharSequence replacement) : 8의 경우 Matcher의 구현을 이용한다. 11의 경우 내부 구현으로 빠졌다. 안에서 매치되는 문자를 전부 바꾼다. 16에서는 약간 더 복잡하다. latin1 인지 utf16인지에 따라 구현메서드를 StringLatin1, StringUTF16으로 나누고 첫 인자의 길이가 0인 경우, 메모리 부족 오류인지 검사하고 아닌 경우(진짜 공백을 넘긴 경우), 모든 문자 사이사이에 2번째 인자를 채워넣는다.

String[] split(String regex, int limit) : 첫 인자가 정규패턴식이 아닐 경우 배열로 바로 찾아서 분할된 문자열 배열을 리턴한다. 정규패턴식이면 Pattern의 구현을 따른다. 이는 11, 16이 동일하다.

String[] split(String regex) : 위 메서드를 재사용한다. 2번째 인자는 0이다.

static String join(CharSequence delimiter, CharSequence... elements) : StringJoiner를 통해 StringBuilder를 이용하여 문자열을 합한다. 11과 16이 동일하다.

static String join(CharSequence delimiter, Iterable<? extends CharSequence> elements) : 위와 같다.

String toLowerCase(Locale locale) : 아래 규칙 예와 같은 내용에 따라 키를 변환한다. 이는 Characer 클래스에 기반한다고.

 구현 내용은 복잡하다.. 대소문자가 1대1 매칭이 아니기 때문에 발생하는 것으로 보이며, 첫째 변환가능한 대문자를 찾을때까지 순환하고 찾으면 그 위치까지 기존 배열을 복사하여 새 배열을 만든다. 이후부터는 1개씩 다음 요소를 방문하며 소문자로 치환하는데 BMP를 벗어나는 문자를 치환하는 경우(이 경우 배열 길이가 증가할 경우 추가된 길이만큼 새로 배열이 생성된다), \u03A3, \u0130 같은 특수 문자를 치환하는 경우, 치환 시 에러 발생했을 때 처리하는 경우 등 여러 요소를 고려하게 된다. 이게 11버전에선 StringLatin1, StringUTF16 클래스로 그 로직이 넘어가고 이는 16버전도 같다. 이 때 넘어간 로직 각각은 각 자신의 경우(Latin1 or UTF16)만 고려하기 때문에 원리는 유사하며 특문에 대한 처리는 UTF16에서 전담하게 된다(즉 UTF16이 더 복잡하다, 16버전은 특히 더 복잡하다(이해 실패)). 이 상대적인 경우로 예상치 못한 결과를 얻을 수 있기에 이를 방지하자면 Locale.ROOT를 이용하라고 한다.

String toLowerCase() : 모든 경우에서 toLowerCase(Locale.getDefault()) 를 쓴 경우와 같다.  

String toUpperCase(Locale locale) : toLowerCase와 로직이 소문자를 대문자로 치환하는 경우의 반대이다. 동일하게 일관된 결과를 위해선 Locale.ROOT를 쓰라고 한다.

String toUpperCase() : toUpperCase(Locale.getDefault()) 를 쓴 경우와 같다.

String trim() : 앞, 뒤의 공백문자열을 제거한다. 좀 더 정확하게는 \u0020보다 같거나 작은 문자열은 모두 제거된다. 11버전 16버전은 역시 두 클래스로 구현이 나뉜다. 각각 같은 구현을 하고 있으나 UTF16의 경우 배열의 길이가 2배인 점이 다르다.

String toString() : return this; 를 한다. 이는 11과 16이 같다.

 

// 11부터 새롭게 생긴 메서드가 존재한다.

String strip() : trim() 과 같이 전 후의 공백을 제거하나 제거 대상이 Character#isWhitespace(int) 인 경우이다.

String stripLeading() : 문자열 선두의 공백만 제거한다.

String stripTrailing() : 문자열 후미의 공백만 제거한다.

boolean isBlank() : Character#isWhitespace(int) 로 비교하여 문자열이 비어있는지 판단한다.

Stream<String> lines() : \n, \r or \r\n 인 경우를 구분으로 두어 문자열의 스트림을 리턴한다. 이 구현은 StringLatin1, StringUTF16으로 나뉜다.

String repeat(int count) : 현재 문자열을 count만큼 반복하여 연이어 붙인 문자열을 리턴한다.

 

// 9부터 새롭게 생긴 메서드가 존재한다.

IntStream chars() : 각각의 char에 0을 확장한 Int 형 값의 스트림을 리턴한다. /java.base/java/lang/Character.html#unicode 의 매핑을 따른다고 한다. 구현은 Latin1, UTF16 각각의 클래스에 나뉜다.

IntStream codePoints() : 각 문자열을 코드포인트로 확장한 정수의 스트림을 리턴한다. 구현은 Latin1, UTF16 각각의 클래스에 나뉜다.

 

// 12 부터 새롭게 생긴 메서드가 존재한다.

String indent(int n) : 공백 문자를 이용하여 들여쓰기가 삽입된다. 탭(\t) 문자는 카운트 1로 계산되며 n 이 정수면 삽입, n 이 음수면 그 만큼 선두의 공백이 제거된다. 0이면 변화는 없지만 line terminator는 normalized 된다. 즉 모든 개행문자는 \n (\u000A)로 바뀐다.

String <R> R transform(Function<? super String, ? extends R> f) : 문자열을 기준으로 변환을 가능하게 해 주는 메서드.

 

// 15부터 새롭게 생긴 메서드가 존재한다.

String stripIndent() : 마크업 같은 곳에서 앞선 들여쓰기를 모두 제거한다. 그림으로 보는게 이해가 편하다.

이것이

이렇게 앞선 공백만 제거한다고 한다.

String translateEscapes() : 아래 표를 기준으로 탈출문자가 변환되어 표기된 문자열이 리턴된다.

String formatted(Object... args) : 자신 문자열 자체에 인자만 넘겨서 포맷팅을 해결한 문자열을 리턴한다. 이 메서드는 문자열 객체 자신이 %s %d 와 같은 포맷형 변수를 가진 경우에 효과적이다.

 

 

다시 8 버전으로..

char[] toCharArray() : 현 문자열의 값을 복제한 새 char 배열을 리턴한다. 11과 16에서 StringLatin1, StringUTF16으로 구현이 나뉘는데 Latin1 에서는 bytes를 char로 변환하는 작업이 수행된다.

static String format(String format, Object... args) : Formatter() 구현에 따라 문자열 포맷팅 작업 결과를 리턴한다. 11과 16에서도 동일하다.

static String format(Locale l, String format, Object... args) : Formatter(l) 구현에 따라 문자열 포맷팅 작업 결과를 리턴한다. 11과 16에서도 동일하다.

static String valueOf(Object obj) : 인자로 넘어온 객체의 toString을 호출한다. 11과 16에서 구현이 같다.

static String valueOf(char data[]) : 인자로 넘어온 문자 배열로 새 문자열을 리턴한다. 11과 16에서 구현이 같다.

static String valueOf(char data[], int offset, int count) : 인자로 넘어온 문자 배열의 부분을 문자열로 리턴한다. 11과 16애서 구현이 같다.

static String copyValueOf(char data[], int offset, int count) : valueOf(char[], int, int) 와 구현이 같다. 11과 16애서 구현이 같다.

static String copyValueOf(char data[]) : valueOf(char[]) 와 구현이 같다. 11과 16애서 구현이 같다.

static String valueOf(boolean b) : true, false를 "true", "false"로 표현을 바꾼 문자열을 반환한다. 11과 16애서 구현이 같다.

static String valueOf(char c) : char의 문자열 형태를 반환한다. 11과 16에선 압축 가능한가 아닌가에 따라 Latin1 또는 UTF16 방식의 문자열이 리턴된다.

static String valueOf(int i) : integer.toString(i)를 호출한다. 11과 16애서 구현이 같다.

static String valueOf(long l) : Long.toString(l) 를 호출한다. 11과 16애서 구현이 같다.

static String valueOf(float f) : Float.toString(f) 를 호출한다. 11과 16애서 구현이 같다.

static String valueOf(double d) : Double.toString(d) 를 호출한다. 11과 16애서 구현이 같다.

native String intern() : 스트링 객체의 canonical 표현을 리턴한다. 11과 16애서 구현이 같다.

 

11과 16에는 isLatin1() 과 같은, 문자열이 어떤 형태인지 구분하기 위한 default 메서드들이 추가로 정의되어 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2025/02   »
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
글 보관함