우아한테크코스

"프리코스 19일차" 코드에 팩토리 클래스와 다양한 Exception의 유형 적용

kanado 2024. 11. 2. 23:40

📝 오늘의 Todo 리스트 체크

  • 코드 구현 마무리
    • 클래스 간에 강한 결합 분석 ✅
    • 팩토리 클래스를 도입
  • (학습) 다양한 Exception의 유형 알아보기

목차

  • 클래스 간에 강한 결합 분석 
    • Lotto와 Lottos 클래스 사이의 관계
    • 메인 conrtoller 클래스의 합성 관계
  • 다양한 Exception의 유형 학습
  • 3 주차 미션에 다양한 Exception의 유형을 적용
    • IllegalArgumentException
    • NumberFormatException
    • ArithmeticException
  • 내일 Todo 리스트

클래스 간에 강한 결합 분석 

객체 간 참고 관계는 결합도가 가장 높은 관계 중 하나이다. 이것을 합성 관계라고도 부른다. 생명주기가 다른 클래스가 서로를 참조하면, 한 클래스의 수정이나 삭제가 다른 클래스에 영향을 미치게 되어 유지보수가 어려워진다. 

 

 

1) Lotto와 Lottos 클래스 사이의 관계


3주차 "로또" 미션에서 설계와 코드 구현을 완료한 후, 클래스들 간의 합성 관계를 분석하였다. 그 결과, 로또 한 장을 위한 Lotto 클래스와 한 게임에서 발매된 모든 로또를 위한 Lottos 클래스 간에 합성 관계가 존재함을 확인했다. Lottos 클래스는 Lotto 객체들을 직접 소유하고 관리하며, 두 클래스는 생명주기를 함께 공유하여 강한 결합을 이루고 있다.

 

이를 해결하기 위해, Lotto 객체 생성을 담당하는 로직을 분리하여 Lottos 클래스가 필요한 Lotto 객체를 LottoFactory 클래스를 통해 생성하도록 구성했다. 팩토리 클래스를 활용하여 Lottos 클래스의 생성 책임을 외부로 위임함으로써 Lotto와 Lottos 클래스 간의 강한 결합을 줄이고, 각 클래스가 본래의 책임에만 집중할 수 있도록 구현했다.

 

 

 

2) 메인 conrtoller 클래스의 합성 관계


또한, 로또 애플리케이션의 메인 컨트롤러 클래스인 LottoMachineController는 view 클래스와 model 클래스 간에 데이터를 교환하기 위해 Lottos, Money, TotalPrice, WinningNumbers, InputView 등의 model 객체들을 직접 생성하고 내부에서 사용하며 이들 객체와 생명주기를 공유한다.

 

LottoMachineController가 이러한 객체들을 직접 생성하고 관리할 경우, 클래스 간 결합도가 높아져 수정과 확장이 어려워지고 유지보수성이 저하될 수 있다. 이를 해결하기 위해 여기서도 객체 생성 책임을 팩토리 클래스에 위임하여, LottoMachineController와 model 클래스 간의 결합도를 낮추고 각 클래스가 본연의 역할에 집중하도록 구조를 개선할 수 있었다. 

 

다양한 Exception의 유형 학습

3주 차 미션 기능 요구 사항에 Exception이 아닌 IllegalArgumentException, IllegalStateException 등과 같은 명확한 유형을 처리해야한다고 나와있었다. 1주차 미션때부터 IllegalArgumentException을 사용해왔자만 IllegalArgumentException의 정확한 정의와 정확하게 어떤 상황에서 사용해야되고 언제는 다른 유형의  Exception을 사용해야되는지 모르고 있었다. 이 기회에  Exception의 여러 유형과 각 유형의 대한 정의, 용도를 알아보았다.

 

Exception을 여러 유형으로 나누는 이유는 오류의 원인을 명확하게 구분하고, 상황에 맞는 적절한 대응을 할 수 있도록 하기 위함이다. 예외 처리가 구체적일수록 오류 발생 원인 파악이 쉬워지고, 문제 해결이 수월해진다.

 

