프로그래밍을 하다보면 랜덤 함수를 사용할 일이 많다.
숫자건 문자건 예측이 안되는 다량의 문자들을 데이터로써 생성할 수도 있다.
거기에 정규식을 이용하면 가상의 단어 조합도 만들 수 있다. 이 모든일이 어디서 부터 시작되는가?
난수 발생기로부터 시작된다.
자바의 Random 클래스는 java.util 패키지에 있다.
Math.random() 으로 짠 소스 코드도 많이 보인다. 스태틱 메소드로 사용할 수 있으니 아무래도 더 자주 쓰게 된다.
이 포스팅에서는 위의 두가지를 사용하여 랜덤한 문자열을 생성해 보겠다.
먼저 숫자를 문자로 바꾸기 위한 아스키 코드에 대하여 알아야 한다.
자세한 사항은 아래의 포스팅을 참고하는데, 기본적으로 십진수 숫자 65 ~ 90 까지 영문 소문자, 97 ~ 122까지 영문 대문자이다. 문자형 숫자는 48 ~ 58까지 범위다. 문자형 숫자는 문자형으로 결합이 가능한 숫자를 말한다.
좀 헷갈릴 수는 있다. 숫자를 표시하는 것은 아스키 코드이고 char 형이고 내부적으로 저장되는 정수형 숫자는 메모리에 실제 값이 저장되있다.
digiconfactory.tistory.com/129
함수를 만들어서 문자열을 생성하면 편리하다. 위는 소문자를 문자열을 생성하는 코드이다.
Math.Random() * (곱하는 수) 의 곱하는 수가 랜덤함수의 범위를 정한다. 0이 포함되어 있으니 1부터 사용하려면 +1을 한다.
더 좋은 코드로 만들수도 있겠지만 일단 아스키 코드의 십진수의 범위로 문자를 만들 수 있다. 길이를 for 문에 받아서 문자열에 더하면 문자열이 된다.
* 대문자나 숫자를 생성하는 방법도 같다. 아스키 코드의 범위를 적용하면 된다.
*대문자, 소문자, 숫자 세가지 경우의 수로 분기가 되니까 이것을 무작위로 섞는 것도 가능하다. 아래와 같이 switch case 문을 사용하여 함수를 호출할 수 있다.
전체 소스 코드는 아래와 같다. Random 클래스는 여러가지 메소드들이 많이 있으니 자세한 내용은 자바 API 문서를 참고한다.
docs.oracle.com/javase/8/docs/api/java/util/Random.html
package com;
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random random = new Random();
int length = random.nextInt(5)+5;
System.out.println(randomWord("lower", length));
System.out.println(randomWord("upper", length));
System.out.println(randomWord("number", length));
StringBuffer newWord = new StringBuffer();
for (int i = 0; i < length; i++) {
int mixed = random.nextInt(3);
switch(mixed) {
case 0:
newWord.append(randomWord("lower", 1));
break;
case 1:
newWord.append(randomWord("upper", 1));
break;
case 2:
newWord.append(randomWord("number", 1));
break;
default:
break;
}
}
System.out.println("newWord = " + newWord);
}
static String randomWord(String selectCase, int length){
if (selectCase == "lower"){
String lowerRandom ="";
for (int i = 0; i < length; i++) {
char lowerCh = (char)((int)(Math.random()*25) + 97);
lowerRandom += lowerCh;
}
return lowerRandom;
}
if (selectCase == "upper"){
String upperRandom ="";
for (int i = 0; i < length; i++) {
char upperCh = (char)((int)(Math.random()*25) + 65);
upperRandom += upperCh;
}
return upperRandom;
}
if (selectCase == "number"){
String numRandom ="";
for (int i = 0; i < length; i++) {
char ch = (char)((int)(Math.random()*10) + 48);
numRandom += ch;
}
return numRandom;
}
return null;
}
}
대문, 소문, 숫자로 랜덤 문자열이 생성된 것을 볼 수 있다.
* 좀더 간소화 하면 아래와 같이 작성할 수 있다.
Random random = new Random();
int length = random.nextInt(5)+5;
StringBuffer newWord = new StringBuffer();
for (int i = 0; i < length; i++) {
int choice = random.nextInt(3);
switch(choice) {
case 0:
newWord.append((char)((int)random.nextInt(25)+97));
break;
case 1:
newWord.append((char)((int)random.nextInt(25)+65));
break;
case 2:
newWord.append((char)((int)random.nextInt(10)+48));
break;
default:
break;
}
}
System.out.println("newWord = (" + newWord + "), length = " + length);
매번 작성하는게 귀찮으면 모듈처럼 static 함수로 정리해 놓는 것도 나쁘지 않다.