Programming/JAVA

[Java 자바] 임의의 숫자 + 문자 코드 생성하기

꼬ㄴi 2023. 7. 19. 23:39

사이트 가입 절차 중 랜덤으로 코드를 부여하고 인증하는 기능을 맡았는데

숫자 + 소문자 알파벳 + 대문자 알파벳으로 이루어진 랜덤 코드를 뽑고 싶었기 때문에 . . 

일단 알파벳을 랜덤으로 뽑는 건 모름 . . 🙄

결론은 두 가지 방법이 있었다.

하나는 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(  ) 메서드를 같이 써준다.

 

다 하고 보니까 쉬움. . .🥺