자바에서는 오류를 Error와 Exception으로 나누었고 이들을 클래스로 구현하여 처리하도록 한다. 우리에게 익숙한 IllegalArgumentException을 비롯해 NullPointerException과 IOException도 모두 클래스이다. 자바의 오류 클래스 계층 구조를 살펴보면 다음과 같이 구성 되어 있다.

 

 

 

많고 많은 Exception 클래스들 중에 프리코스 동안 미션에서 유용할 것 같은 클래스를 다음과 같이 뽑아봤다.

 

1) IllegalArgumentException (잘못된 인수 예외)

IllegalArgumentException은 메서드에 전달된 인수가 예상한 형식이나 값이 아닐 때 발생해. 이 예외는 메서드를 호출할 때 입력이 올바르지 않은 경우를 처리하는 데 사용한다.

 

언제 사용하는가?

 

  • 메서드나 생성자의 매개변수가 허용 가능한 범위에 있지 않을 때 
  • 예상된 유형이나 값이 아닌 매개변수가 제공될 때

 

2) IllegalStateException (잘못된 상태 예외)

IllegalStateException은 객체의 상태가 현재 메서드를 수행하기에 적합하지 않을 때 발생해. 메서드가 호출되는 시점에 객체의 내부 상태가 메서드를 실행할 수 없는 경우에 사용된다.

 

언제 사용하는가?

  • 메서드를 호출하기 전에 객체가 특정 상태에 있어야 할 때 (예: 준비되지 않은 객체에서 메서드 호출 시)
  • 잘못된 상태에서 메서드를 호출하려고 할 때

 

3) NullPointerException

객체 참조가 null일 때 이를 사용하려고 하면 발생하는 예외이다.

 

언제 사용하는가?

  • 객체가 null인지 확인하지 않고 메서드를 호출하거나 필드에 접근할 때

 

4) IndexOutOfBoundsException

컬렉션이나 배열 등에서 잘못된 인덱스로 접근하려고 할 때 발생한다.

 

언제 사용하는가?

  • 배열이나 리스트의 범위를 초과하여 인덱스를 참조할 때

 

5) NumberFormatException

문자열을 숫자로 변환하려 할 때 형식이 올바르지 않으면 발생해한다.

 

6) ArithmeticException

산술 연산에서 오류가 발생할 때 사용하는 예외야, 특히 0으로 나눌 때 유용하다.

 

7) ClassCastException

잘못된 형변환이 발생할 때 발생하는 예외이다.

 

 

3주 차 미션에 다양한 Exception의 유형을 적용

 

1) IllegalArgumentException

 

 

2) NumberFormatException

사용자의 입력된 문자열형의 숫자들을 정수형의 숫자로 파싱 담당하는 유틸리티 클래스 Parser에서 파싱 과정에서 문자열에 숫자가 아닌 것이 포함되어 있으면  NumberFormatException로 예외 처리하도록 구현했다.

 

3) ArithmeticException

총 상금을 관리하는 TotalPrice 클래스에서 수익률을 구하는 메서드에서 계산 과정에서 예외 발생시에 ArithmeticException으로 처리하도록 구현했다.

 

내일 Todo 리스트

  • 코드 리팩토링
    • 모든 요구 사항 체크 🔳
    • MVC 디자인 패턴 설계 업데이트 🔳
    • 클래스 다이어그램 설계/그리기 🔳

참고자료

 

☕ 자바 에러(Error) 와 예외 클래스(Exception) 💯 이해하기

프로그래밍의 오류 종류 프로그램에서 오류가 발생하면 시스템 레벨에서 프로그램에 문제를 야기하여 원치 않는 버그를 일으키거나, 심각하면 실행 중인 프로그램을 강제로 종료시키도 한다.

inpa.tistory.com

 

 

[자바 JAVA] 예외의 종류

자바에서 자주 발생하는 예외들과 예외에 대한 처리들에 대해서 정리 해 보도록 하겠습니다. 에러와 예외컴퓨터 하드웨어의 동작의 오작동 또는 고장으로 인해 응용프로그램 실행 오류가 발생

dreamcoding.tistory.com

 

끝.