본문 바로가기
Java/참고자료

[Java] 다국어 이름 마스킹 소스 코드

by SeungyubLee 2025. 12. 15.

▶ 한글 이름

입력값 출력값
*
홍길 홍*
홍길동 홍*동
이순신장군 이****
홍 길동 홍 *동
이 승 엽 이 * *

 

▶ 영문 이름

입력값 출력값
A *
Jo J*
Tom T*m
Alice A****
John Smith J*** S****
Mary Jane Watson M*** J*** W*****

 

▶ 한문 이름

입력값 출력값
*
張偉 張*
王小明 王*明
諸葛 亮 諸* *

 

▶ 베트남어 이름

입력값 출력값
An A*
Minh M***
Nguyễn N*****
Trần Văn Nam T*** V** N**
Lê Thị Thu Hương L* T** T** H****

 

▶ Java 다국어 이름 마스킹 소스 코드

/**
 * 사용자 이름 마스킹
 * 공백이 포함된 이름은 단어 단위로 분리하여 마스킹
 * 공백이 없는 이름은 길이에 따라 마스킹 규칙 적용
 * null 또는 공백만 있는 문자열은 그대로 반환
 * 앞뒤 공백은 제거 후 처리
 * 한글, 영문, 한문, 베트남어 등 문자 종류와 무관하게 동작
 */
public static String maskingUserName(String name) {

    // null 이거나 공백만 있는 경우 그대로 반환
    if (name == null || name.trim().isEmpty()) {
        return name;
    }

    // 앞뒤 공백 제거
    String trimmedName = name.trim();

    // 이름에 공백(스페이스, 탭 등)이 포함되어 있는지 확인
    boolean hasSpace = trimmedName.chars().anyMatch(Character::isWhitespace);

    // 공백이 있는 이름 (예:"홍 길동", "John Smith")
    if (hasSpace) {
        // 연속 공백을 하나로 처리하여 분리
        String[] parts = trimmedName.split("\\s+");
        StringBuilder masked = new StringBuilder();

        for (int i = 0; i < parts.length; i++) {
            if (i > 0) {
                masked.append(" "); // 단어 사이 공백 유지
            }
            masked.append(maskingSinglePart(parts[i])); // 단어 단위 마스킹
        }

        return masked.toString();
    }

    // 공백이 없는 이름
    int length = trimmedName.length();

    if (length == 1) {
        return "*";
    }

    if (length == 2) {
        return trimmedName.charAt(0) + "*";
    }

    if (length == 3) {
        return trimmedName.charAt(0) + "*" + trimmedName.charAt(2);
    }

    // 길이 4 이상
    return maskingSinglePart(trimmedName);
}

/**
 * 공백으로 구분된 이름의 각 단어를 마스킹한다.
 * 단어 길이가 1인 경우 "*"로 처리
 * 단어 길이가 2 이상인 경우 첫 글자만 남기고 나머지는 "*" 처리
 */
private static String maskingSinglePart(String part) {

    // null 또는 빈 문자열 방어 처리
    if (part == null || part.isEmpty()) {
        return part;
    }

    int length = part.length();

    if (length == 1) {
        return "*";
    }

    char first = part.charAt(0);

    // 첫 글자 + 나머지 길이만큼 "*" 반복
    return first + "*".repeat(length - 1);
}