사용자 이름 문자열 목록이 주어졌을 때, 몇 가지 조건을 기준으로 해당 사용자 이름이 유효한지 판별해야 하는 상황을 생각해 봅시다. 특히 사용자 이름의 길이가 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'가 연속으로 두 번 나타나므로 유효하지 않습니다. 나머지는 모두 조건을 만족합니다.
문제 해결 접근 방식
이 문제는 다음 단계를 따라 해결할 수 있습니다.
BadLengthException이라는 이름의 예외 클래스를 정의합니다.- 예외 객체는 생성 시 전달받은 길이 값을 저장하며,
what()메서드가 해당 길이를 반환하도록 구현합니다. - 사용자 이름
u_name을 인자로 받는validation()함수를 정의합니다. - 플래그 변수
isValid를true로 초기화합니다. - 사용자 이름의 길이를
n에 저장합니다. n < 5인 경우BadLengthException(n)을 던집니다(throw).- 반복문을 돌며
u_name[i]와u_name[i + 1]이 모두 'w'인지 확인하고, 그렇다면isValid를false로 설정합니다. - 최종적으로
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)를 활용하면 오류 상황을 일반적인 반환 값과 분리하여 더 명확하게 처리할 수 있다는 점이 이 예제의 핵심입니다.