반응형
JAVA 자바 문자열 forEach(Enhanced for) 사용법
(enhanced for문을 forEach로 취급하겠습니다...)
개요
아래와 같이 문자열(String) 타임의 s를 forEach를 사용하려 하면,
for (char c : s) {
...
}
다음과 같은 애러 등이 발생하게 된다.
foreach not applicable to type 'java.lang.String'
/Solution.java:8: error: for-each not applicable to expression type
for (char c : s) {
^
required: array or java.lang.Iterable
found: String
1 error
이는 자바에서 문자열을 String Pool에 저장되며, heap과 달리 문자열의 한 문자씩에 대한 메모리 주소를 가지고 있지 않아 접근이 불가능하기 때문으로 알고 있다.
자바에서 문자열은 불변성(immutability)의 특성을 가지며, 문자열 객체에 대한 메모리 최적화를 위해 메모리에 String Pool이라는 저장 공간을 두고 같은 문자열에 대해서는 새로운 메모리에 할당 없이 재사용이 가능하다.
해결 방법
다음과 같이 forEach문을 사용하지 않고, 문자열 길이만큼 반복하며 한 문자씩 읽어와 사용하는 방법이 있다.
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
...
}
그러나, forEach사용이 편한 사용자들은 위와 같은 방법이 코드의 길이가 길어지고 불편할 수 있다.
그렇다면 아래와 같은 방법들을 사용하여 forEach를 사용할 수 있다.
문자열 s를 toCharAraay() 함수를 사용하여 char 타입의 배열형태로 return 받아 사용할 수 있다.
이는 문자열에에 대한 새로운 char 배열을 생성하므로 메모리에 대한 별도의 비용이 요구된다.
for (char c : s.toCharArray()) {
...
}
문자열 s를 split() 함수를 사용하여 문자열 배열을 생성하고, 생성된 문자열에 대해 forEach를 실행할 수 있다.
for (String t : s.split("")) {
...
}
다른 방법으로는 chars() 함수를 사용하여 문자열을 IntStream형태로 변환한 뒤, 이에 대해 forEach를 사용하여 같은 결과를 얻을 수 있다. 여기에서 사용되는 forEach는 위에서 사용된 향상된 포문(Enhanced for)와는 달라 함수 내에 람다 식을 사용해야 한다.
s.chars().forEach(c -> ... );
이 밖에도 직접 Iterable를 상속받아 Iterator를 만들거나 StringCharacterIterator 사용하는 방법 등도 있다.
반응형
'프로그래밍 언어 > 자바(JAVA)' 카테고리의 다른 글
자바(JAVA) - FileReader, FileWriter 파일 읽기, 쓰기 (0) | 2021.12.21 |
---|---|
자바(JAVA) - 입출력 스트림 (0) | 2021.12.19 |
자바(JAVA) - 폴더 파일명 변경 (0) | 2021.12.18 |
[JAVA 자바] Static Variable(변수), Method(함수) (0) | 2021.02.22 |
[JAVA 자바] Public Class & Class (0) | 2021.02.22 |