본문 바로가기
Spring/Java

[java] 자바 문자열 문자를 n번 반복하기 다양한 방법

by snow_hong 2023. 4. 14.

자바 문자열 문자를 가져와 표현하는 7가지 방법에 대해서 알아보자!

 

1. 단순 방법

for 루프를 사용하여 문자열의 각 문자를 처리

이 접근 방식은 길이가 더 작은 문자열에 매우 효과적이다.

class Main
{
    // 문자열의 문자 n반복
    public static void main(String[] args)
    {
         String s = "Snow hong IT블로그";
		 
	        // 간단한 for 루프 사용
	        for (int i = 0; i < s.length(); i++) {
	        	for(int j=0; j<2; j++){
	        		System.out.print(s.charAt(i));
	        	}
	        }
    }
}

결과 : SSnnooww  hhoonngg  IITT블블로로그그

 

2. String.toCharArray() 방법

char[] 사용하여 String.toCharArray() 다음과 같이 향상된 for 루프(for-each 루프)를 사용하여 문자 배열을 반복

class Main
{
    // 문자열의 문자 n반복
    public static void main(String[] args)
    {
         String s = "Snow hong IT블로그";
		 
	        // 문자열을 배열로 변환
	        char[] chars = s.toCharArray();
	 
	        // 향상된 for 루프를 사용하여 `char[]` 배열 반복
	        for (char ch: chars) {
	        	for(int j=0; j<2; j++){
	        		System.out.print(ch);
	            }
	        }
            
    }
}

결과 : SSnnooww  hhoonngg  IITT블블로로그그

 

 

3. Iterator 방법

StringCharacterIterator String에 대한 양방향 반복을 구현하는 클래스

import java.text.CharacterIterator;
import java.text.StringCharacterIterator;

class Main
{
    // 문자열의 문자 n반복
    public static void main(String[] args)
    {
       String s = "Snow hong IT블로그";
       
	   CharacterIterator it = new StringCharacterIterator(s);
		 
	   while (it.current() != CharacterIterator.DONE)
	   {
	        for(int j=0; j<2; j++)
	            System.out.print(it.current());
	         it.next();
	        }
    }
}

결과 : SSnnooww  hhoonngg  IITT블블로로그그

 

4. StringTokenizer 방법

StringTokenizer 사용을 권장X

StringTokenizer 클래스는 문자열을 토큰으로 나눈다.

StringTokenizer(String str, String delim, boolean returnDelims)의 예 StringTokenizer 로 생성되었는지 여부에 따라 두 가지 방식 중 하나로 동작

delim : 분리할 String값

returnDelims 값 : true / false

- returnDelims false이면 구분 기호가 토큰을 구분하는 역할

      : 따라서 토큰은 구분 기호가 아닌 연속 문자의 최대 시퀀스
-returnDelims true이면 구분 기호 문자 자체가 토큰으로 간주

   : 따라서 토큰은 하나의 구분 기호 문자 or 구분 기호가 아닌 연속 문자의 최대 시퀀스

import java.util.StringTokenizer;

