포스트

Java의 Wrapper 클래스, Generic 제네릭, 예외 처리 방법

강의 내용 복습 : 코리아IT 신촌점 강의 (2024-05-07,13 강의)

  • Tool :
    Java Eclipse


🔔 데이터 타입 단일화

📌 Wraaper 클래스

  • Wrapper 클래스는 기본 데이터 타입을 객체로 포장하여 객체처럼 다룰 수 있는 기능입니다.
  • Wrapper 클래스의 목적은 객체 데이터만을 다루는 API에 대응하려는 것입니다.
  • Wrapper 클래스의 예시로는 Integer, Double, Boolean, Character가 있습니다.
  • 참고로 String은 기본 타입이 아닌 참조형 데이터 타입이기에 wrapper 클래스가 아닙니다.

📌 제네릭(Generic)

  • 제네릭은 단일 또는 다수의 객체화 된 데이터 타입을 파라미터처럼 처리하는 기능입니다.
  • 제네릭을 사용하기 위해서는 중괄호(‘<>’)를 사용하면 됩니다.
  • 객체화 된 데이터 타입의 예시로는 int의 wrapper 클래스인 Integer 등입니다.
  • 제네릭의 장점은 다른 타입의 객체가 유입되는 것을 컴파일 과정에서 차단할 수 있다는 것입니다.
  • 제네릭이 사용된 블록은 데이터 타입이 명확하기 때문에 프로그램 유지/보수에 좋습니다.
  • 제네릭의 사용 예시는 아래와 같습니다.
1
2
3
4
5
6
// Java 7 이후 버전
// Java의 유추 기능 추가로 코드의 간결화 가능
List<Integer> lottoWinningNumber = new LinkedList<>();

// Java 7 이전 버전
LinkedList<Integer> lottoWinningNumber = new LinkedList<Integer>();


🔔 에러의 종류

  • 예외 처리가 필요한 대표적인 에러는 아래와 같으며 실제 종류는 예시보다 더욱 다양합니다.

📌 리소스 부족 에러

  • 메모리 부족 : 시스템에서 사용 가능한 메모리가 부족할 때 발생되는 에러입니다.
  • CPU 부족 : CPU 자원의 소모로 인해 시스템이 요청을 처리할 수 없는 에러입니다.
  • 디스크 공간 부족 : 저장 장치의 공간이 부족할 때 발생되는 에러입니다.

📌 문법 에러(Syntax Error)

  • 문법 에러는 Syntax Error라고 하며 프로그래밍 코드에 문법적인 오류가 있을 때 발생됩니다.
  • 이는 컴파일이나 코드 해석 단계에서 발견되고 프로그램의 실행을 차단합니다.
  • 보통 세미콜론이나 괄호 등을 누락시켰을 때 발생됩니다.
  • IDE 코드 입력 과정 중 빨간색 밑줄이 있는 경우 Syntax Error를 의심해볼 수 있습니다.

📌 런타임 에러(Runtime Error)

🚩 Checked Exception

  • 시스템 레벨의 연산 과정에서 발생되는 예외이며 이를 처리하지 못하면 컴파일되지 않습니다.
  • 예를들면 데이터 입출력(IO; input / output), 데이터베이스 접근 등에서 발생되는 예외입니다.
  • 이러한 예외는 프로그램 실행 전에 예측 가능하기 때문에 예외 처리 과정이 필요합니다.
  • 참고로 Exception 클래스는 모든 checked 예외를 포함하는 슈퍼 클래스입니다.

🚩 Unchecked Exception

  • 개발자의 실수(휴먼 에러)로 인해 발생되는 예외이며 프로그램 실행 중 발생됩니다.
  • 예를들면 잘못된 타입의 객체를 사용하거나 변수명을 제대로 입력하지 않아 발생되는 예외입니다.
  • 이러한 예외가 있어도 컴파일은 되지만 프로그램이 정상 실행되지는 않습니다.
  • 참고로 RuntimeException 클래스는 모든 unchecked 예외를 포함하는 클래스입니다.
  • Exception 클래스는 RuntimeException의 부모 클래스입니다.


🔔 예외 처리

📌 예외 처리 개념

  • 예외는 예측 가능한 에러와 예측 불가능한 에러로 구분됩니다.
  • 예외 처리란 에러가 발생됐을 때 프로그램을 안정적으로 유지하기 위한 개념입니다.
  • 즉, 에러 발생 사실을 알리고 다른 동작을 계속 이어갈 수 있게 하는 것이 예외 처리입니다.
  • 만일 예외를 처리하지 않는 경우 예외가 발생된 스레드의 실행이 중단됩니다.

📌 try-catch 블록

  • try-catch 블록의 목적은 애플리케이션 실행 도중 에러 발생 시를 대비하는 것입니다.
  • try 블록에는 실행될 코드를, catch 블록에는 예상되는 에러 종류를 작성합니다.
  • try 블록의 코드 실행 중 예외가 발생되면 catch 블록의 코드가 실행됩니다.
  • try-catch 블록의 흔한 예시로는 사용자의 잘못된 입력으로 인한 에러 출력 방지입니다.
  • try-catch 블록의 예시는 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.util.InputMismatchException;
