public class Password {
    public static void main(String[] args) {
        int passLength = 10; // 패스워드 길이
        int passNumber = 20; // 생성할 패스워드 개수
        int[] password = new int[passLength];
        for (int i = 0; i < passNumber; i++) {
            int number = 0;
            int special = 0;
            int lower = 0;
            int upper = 0;
            for (int j = 0; j < password.length; j++) {
                int ranNum;
                ranNum = (int) ((Math.random() * 94) + 33);
                password[j] = ranNum;
                if (ranNum < 48) {
                    special = 1;
                } else if (ranNum < 58) {
                    number = 1;
                } else if (ranNum < 65) {
                    special = 1;
                } else if (ranNum < 91) {
                    upper = 1;
                } else if (ranNum < 97) {
                    special = 1;
                } else if (ranNum < 123) {
                    lower = 1;
                } else {
                    special = 1;
                }
            }
            if (number + special + lower + upper >= 3) {
                for (int n : password) {
                    System.out.print((char) n);
                }
                System.out.println();
            } else {
                i--;
            }
        }
    }
}


지난번에 올렸던 글에 댓글이 달려가지고... 퇴근하고 집에 와서 호기심에 한번 만들어 봤습니다. 비겁한 변명이지만 저는 개발자도 아니고 자바는 신입사원 교육 때 2주간 기초교육 받아본게 전부라서... 코드가 매우 허접합니다. 그래도 제가 이런 허접한 코드를 짜서 올리는 이유는, 개발자 분들의 황금같은 조언을 얻고자...

제가 이렇게 짜면서 궁금했던 부분은

1. 랜덤하게 뽑은 숫자가 ASCII 코드표의 특수문자, 숫자, 대문자, 소문자 중 어디에 속하는지를 검사하는 좀 더 세련된 방법이 없을까?

2. 최소 3가지 이상 종류가 조합되었는지 여부를 판단하는 좀 더 세련된 방법이 없을까?

아무튼 허접한 코드 봐주셔서 감사하고, 더 좋은 방법이 있다면 언제든지 조언해주시면 귀담아 듣겠습니다. 감사합니다.