원본 글: 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);
}
'Baeldung번역&공부 > Java-string' 카테고리의 다른 글
회문을 찾는 여러 방법(Check if a String Is a Palindrome in Java) (0) | 2025.02.14 |
---|---|
문자열에서 문자세는 여러 방법(Count Occurrences of a Char in a String) (0) | 2025.02.13 |
isEmpty()와 isBlank()의 차이(Difference Between String isEmpty() and isBlank()) (0) | 2025.02.09 |
문자열 리스트를 문자열로 바꾸는 방법(Convert a Comma Separated String to a List in Java) (0) | 2025.02.09 |
공백을 지우는 여러 방법들(Remove Whitespace From a String in Java) (0) | 2025.02.07 |