Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 사용자 이름 유효성 검사하기: 짧은 사용자 이름을 위한 커스텀 예외 정의 방법

사용자 이름 문자열 목록이 주어졌을 때, 몇 가지 조건을 기준으로 해당 사용자 이름이 유효한지 판별해야 하는 상황을 생각해 봅시다. 특히 사용자 이름의 길이가 5자 미만일 경우 발생시킬 커스텀 예외(custom exception)를 직접 정의해야 합니다.

프로그램의 동작 방식은 다음과 같습니다.

  • 유효한 사용자 이름 → "Valid" 출력
  • 유효하지 않은 사용자 이름 → "Invalid" 출력
  • 길이가 너무 짧은 사용자 이름 → 예외를 던져 "Too short" 메시지와 함께 실제 길이 출력

유효한 사용자 이름의 조건

  • 사용자 이름은 반드시 5자 이상이어야 합니다.
  • 사용자 이름에 연속된 두 개의 'w'가 포함되어서는 안 됩니다.

예를 들어 입력이 unames = ["amit", "to", "paul_tim", "greg_harry", "towwer"]라면, 출력은 다음과 같습니다.

[Too short: 4, Too short: 2, Valid, Valid, Invalid]

앞의 두 항목("amit"은 4자, "to"는 2자)은 길이가 너무 짧아 예외가 발생하고, 마지막 항목("towwer")은 'w'가 연속으로 두 번 나타나므로 유효하지 않습니다. 나머지는 모두 조건을 만족합니다.

문제 해결 접근 방식

이 문제는 다음 단계를 따라 해결할 수 있습니다.

  1. BadLengthException이라는 이름의 예외 클래스를 정의합니다.
  2. 예외 객체는 생성 시 전달받은 길이 값을 저장하며, what() 메서드가 해당 길이를 반환하도록 구현합니다.
  3. 사용자 이름 u_name을 인자로 받는 validation() 함수를 정의합니다.
  4. 플래그 변수 isValidtrue로 초기화합니다.
  5. 사용자 이름의 길이를 n에 저장합니다.
  6. n < 5인 경우 BadLengthException(n)을 던집니다(throw).
  7. 반복문을 돌며 u_name[i]u_name[i + 1]이 모두 'w'인지 확인하고, 그렇다면 isValidfalse로 설정합니다.
  8. 최종적으로 isValid를 반환합니다.

main() 함수에서는 목록의 모든 사용자 이름에 대해 검증을 수행하고, 결과에 따라 "Valid", "Invalid", 또는 예외를 잡아(catch) "Too short"와 함께 길이를 출력합니다.

구현 예제

다음 구현을 통해 더 잘 이해해 보겠습니다.

#include <iostream>
#include <vector>
#include <exception>
using namespace std;
class BadLengthException{
    public:
    int x;
    BadLengthException(int n) {
        x=n;
    }
    int what() const throw(){return x;}
};
bool validation(string u_name) {
    bool isValid = true;
    int n = u_name.length();
    if(n < 5) {
        throw BadLengthException(n);
    }
    for(int i = 0; i < n-1; i++) {
        if(u_name[i] == 'w' && u_name[i+1] == 'w') {
            isValid = false;
        }
    }
    return isValid;
}
int main() {
    vector<string> unames = {"amit", "to", "paul_tim", "greg_harry", "towwer"};
    for(int i = 0; i < unames.size(); i++){
        string u_name = unames[i];
        try {
            bool isValid = validation(u_name);
            if(isValid) {
                cout << "Valid" << '\n';
            } else {
                cout << "Invalid" << '\n';
            }
        } catch (BadLengthException e) {
            cout << "Too short: " << e.what() << '\n';
        }
    }
}

입력

{"amit", "to", "paul_tim", "greg_harry", "towwer"}

출력

Too short: 4
Too short: 2
Valid
Valid
Invalid

코드 설명

BadLengthException 클래스는 정수형 멤버 변수 x에 위반된 사용자 이름의 길이를 저장합니다. what() 메서드는 이 값을 반환하므로, 예외를 잡았을 때 구체적으로 몇 자였는지 알 수 있습니다.

validation() 함수는 먼저 길이 조건을 검사하여 5자 미만이면 즉시 예외를 던지고, 통과한 경우에만 인접한 두 문자를 비교하며 연속된 'w' 여부를 확인합니다. 이처럼 예외 처리(exception handling)를 활용하면 오류 상황을 일반적인 반환 값과 분리하여 더 명확하게 처리할 수 있다는 점이 이 예제의 핵심입니다.