https://m0j4.tistory.com/4
지난번에 이어 Math.random() 메서드도 사용할 수 있지만 이번엔 Random 클래스를 이용하는 포스팅을 할 예정이다.
Random클래스는 java.util.Random 클래스를 위에 import문으로 붙여주고 쓸 수 있다.
Math.random 메서드는 0 <= x < 1 범위로 시작해서 범위를 계산해서 설정해주었었다.
랜덤 클래스는 무작위 숫자를 생성하는 클래스로 객체를 생성해서 사용해준다.
사실 학원 진도로는 아직 객체를 나가진 않았지만 슬슬 객체도 시작할때쯤 됐다. 어제 메서드를 배웠으니...
객체는 다음에 시간들여서 복습하는 포스팅을 작성하는걸로 하고!
랜덤 클래스를 불러와준다음, 변수.nextInt(갯수) + 최솟값 의 형태로 넣어주면 된다.
메서드 | 기능 |
int nextInt() | int형으로 랜덤 숫자 생성 |
long nextLong() | long형으로 랜덤 숫자 생성 |
float nextFloat() | float형으로 랜덤 숫자 생성 |
double nextDouble() | double형으로 랜덤 숫자 생성 |
boolean nextBoolean() | boolean형으로(true/false) 랜덤 생성 |
메서드 괄호 () 안에 숫자 값이 들어갈 수 있는데 이를 인자값이라고 한다.
이 인자값을 따로 넣지 않는다면 min ~ max 값의 랜덤 숫자를 자동으로 뽑는다.
생성된 4자리 임시 비밀번호를 맞출때까지
모든 비밀번호를 생성하고 대조하는 프로그램을 만들어보세요
좋아 한번 만들어볼까?
public static void main(String[] args) {
String symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // 대문자
+ "abcdefghijklmnopqrstuvwxyz" //소문자
+ "0123456789" //숫자
+ "!\"@#$%^&*()_+|-=\\{}[]:;'<>?,./"; //특수문자
Random random = new Random(); //랜덤 클래스를 생성
String random_password = ""; // for문 돌려서 문자열 추가하듯이 하나하나 넣을거임
for(int i = 0; i < 4; i++) {
char ran = symbols.charAt(random.nextInt(symbols.length()));
random_password += ran;
}
// 아이디어는 이럼
// 진법을 이용해서 천의 자리는 10^3 * a, 백의 자리는 10^2 * b... 이런 식일태니까
// symbols 진법에서는 제일 앞의 숫자의 표현 방식은 (symbols.length())^3 * a 이게 되는거임
// 그래서 제일 앞의 숫자는 인덱스를 를 세 번 나눈다음의 나머지를 계산하면 된다.
// 이런식으로 인덱스가 빠르게 증가하면서, 일의 자리에서 symbols.length()의 길이만큼 다 채워지면
// 십의 자리에서 다음 문자로 넘어가고.... 그렇게 할거임
double max_index = Math.pow(symbols.length(), 4);
for (int i = 0; i < max_index; i++) {
StringBuilder brute_password_builder = new StringBuilder();
//문자열을 생성하는 도구, 객체이다.
//String 변수명 = ""; 이렇게 만들어놓고 변수명 += 문자넣어줄변수;
//이렇게 문자를 넣는거랑 똑같음
int brute_index = i;
for (int j = 0; j < 4; j++) { //symbols.length 진법
brute_password_builder.insert(0, symbols.charAt(brute_index % symbols.length()));
//builder변수명.insert(삽입할 위치 인덱스, 삽입내용)
//insert는 StringBuilder 에서 원하는 인덱스에 삽입내용을 삽입할 수 있도록 해준다.
brute_index = brute_index / symbols.length();
//누적해서 나눠주면서 insert로 차곡차곡 쌓아가는...
}
String brute_password = brute_password_builder.toString();
//toString 메서드는 문자열 만들어주는 도구인 StringBuilder를 문자열로 다시 바꿔줌
System.out.println(brute_password);
//랜덤으로 생성한 패스워드랑, 계속해서 증가하는 패스워드가 같게되면 프로그램 종료
if (random_password == brute_password) {
System.out.println("비밀번호를 찾았습니다! 프로그램을 종료합니다.");
return;
}
}
}
주석으로 코드 하나하나 설명
주석 X 버전
public static void main(String[] args) {
String symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // 대문자
+ "abcdefghijklmnopqrstuvwxyz" //소문자
+ "0123456789" //숫자
+ "!\"@#$%^&*()_+|-=\\{}[]:;'<>?,./"; //특수문자
Random random = new Random();
String random_password = "";
for(int i = 0; i < 4; i++) {
char ran = symbols.charAt(random.nextInt(symbols.length()));
random_password += ran;
}
double max_index = Math.pow(symbols.length(), 4);
for (int i = 0; i < max_index; i++) {
StringBuilder brute_password_builder = new StringBuilder();
int brute_index = i;
for (int j = 0; j < 4; j++) { //symbols.length 진법
brute_password_builder.insert(0, symbols.charAt(brute_index % symbols.length()));
brute_index = brute_index / symbols.length();
}
String brute_password = brute_password_builder.toString();
System.out.println(brute_password);
if (random_password == brute_password) {
System.out.println("비밀번호를 찾았습니다! 프로그램을 종료합니다.");
return;
}
}
}
진짜 처음에 이 코드 봤을 때 10진수와 2진수는 이해를 했었지만 8진법이나 16진법 이런거 나왔을 때 이해를 못해서 고생을 많이했다.
진법을 제대로 이해해주고 진법을 이용해 누적해서 나눠주는 것을 연상하면 되는 문제였다.
랜덤 클래스를 생성해서 랜덤으로 비밀번호를 만들어주고, 비밀번호가 같을때까지, max index까지 하나하나 더해서 모든 비밀번호와 대조하는 프로그램을 만든것이다.
'Java (국비지원 당시 공부했던 글) > Java 프로그래밍' 카테고리의 다른 글
[JDBC] JDBC 란 무엇인가 (자바에서 DB연결해서 코딩하기), JDBC API 참조 (0) | 2022.07.17 |
---|---|
[자바] - 백준 10718, 10171, 10172번 풀이 (0) | 2022.06.06 |
[자바] - 백준 2557번 문제 풀이, BufferedWriter flush() 사용 이유 (0) | 2022.06.05 |
[자바] 무작위 숫자 생성 (1) - Math.random() (0) | 2022.04.22 |
제어구조(control structure) (0) | 2022.04.15 |