본문 바로가기
Baeldung번역&공부/Java-string

랜덤한 문자열을 생성하는 방법(Generate Random String)

by ms727 2025. 2. 11.

원본 글: https://www.baeldung.com/java-random-string

 

랜덤한 문자열을 생성하는 여러 방법에 대해 다룹니다. Java기본라이브러리 및 Apache Commons Lang같은 외부 라이브러리를 통한 방법 등 까지 다룹니다.

 

1. Generate Random Unbounded String With Plain Java

7개의 랜덤한 문자열을 생성하는 간단한 예제를 확인해봅니다.

 

    @Test
    public void usingPlainJava_GeneratingRandomString() {
        byte[] array = new byte[7];
        new Random().nextBytes(array);// 랜덤한 바이트 값을 채워넣음.
        String generatedString = new String(array, Charset.forName("UTF-8"));
        System.out.println(generatedString);
    }

 

이 방식의 단점은 랜덤한 바이트 값을 추가해서 넣고 UTF-8로 변환하더라도 특수문자나 이상한 문자로 채워질 가능성이 있어서 일반적으로 알 수 없는 문자가 출력될 수 있습니다

2. Generate Random Bounded String With Plain Java

다른 방법으로 랜덤한 문자열을 생성해봅니다. 이번에는 소문자 알파벳들을 가지고 랜덤한 문자열을 생성해보겠습니다.

 

@Test
public void usingPlainJava_GeneratingRandomString_alphabetically() {
    int leftLimit = 97; // 'a'
    int rightLimit = 122; // 'z'
    int targetStringLength = 10;
    Random random = new Random();
    StringBuilder buffer = new StringBuilder(targetStringLength);

    for (int i = 0; i< targetStringLength; ++i) {
        int randomLimitedInt = leftLimit + (int)(random.nextFloat() * (rightLimit - leftLimit + 1));
        buffer.append((char)randomLimitedInt);
    }

    String generatedString = buffer.toString();
    System.out.println(generatedString);
}

 

정상적으로 출력되나 직관적이지는 않은 것 같습니다.

 

3. Generate Random Alphabetic String With Java 8

Random.ints()라는 함수가 Java8에 추가되었습니다. 이를 이용해서 랜덤한 문자열을 생성해봅니다.

@Test
public void usingPlainJava8_randomsInt_GeneratingRandomString() {
    int leftLimit = 97;
    int rightLimit = 122;
    int targetStringLength = 10;
    Random random = new Random();

    String generatedString = random.ints(leftLimit, rightLimit + 1)
            .limit(targetStringLength)
            .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
            .toString();

    System.out.println(generatedString);
}

 

가이드 글에는 설명되어 있지 않아서 추가 설명이 필요합니다.

핵심 부분은 radom.ints()부분이므로 이 부분 해석하겠습니다.

- StringBuilder::new: 새로운 StringBuilder 객체 생성

- StringBuilder::appendCodePoint: 스트림에서 생성된 각 정수(문자 코드 포인트)를 문자로 변환하여 StringBuilder에 추가

- StringBuilder::append: StringBuilder에 문자열을 추가

 

4. Generate Random Alphanumeric String With Java8

위와 비슷한 방법으로 숫자+영문자로 되어진 랜덤한 문자열을 생성합니다.

 

@Test
public void usingPlainJava8_randomsInt_GeneratingRandomStringNumber() {
    int leftLimit = 48; // numeral 0
    int rightLimit = 122; // letter 'z'
    int targetStringLength = 10;
    Random random = new Random();

    String generatedString = random.ints(leftLimit, rightLimit + 1)
            .filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97))
            .limit(targetStringLength)
            .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
            .toString();

    System.out.println(generatedString);
}

 

5. Generate Bounded Random String With Apache Commons Lang

다음은 Apache Common Lang 라이브러리릍 통한 생성방법입니다.

 

@Test
public void apacheCommonLang_test() {
    int length = 10;
    boolean useLetters = true;
    boolean useNumbers = true;
    String generatedString = RandomStringUtils.random(length, useLetters, useNumbers);

    System.out.println(generatedString);
}

 

 

기존에 직접 구현해야했던 로직들을 모두 캡술화하여 간단한 API로 작성되어진 모습입니다. 너무 간단하게 한 줄로 표현이 가능합니다.

 

6. Generate Alphabetic String With Apache Commons Lang

알파벳으로 이루어진 랜덤한 문자열을 생성하고 싶다면 좀 더 간편하게 작성이 가능합니다.

 

@Test
public void apacheCommonLang_alphabetic_test() {
    String generatedString = RandomStringUtils.randomAlphabetic(10);
    System.out.println(generatedString);
}

 

7. Generate Alphanumeric String With Apache Commons Lang

마찬가지로 알파벳과 숫자로 이루어진 경우에 대해서도 Apache Commons Lang 라이브러리가 제공하는 함수가 있습니다.

@Test
public void apacheCommonLang_alphanumeric_test() {
    String generatedString = RandomStringUtils.randomAlphanumeric(10);
    System.out.println(generatedString);
}

 

8. 결론

 

랜덤한 문자열을 만드는 여러 예제를 학습하였습니다.

참고로 java.util.Random() 함수의 암호화는 안전하지 않으므로 java.security.SecureRandom을 고려해봐야할 수 있습니다.

 


 

블로그 주인 생각

 

Apache Common Lang가 제공하는 함수들은 모두 deprecated될 예정입니다. 대체 방법들을 아래에 적어놓겠습니다.

 

RandomStringUtils를 사용하는것이 아닌 RandomStringGenerator클래스를 사용해야합니다.

 

코드가 직관적이라 따로 설명을 적지는 않겠습니다.

 

@Test
public void apacheCommonLang_new_test() {
    // 문자 숫자
    RandomStringGenerator generate = new RandomStringGenerator.Builder()
            .withinRange('0', 'z')
            .filteredBy(Character::isLetterOrDigit)
            .get();
    // 숫자만
    RandomStringGenerator digitGenerate = new RandomStringGenerator.Builder()
            .withinRange('0', '9')
            .filteredBy(Character::isDigit)
            .get();

    String generatedString = generate.generate(10);
    String digitGeneratedString = digitGenerate.generate(10);

    System.out.println(generatedString);
    System.out.println(digitGeneratedString);
}

 

예제: https://github.com/kkminseok/baeldung-test/blob/main/Java-String/src/test/java/manipulations/advance/GenerateRandomStringTest.java