class Main
{
    // 문자열의 문자 n반복
    public static void main(String[] args)
    {
       String s = "Snow hong IT블로그";
       
	StringTokenizer st = new StringTokenizer(s,s, true);
				
		while (st.hasMoreTokens()) {
		  String str = st.nextToken();
		  for(int j=0; j<2; j++)
			 System.out.print(str);   
	      }
}

결과 : SSnnooww  hhoonngg  IITT블블로로그그

 

 

5. String.Split() 방법

String.split() 메소드 오버 StringTokenizer, 레거시 클래스이며 호환성을 위해 있음.

split() 사용하는 방법 추천

class Main
{
    // 문자열의 문자 n반복
    public static void main(String[] args)
    {
       String s = "Snow hong IT블로그";
       
       String[] arr = s.split("");
	 
	        for (String ch: arr) {
	        	for(int j=0; j<2; j++)
	            System.out.print(ch);
	        }
		 
    }
}

결과 : SSnnooww  hhoonngg  IITT블블로로그그

 

6.  String.chars() 방법

Java 8버전 이상

String.chars(), 반환 IntStream (int의 스트림) 문자열에서 문자의 정수 표현

이 메서드는 원하는 값을 반환하지 않습니다. 

Stream<Character> (성능상의 이유로) IntStream 자동으로 상자에 넣어지는 방식으로 개체에 Stream<Character>. 

class Main
{
    // 문자열의 문자 n반복
    public static void main(String[] args)
    {
       String s = "Snow hong IT블로그";
       
       // 1. `Stream<Character>`로의 암시적 박싱
	        // 1.1. 메소드 참조 사용
		 	System.out.println("1");
	        s1.chars().mapToObj(Character::toChars).forEach(System.out::print);
	        System.out.println();
	 
	        // 1.2. `int`를 `char`로 캐스팅하여 람다 표현식 사용
		 	
	        System.out.println("2");
	        s1.chars().mapToObj(i -> Character.valueOf((char) i)).forEach(System.out::print);
	        System.out.println();
	 
	        System.out.println("3");
	        s1.chars().mapToObj(i -> (char) i).forEach(System.out::print);
	        System.out.println();
	 
	        System.out.println("4");
	        s1.chars().mapToObj(i -> new StringBuilder().appendCodePoint(i)).forEach(System.out::print);
	        System.out.println();
	 
	        // 2. `Stream<Character>`로 boxing하지 않음
	        System.out.println("5");
	        s1.chars().forEach(i -> System.out.print(Character.toChars(i)));
	        System.out.println();
	 
	        System.out.println("6");
	        s1.chars().forEach(i -> System.out.print((char) i));
	        System.out.println();
	 
	        System.out.println("7");
	        s1.chars().forEach(i -> System.out.print(new StringBuilder().appendCodePoint(i)));
	        System.out.println();

}

결과 : 
1
Snow hong IT블로그
2
Snow hong IT블로그
3
Snow hong IT블로그
4
Snow hong IT블로그
5
Snow hong IT블로그
6
Snow hong IT블로그
7
Snow hong IT블로그

 

7. 코드 포인트 사용

Java 8도 사용가능

String.codePoints() 대신에 String.chars() 그것도 반환 IntStream 하지만 char 값 대신 유니코드 코드 포인트를 사용

class Main
{
    // 문자열의 문자 n반복
    public static void main(String[] args)
    {
       String s = "Snow hong IT블로그";
       
       /* 1. `Stream<Character>`로 암시적 복싱 */
		 
	        // 1.1. 메소드 참조 사용
		 	System.out.println("1");
	        s.codePoints().mapToObj(Character::toChars).forEach(System.out::print);
	        System.out.println();
	 
	        System.out.println("2");
	        s.codePoints().mapToObj(i -> new StringBuilder().appendCodePoint(i)).forEach(System.out::println);
	        System.out.println();
	 
	        
	        // 1.2. `int`를 `char`로 캐스팅하여 람다 표현식 사용
	        System.out.println("3");
	        s.chars().mapToObj(i -> Character.valueOf((char) i)).forEach(System.out::print);
	        System.out.println();
	 
	        System.out.println("4");
	        s.codePoints().mapToObj(i -> (char) i).forEach(System.out::print);
	        System.out.println();
	 
	        /* 2. `Stream<Character>`로 Boxing 없이 */
	        System.out.println("5");
	        s.codePoints().forEach(i -> System.out.print(Character.toChars(i)));
	        System.out.println();
	 
	        System.out.println("6");
	        s.codePoints().forEach(i -> System.out.print((char) i));
	        System.out.println();
	 
	        System.out.println("7");
	        s.chars().forEach(i -> System.out.print(new StringBuilder().appendCodePoint(i)));
	        System.out.println();

}

결과 : 
1
Snow hong IT블로그
2
S
n
o
w
 
h
o
n
g
 
I
T
블
로
그

3
Snow hong IT블로그
4
Snow hong IT블로그
5
Snow hong IT블로그
6
Snow hong IT블로그
7
Snow hong IT블로그

 

[ 참고사이트 ] 

https://www.techiedelight.com/ko/iterate-over-characters-string-java/

728x90

댓글