코딩테스트로 자바공부를 하면서 유독 문자열을 분리하여라, 숫자를 뒤집어서 배열로 나타내라 등등의 문제들이 많았다.
나는 charAt()을 대부분 사용했는데 다른 사람들의 문제풀이를 보고 이런식의 풀이가 있구나 했던적이 꽤 많았다. 가령 Stream을 사용해서 한줄로 표현하는 사람도 있었고, split("")을 사용해서 분리하는 경우도 있었다.(split()은 프로젝트시 팀장이 쓰는걸보고 이런방법도 있구나 깨달은 방법이라 알고 있었다.)
따라서 자주 등장했던 문법들을 모아서 정리해보고자 한다.
String.charAt(i)
String으로 저장된 문자열 중에서 인덱스 i 에 해당하는 문자를 한 글자만 선택해서 char 타입으로 변환하는 메서드
String 타입의 참조변수를 char 타입으로 변환하는 과정은
String 타입의 참조변수 뒤에 .을 찍고 charAt(i)을 적어주면 된다.
혹은 Scanner를 사용한다면 next() 또는 nextLine() 뒤에 .을 찍고 charAt(i)을 적어서 사용할 수도 있다.
String.split("")
String.split(x) 구문을 설명하면 지정된 문자열 x를 기준으로 문자열을 나누는 메서드이다.
따라서, String.split("")은 결국 공백이 없는 부분 모두를 나누겠다는 뜻이므로 결국 문자열을 모두 한글자씩 나눈다는 뜻이된다.
String.toCharArray()
문자열을 한 글자씩 나눠 char 타입의 배열에 담아서 반환하는 메서드.
이 메소드도 String(문자열)을 char 타입의 배열로 바꾼다.
chars() / Stream을 이용하는 방법
Stream을 이용하는 풀이들이 항상 다른사람의 풀이 상단에 등장한다. 그때마다 나오는게 이 chars() 인데 이번기회에 정리해보고자 한다.
1. chars() 메서드를 이용해 IntStream화 한 후에,
2. char 타입의 Stream으로 변환하고
3. forEach를 이용해 한 글자씩 분리하면 된다.
이렇게 만들어진 예시는 아래와 같다.
String str = "Hello World";
str.chars() //str을 IntStream으로 변환한다.
.mapToObj(i -> (char)i) //각 정수 코드 포인트를 문자로 변환한 다음 Character 객체로 박싱한다.
.forEach(i -> System.out.print(i + "")); //각 문자를 출력한다.
아래의 코드와 비교해 볼 수도 있다.
String str = "Hello World";
Stream<Character> charStream = new String(str).chars().mapToObj(i -> (char)i);
/*
1. new String(chars) 를 사용하여 문자배열 `str`를 문자열로 변환한다.
2. `.chars()` 메서드를 사용하여 문자열을 IntStream으로 변환한다.
IntStream은 각 문자의 정수 코드 포인트를 나타내는 스트림이다.
3. `.mapToObj(i -> (char)i)`를 사용하여 각 정수 코드 포인트를 문자로 변환한 다음 Character 객체로 박싱한다.
*/
// Character 객체 스트림을 배열로 변환
Character[] charArray = charStream.toArray(Character[]::new);
// Character 배열 출력
for (Character c : charArray) {
System.out.println(c);
}
두 코드는 기능적으로 동일한 작업을 수행한다. 문자열에 있는 각 문자를 반복하고 출력한다.
하지만 차이점이 존재한다.
첫번째 코드는 문자열을 바로 IntStream으로 변환하기 때문에 문자열을 문자배열로 변환하는 단계가 생각된다.
하지만 두번째 코드는 문자배열을 먼저 문자열로 변환한 후 스트림 처리를 시작한다. 따라서 문자 배열을 문자열로 변환하는 오버헤드가 있을 수 있다.
사실 두 코드의 성능차이는 매우 작지만 첫번째 코드가 더 간결하고 효율적이라고 할 수 있다.
전체 코드 예시
String str = "Hello World";
//1. String.charAt(i)
for(int i=0; i<str.length(); i++){
System.out.print(str.charAt(i)+"");
}
//2. String.split("")
for(String s : str.split("")){
System.out.print(s+"");
}
//3. String.toCharArray()
for(char c : str.toCharArray){
System.out.print(c+"");
}
//4. Steam이용 chars()
str.chars() //IntStream
.mapToObj(i -> (char)i) //Steam<Character>로 변환
.forEach(i -> System.out.print(i+"")); //출력
//출력
/*
H
e
l
l
o
W
o
r
l
d
*/
참고
- https://codechacha.com/ko/java-convert-chararray-to-string/
- https://velog.io/@lynn080/Java-%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%95%9C-%EA%B8%80%EC%9E%90%EC%94%A9-%EB%B6%84%EB%A6%AC%ED%95%98%EA%B8%B0#%EC%A0%84%EC%B2%B4-%EC%BD%94%EB%93%9C-%EB%B3%B4%EA%B8%B0
- https://www.techiedelight.com/ko/create-stream-of-characters-from-char-array-java/
'Language > Java' 카테고리의 다른 글
[Java] 문자 포함 여부 확인 / contains() (0) | 2023.11.01 |
---|---|
[Java] char 배열을 문자열로 변환하기 / String 생성자, String.valueOf(), StringBuilder, Stream (0) | 2023.10.21 |
[Java] 제곱근 구하기 / Math.sqrt() (0) | 2023.10.20 |
[Java] 배열 복사 메서드 / Arrays.copyof(), Arrays.copyofRange(), System.arrayCopy() (0) | 2023.10.17 |
[Java] 배열 초기화와 배열 크기 할당 (0) | 2023.10.15 |