import java.util.Scanner;

public class TryCatchTest {
	
	public static void main(String[] args) {
		
		int num = 10;
		int result = 1;
		Scanner scan = new Scanner(System.in);
		
		// 문법적으로는 맞지만 수학적으로는 문제가 있는 공식을 작성하였습니다.
		try {
			result = num / 0;
		}
		// ArithmeticException 에러 발생 시 안내 문구를 출력하였습니다.
		catch(ArithmeticException e) {
			System.out.println("0으로 나눌 수 없습니다.");
		}
		
		// result에 할당된 값이 변경됐는지 확인하였습니다.
		System.out.println(result);
		
		// 문법적으로는 맞지만 사용자가 잘못 입력할 수 있는 코드를 작성하였습니다.
		try {
			System.out.println("숫자를 입력하세요.");
			System.out.print("숫자 입력 = ");			
			scan.nextInt();
			System.out.println("입력 완료");
		}
		// InputMismatchException 에러 발생 시 안내 문구를 출력하였습니다.
		catch(InputMismatchException e) {
			System.out.println("문자를 입력하셨습니다.");
			System.out.println("숫자를 입력하세요.");
			scan.nextLine();
			
			try {
				System.out.print("숫자 입력 = ");
				scan.nextInt();
				System.out.println("입력 완료");
			}
			catch(InputMismatchException ee) {
				System.out.println("문자가 입력되어 시스템을 종료합니다.");
			}
		}
		
		scan.close();
		
	}

}

📌 throws 키워드

  • throws 키워드의 목적은 애플리케이션 실행 전에 에러 발생 가능성을 명시하는 것입니다.
  • throws 키워드는 예상되는 에러 명칭과 함께 메서드 선언부에 입력합니다.
  • throws 키워드는 해당 메서드를 호출하는 코드에게 예외 처리의 책임을 위임합니다.
  • throws 키워드의 예시는 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class ThrowsTest {
	
	public static int divide(int numerator, int denominator)
		throws ArithmeticException {
		return numerator / denominator;
	} 
	
	public static void main(String[] args) {
		
		try {
			System.out.println(divide(10, 0));
		}
		catch (ArithmeticException e) {
			System.out.println("나눗셈 오류");
		}
		catch (NullPointerException e) {
			System.out.println("객체 생성 오류");
		}
		
		System.out.println("시스템 종료");
		
	}

}

📌 finally 블록

  • finally 블록에는 예외 발생 여부와 상관없이 항상 실행되는 코드를 입력할 수 있습니다.
  • finally 블록에 입력되는 코드의 예시는 리소스 자원을 정리하는 코드 등이 있습니다.
  • 아래 예시의 finally 블록에는 Scanner 클래스의 close 메서드를 입력하였습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.util.InputMismatchException;
import java.util.Scanner;

public class FinallyTest {
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		
		int googoodan = 0;
		
		while(true) {
			try {
				System.out.println("구구단 게임을 시작하겠습니다.");
				System.out.print("2~9 사이의 숫자 입력 = ");
				googoodan = scan.nextInt();
				
				if(googoodan < 2 || googoodan > 9) {
					// InputMismatchException 발생 가능성
					throw new InputMismatchException("2~9 사이의 정수를 입력하세요.");
				}
				else {
					// 구구단 나열을 위한 반복문
					for(int i = 1; i < 10; i++) {
						System.out.print(googoodan + " X " + i + " = " + (googoodan * i) + "   ");
					}
					
					// 출력이 끝나면 이탈
					break;
				}
			}
			// 예외 발생 시 코드 실행
			// Exception 슈퍼 클래스는 Java에서 발생될 수 있는 모든 종류의 예외 포함
			catch(Exception e) {
				// 버퍼 해소
				scan.nextLine();
				// null이면 문구 출력, null이 아니면 메시지 출력
				String comment = (e.getMessage() == null ? "잘못 입력하였습니다." : e.getMessage());
				System.out.println(comment);
			}
			// 예외 발생 유무와 상관 없이 실행
			finally {
				if(googoodan >= 2 && googoodan <= 9) {
					System.out.println();
					System.out.println("final");
				}
			}
		}
		
	}

}

📌 기타 방법

  • 예외 처리는 다양한 방법으로 이뤄지며 아래는 간략하게 종류만 작성하였습니다.
  • Try-with-resources : AutoCloseable 인터페이스를 구현한 객체를 자동으로 차단
  • Exception Chaining : 하나의 예외를 다른 예외로 포장
  • Exception Suppression : 특정 예외를 명시적으로 무시
  • 조건문 사용 : 단순 예외 상황 원천 차단
  • 사용자 정의 : 애플리케이션 요구에 맞는 예외를 정의하여 구체적인 예외 처리 가능




이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
<>