빵 좋아하는 개발자🥐
[Java 자바] 임의의 숫자 + 문자 코드 생성하기 본문
사이트 가입 절차 중 랜덤으로 코드를 부여하고 인증하는 기능을 맡았는데
숫자 + 소문자 알파벳 + 대문자 알파벳으로 이루어진 랜덤 코드를 뽑고 싶었기 때문에 . .
일단 알파벳을 랜덤으로 뽑는 건 모름 . . 🙄
결론은 두 가지 방법이 있었다.
하나는 1)아스키 코드를 응용하는 방법 또 하나는 2)알파벳을 랜덤으로 뽑아주는 클래스 사용하는 방법
1) 아스키 코드 x Random 클래스
import java.util.Random;
public String code() {
Random random = new Random();
StringBuffer code = new StringBuffer();
for(int i=0;i<11;i++) {
int rannum = random.nextInt(30);
//0-9 : 임의의 자리 숫자를 발생
//10-19 : 임의의 소문자 알파벳 발생
//20-29 : 임의의 대문자 알파벳 발생
if(rannum / 10 == 0) {
code.append(random.nextInt(10));
}else if(rannum / 10 == 1) {
code.append((char)(random.nextInt(26) + 97));
}else {
code.append((char)(random.nextInt(26) + 65));
}
}
return code.toString();
}
StringBuffer 객체를 일단 만들어주고 랜덤으로 숫자나 영어를 한 개씩 뽑아서 추가하는 방식. String Buffer는 문자열을 사용하거나 추가할 때 주로 사용하는 클래스이고 Random은 난수를 생성할 때 사용하는 클래스이다.
숫자는 nextInt( ) 메서드가 있지만 알파벳은 그런 게 없는 것 같았다. 그래서 찾아보니까 아스키 코드 a-z 범위가 97-122 이니까 0-25까지 무작위 숫자 하나 뽑고 97을 더해준 후에 char로 형변환 하는 방법이 있었음
A-Z도 똑같은 방법으로 하면 된다. 여기엔 97이 아닌 65를 더해준다.
나는 배치 순서도 랜덤인 11자리 코드를 만들려고 했기 때문에 이것까지 고려해서 코드를 짰다.
❓코드 설명❔
1 - 먼저 0부터 29까지 랜덤으로 숫자 하나를 뽑는다. 이 때 Random 클래스 객체가 있어야 가능함.
2 - ① 숫자가 0 - 9 이면 숫자를 랜덤으로 뽑은 후 append( )메서드를 사용해 StringBuffer 객체에 추가한다.
2 - ② 숫자가 10 - 19 이면 소문자 알파벳을 랜덤으로 뽑아서 추가한다.
2 - ③ 숫자가 20 - 29 이면 대문자 알파벳을 랜덤으로 뽑아서 추가한다.
3 - 이 과정을 11번 반복하면 11자리 랜덤 코드 생성 완료. toString( ) 메서드를 이용해서 버퍼를 문자열로 바꿔준다.
2) RandomStringUtils 클래스 활용
RandomStringUtils 클래스를 사용하려면 먼저 Apache Commons Lang3 라이브러를 내려받아야 한다. 프로젝트의 pom.xml 파일에 추가를 해줬다. ⬇
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
version은 원래 3.11.2 인가로 되어 있었는데 경고가 떠서 3.12.0 으로 바꿔줬다. 근데도 경고 안 사라짐 . . 뭔지 모르겠다
아무튼 이 dependency를 추가해주면 랜덤스트링유틸스를 사용할 수 있다.
import org.apache.commons.lang3.RandomStringUtils;
public String code() {
Random random = new Random();
StringBuffer code = new StringBuffer();
for(int i=0;i<11;i++) {
int rannum = random.nextInt(30);
//0-9 : 임의의 자리 숫자를 발생
//10-19 : 임의의 소문자 알파벳 발생
//20-25 : 임의의 대문자 알파벳 발생
if(rannum / 10 == 0) {
code.append(random.nextInt(10));
}else if(rannum / 10 == 1) {
code.append(RandomStringUtils.randomAlphabetic(1).toLowerCase());
}else {
code.append(RandomStringUtils.randomAlphabetic(1));
}
}
return code.toString();
}
11자리 코드를 생성하는 로직은 똑같고, 알파벳을 랜덤으로 뽑는 부분만 다르다.
randomAlphabetic( ) 이라는 메서드가 있는데 파라미터로 숫자를 넣어주면, 해당 길이 만큼의 문자열을 생성한다. 그래서 나는 1을 넣어줬음.
randomAlphabetic( )은 대문자 알파벳을 뽑기 때문에, 소문자로 뽑고 싶으면 뒤에 toLowewrCase( ) 메서드를 같이 써준다.
다 하고 보니까 쉬움. . .🥺
'Programming > JAVA' 카테고리의 다른 글
[Java 자바] 문자배열을 문자열로 출력하기(Char[] -> String) / String.valueOf( )와 Arrays.toString( )의 차이 (0) | 2023.08.18 |
---|---|
[Java 자바] LocalDate, LocalTime, LocalDateTime 사용법 (0) | 2023.08.13 |
[Java 자바] Calendar로 날짜와 시간 다루기 (현재 날짜 구하기/날짜 설정하기) (0) | 2023.08.12 |
[Java 자바] 현재 날짜와 시간 알아내기, 원하는 형식으로 출력하기 (Date, SimpleDateFormat 클래스) (0) | 2023.08.12 |
[Java 자바] 스캐너(Scanner) 정리 + 기본 사용법 (0) | 2023.07.09 |