일단 이것저것 해 보는 블로그

(Do it! 자바, 5주차-1) 14장 되새김 문제 풀이 본문

2026/Do it Java 스터디(2026.01.~02.)

(Do it! 자바, 5주차-1) 14장 되새김 문제 풀이

뷔구룽 2026. 2. 6. 14:37

사용한 학습 자료: 박은종, 2025, <Do it! 자바 프로그래밍 입문 [개정판]>, 이지스퍼블리싱.

https://ebook-product.kyobobook.co.kr/dig/epd/ebook/E000010942415

 

Do it! 자바 프로그래밍 입문 [개정판] | 박은종 저자

eBook Do it! 자바 프로그래밍 입문 [개정판] | 3만 6천 부 이상 팔린 초판의 성공에 힘입어 좀 더 입문자의 눈높이에 맞춰 내용을 수정하고 최신 개발 트렌드에 맞게 개정판을 출간했습니다. 저자인

ebook-product.kyobobook.co.kr

 

01. Exception

-> 모든 예외 클래스의 최상위

 

02. finally

-> try 블록을 수행하면 항상 수행되는 예약어.

주로 불러온 파일을 닫거나 네트워크 리소스(자원)를 해제를 수행하고자 할 때 사용.

 

03. throws

-> 예외를 직접 처리하지 않고 미룰 때 사용하는 예약어.

 

04. throw

-> 사용자가 강제로 예외를 발생시킬 때 사용하는 예약어.

사용자 정의 예외 정의 시 특정 조건에 따라 직접 예외를 만들 때 사용 가능.

 

05. 비밀번호 제약 조건 구현을 위한 사용자 예외 처리 코드

 // 전략
 
 private String userPassword; // 비밀번호 값 변수 선언
 
 public String getUserPassword() {
        return userPassword;
    }
    // 비밀번호 제약 조건 예외 처리 구현
    public void setUserPassword(String userPassword) throws PwdFormatException {
        if (userPassword == null) {
            throw new PwdFormatException("비밀번호는 not null값이어야 함.");
        }
        else if (userPassword.length() < 5) {
            throw new PwdFormatException("비밀번호: 5지 이상");
        }
        else if (userPassword.matches(userPassword)) {
            throw new PwdFormatException("비밀번호: 적어도 1자의 숫자 포함");
        }
        this.userPassword = userPassword; // 비밀번호 값 바꾸기
    }

    public static void main(String[] args) {
        IDFormatTest test = new IDFormatTest();
		// 중략
        
        // 비밀번호 관련 예외 테스트
        String userPassword = null;
        try {
            test.setUserPassword(userPassword);
        } catch (PwdFormatException e) {
            System.out.println(e.getMessage());
        }

        userPassword = "VGurung";
        try {
            test.setUserPassword(userPassword);
        } catch (PwdFormatException e) {
            System.out.println(e.getMessage());
        }

        userPassword = "VGr";
        try {
            test.setUserPassword(userPassword);
        } catch (PwdFormatException e) {
            System.out.println(e.getMessage());
        }
    }
}

 

(메모)

1)         else if (userPassword.matches(userPassword)) {
            throw new PwdFormatException("비밀번호: 적어도 1자의 숫자 포함");
        }

-> String 클래스의 matches() 메서드-> 비밀번호가 문자열로만 이루어졌는지 확인

-> 밑줄 친 부분 결과가 true이면 직접 정의한 예외 메시지 출력.

 

2) 테스트 소스 코드 중

        userPassword = "VGurung"; // 비밀번호가 문자열로만 구성
        try {
            test.setUserPassword(userPassword);
        } catch (PwdFormatException e) {
            System.out.println(e.getMessage());
        }

        userPassword = "VGr"; // 비밀번호가 5자 미만
        try {
            test.setUserPassword(userPassword);
        } catch (PwdFormatException e) {
            System.out.println(e.getMessage());
        }

에서 비밀번호가 5자 미만 부분도 출력 결과가

"비밀번호: 적어도 1자의 숫자 포함"

으로만 나오는 이슈 발생.

 

그 원인을 기존 코드 구성에서 찾아보았다.

        if (userPassword == null) {
            throw new PwdFormatException("비밀번호는 not null값이어야 함.");
        }
        else if (userPassword.matches(userPassword)) {
            throw new PwdFormatException("비밀번호: 적어도 1자의 숫자 포함");
        }
        else if (userPassword.length() < 5) {
            throw new PwdFormatException("비밀번호: 5지 이상");
        }

 

기본적으로 예외 처리 구문은 순서대로 실행되며, 앞에서 모든 예외 처리가 끝나면 그 다음 구문은 수행되지 않는다.

이때 순서상 두 번째 조건이 먼저 수행되고

세 번째 테스트 값 "VGr"은 두 번째와 세 번째 조건을 모두 만족한다.

따라서 두 번째 조건에서 예외 처리가 다 끝나 세 번째 조건이 실행되지 못한 것으로 보인다.

 

(어떻게 해결했나?) 두 가지 방법이 있겠다.

        if (userPassword == null) {
            throw new PwdFormatException("비밀번호는 not null값이어야 함.");
        }
        else if (userPassword.length() < 5) {
            throw new PwdFormatException("비밀번호: 5지 이상");
        }
        else if (userPassword.matches(userPassword)) {
            throw new PwdFormatException("비밀번호: 적어도 1자의 숫자 포함");
        }

-> 가장 확실한 방법으로, 조건의 순서를 위와 같이 수정하거나

 

-> 세 번째 테스트 값에 숫자를 추가하거나 ex) "VGr1"

 

* 단 실사용에서는 보다 다양한 비밀번호 값(예외)이 나올 수 있으므로

첫 번째 방법처럼 예외 처리 구문의 순서에 신경쓰는 게 더 효율적일 것 같다.

 

06. 확인 예외와 확인되지 않은 예외의 차이

확인 예외 확인되지 않은 예외
예외 발생 시 컴파일러에서 바로 확인 가능하므로, 반드시 예외를 처리하는 코드를 명기해 주어야 한다. 그렇지 않으면 컴파일 오류가 발생한다.
try~catch문 등으로 처리할 수 있다.
프로그래머가 별도로 처리하지 않아도 오류가 발생하지는 않지만, 이 예외가 발생 시 프로그램이 갑자기 멈출 수 있다.
그러므로 코드를 작성할 때 이런 예외를 매끄럽게 처리하도록 주의할 필요가 있다.

 

07. 사용자 정의 예외 활용 예

- 사용자가 프로그램에 필요한 제약 조건(예외)을 직접 만들어 쓰고 싶을 때 활용 가능.

- 실무에서 프로젝트를 진행할 때 필요에 따라 직접 예외 클래스를 만들어 사용하는 경우 종종 있다고 함.
- 예시 1: 회원가입 사이트 구현 시 회원 아이디 값에 특정 제약 조건을 추가할 때-> Not Null 값이거나 특정 글자수 미만/ 초과이면 아이디 생성 제한

- 예시 2: 웹 크롤링 프로그램 구현 시 대상 사이트에서 가져올 데이터의 조건을 직접 설정할 때?