Java - ์˜ˆ์™ธ

๋ฐ•์ข…ํ˜ธยท2024๋…„ 2์›” 7์ผ
0

Java

๋ชฉ๋ก ๋ณด๊ธฐ
6/8

๐Ÿงฃ ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜, ์˜ˆ์™ธ ํด๋ž˜์Šค์˜ ๊ณ„์ธต๊ตฌ์กฐ

10์›” 15์ผ ์นด์นด์˜ค์— ๋ฌด์Šจ ์ผ์ด

์˜ค๋ฅ˜(error) ์™€ ์˜ˆ์™ธ(exception)์˜ ์ฐจ์ด

์—๋Ÿฌ:ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์— ์˜ํ•ด์„œ ์ˆ˜์Šต๋  ์ˆ˜ ์—†๋Š” ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜
์˜ˆ์™ธ : ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์— ์˜ํ•ด์„œ ์ˆ˜์Šต๋  ์ˆ˜ ์žˆ๋Š” ๋‹ค์†Œ ๋ฏธ์•ฝํ•œ ์˜ค๋ฅ˜

๐Ÿง ์—๋Ÿฌ๋Š” ์–ด์ฉ” ์ˆ˜ ์—†์ง€๋งŒ... ์˜ˆ์™ธ๋Š” ์ฒ˜๋ฆฌํ•ด์•ผํ•จ!

์ปดํ“จํ„ฐ ํ•˜๋“œ์›จ์–ด์˜ ์˜ค์ž‘๋™ ๋˜๋Š” ๊ณ ์žฅ์œผ๋กœ ์ธํ•ด ์‘์šฉํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ์—๋Ÿฌ(error)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๋‹ค๋ณด๋ฉด ์ด๋Ÿฐ ์—๋Ÿฌ ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์„ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์—๋Ÿฌ ์ƒํ™ฉ์—์„œ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ•์ œ ์ข…๋ฃŒ๊ฐ€ ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ์—๋Ÿฌ ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•ด์คŒ์œผ๋กœ์จ ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ ์‹คํ–‰ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์˜ค์ž‘๋™์„ ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ์œ„ํ•œ ์ž๋ฐ”์˜ ๋ฐฐ๋ ค๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜์—๋Š” ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ์„๊นŒ์š”?

  1. ์ปดํŒŒ์ผ ์—๋Ÿฌ
  2. ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ
  3. ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜

์˜ˆ์™ธ๋Š” ์–ธ์ œ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€

์˜ˆ์™ธ์— ๋Œ€ํ•˜์—ฌ ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ์•„๋ณด๊ธฐ ์ „์—, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ์„ ์—ด๊ธฐ ์œ„ํ•œ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ExceptionSample {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("์กด์žฌํ•˜์ง€_์•Š๋Š”_ํŒŒ์ผ"));
		br.readLine();
		br.close();
	}
}

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ์„ ์ฝ์œผ๋ ค ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์›ํ•˜๋Š” ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

java.io.FileNotFoundException


๋˜ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” 0์œผ๋กœ ๋‹ค๋ฅธ ์ˆซ์ž๋ฅผ ๋‚˜๋ˆ„๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ด…๋‹ˆ๋‹ค.

public class DivideExceptionSample {
	public static void main(String[] args) {
		int result = 5 / 0;
	}
}

์ž๋ฐ”์—์„œ๋Š” ์ˆซ์ž๋ฅผ 0์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฐ์ˆ ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค๋Š” ArithmeticException์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ํ•œ๊ฐ€์ง€ ์˜ˆ์‹œ๋ฅผ ๋” ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

public class ArrayExceptionSample {
	public static void main(String[] args) {
		int[] array = {3, 4, 5, 6};
		System.out.println(array[5]);
	}
}

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด array ๋ฐฐ์—ด ํฌ๊ธฐ๊ฐ€ 4๊ฐœ์ธ ์ˆซ์ž๋ฅผ ์„ ์–ธํ–ˆ๋Š”๋ฐ, ์ธ๋ฑ์Šค ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ๋ฌธ์—์„œ 5๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ๋‹น์—ฐํžˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒ ์ฃ . ArrayIndexOutOfBoundsException์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”๋Š” ์ด์™€ ๊ฐ™์ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘๋‹จํ•˜๊ณ  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด ๊ฒฝ์šฐ์— ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค๋ฉด, ํ”„๋กœ๊ทธ๋žจ ์ค‘๋‹จ์—†์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ์กฐ์น˜ํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒ ์ฃ . ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ž๋ฐ”์—์„œ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ ์ด์™€๊ฐ™์€ ๋Œ€์ฒ˜ ๋ฐฉ๋ฒ•์ด ์žˆ๊ฒ ์ฃ !

9.1.2 ์˜ˆ์™ธ ํด๋ž˜์Šค์˜ ๊ณ„์ธต ๊ตฌ์กฐ

์šฐ์„  ์˜ˆ์™ธ ํด๋ž˜์Šค์—๋Š” ๋‘๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์ผ๋ฐ˜ ์˜ˆ์™ธ(Exception), ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์‹คํ–‰ ์˜ˆ์™ธ(Runtime Exception)์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์˜ˆ์™ธ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ฒดํฌ ์˜ˆ์™ธ(Checked Exception) ๋ผ๊ณ ๋„ ํ•˜๋Š”๋ฐ, ์ปดํŒŒ์ผํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ์ง€ ๊ฒ€์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์˜ˆ์™ธ๋Š” ์ปดํŒŒ์ผํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๋Š” ์˜ˆ์™ธ(Unchecked Exception)๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ™•์ธํ•˜๋Š” ์ฐจ์ด์ผ ๋ฟ, ๋‘ ๊ฐ€์ง€ ์˜ˆ์™ธ๋Š” ๋ชจ๋‘ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆผ์œผ๋กœ ์ฐพ์•„๋ณผ๊นŒ์š”?

  • ๋ชจ๋“  ๊ฐ์ฒด์˜ ์ตœ์ƒ์œ„ ๋ถ€๋ชจ๊ฐ€ Object์ด๋“ฏ, ์˜ˆ์™ธ๋„ ์ตœ์ƒ์œ„ ๋ถ€๋ชจ๋Š” Object
  • Throwable : ์ตœ์ƒ์œ„ ์˜ˆ์™ธ.
  • Error : ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์ด๋‚˜ ์‹ฌ๊ฐํ•œ ์‹œ์Šคํ…œ ์˜ค๋ฅ˜๊ฐ™์€ ๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ. ๊ฐœ๋ฐœ์ž๊ฐ€ ์žก์„ ์ˆ˜ ์—†๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.
  • Exception : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒดํฌํ•˜๋Š” checked exception. ๋‹จ RuntimeException์€ ์˜ˆ์™ธ.
  • RuntimeException : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒดํฌํ•˜์ง€ ์•Š๋Š” unchecked exception, ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ

๐Ÿšซ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ try-catch

try-catch๋ฌธ

์•ž์„œ ์‚ดํŽด๋ณธ ์˜ˆ์™ธ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด try-catch๋ฌธ์„ ์‚ฌ์šฉํ•ด๋ด…์‹œ๋‹ค. ๋จผ์ € ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

try {
    <์ˆ˜ํ–‰ํ•  ๋ฌธ์žฅ 1>;
    <์ˆ˜ํ–‰ํ•  ๋ฌธ์žฅ 2>;
    ...
} catch(์˜ˆ์™ธ1) {
    <์ˆ˜ํ–‰ํ•  ๋ฌธ์žฅ A>;
    ...
} catch(์˜ˆ์™ธ2) {
    <์ˆ˜ํ–‰ํ•  ๋ฌธ์žฅ a>;
    ...
}

ํ˜น์€

try {
    <์ˆ˜ํ–‰ํ•  ๋ฌธ์žฅ 1>;
    <์ˆ˜ํ–‰ํ•  ๋ฌธ์žฅ 2>;
    ...
} catch (์˜ˆ์™ธ1 | ์˜ˆ์™ธ2) {  // ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์˜ˆ์™ธ์ผ ๊ฒฝ์šฐ A ์ˆ˜ํ–‰ (๋ฉ€ํ‹ฐ catch)
    <์ˆ˜ํ–‰ํ•  ๋ฌธ์žฅ A>;
    ...
}

์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋‘ ํ˜•ํƒœ์˜ catch๋ฌธ์ด ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ์˜ try๋ฌธ ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ catch ์˜ˆ์™ธ1์ด ์ˆ˜ํ–‰๋œ๋‹ค๋ฉด ๊ทธ ๋‹ค์Œ ์˜ˆ์™ธ2์˜ catch๋ฌธ์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  try๋ฌธ ์•ˆ์˜ ์ˆ˜ํ–‰ํ•  ๋ฌธ์žฅ ์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด catch๋ฌธ ์•ˆ์˜ ๋‚ด์šฉ์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ try๋ฌธ ์ˆ˜ํ–‰ ์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด catch๋ฌธ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

์•ž์—์„œ ๋ดค๋˜ ์˜ค๋ฅ˜๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ณด๊ณ , ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ExceptionSample {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("์กด์žฌํ•˜์ง€_์•Š๋Š”_ํŒŒ์ผ"));
		br.readLine();
		br.close();
	}
}
...
public class ExceptionSample {
	public static void main(String[] args) {
		**try {**
			BufferedReader br = new BufferedReader(new FileReader("์กด์žฌํ•˜์ง€_์•Š๋Š”_ํŒŒ์ผ"));
			br.readLine();
			br.close();
		**} catch (IOException e) {**
			System.out.println("error message: " + e.getMessage());
		**}**
	}
}

์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•œ ํ›„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

error message: ์กด์žฌํ•˜์ง€_์•Š๋Š”_ํŒŒ์ผ (No such file or directory)

try๋ฌธ ์—์„œ FileNotFoundException์ด ๋ฐœ์ƒํ•˜๋ฉด catch ๋ฌธ์˜ ๋‚ด์šฉ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ์ฃ .

๋‹ค๋ฅธ ์˜ˆ์‹œ๋„ try-catch๋ฌธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

0์œผ๋กœ ์ˆซ์ž๋ฅผ ๋‚˜๋ˆด์„ ๋•Œ ArithmeticException์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ, ์ด๊ฒƒ์€ UncheckedException์ด์ฃ . ํ•˜์ง€๋งŒ ๋ชจ๋“  ์—๋Ÿฌ๋Š” ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— try-catch๋ฌธ์œผ๋กœ ๊ฐ์‹ธ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

public class DivideExceptionSample {
	public static void main(String[] args) {
		int result;
		try {
			result = 5 / 0;
		} catch (ArithmeticException e) {
			result = -1;
			System.out.println("์ˆซ์ž๋Š” 0์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
		}
	}
}
์ˆซ์ž๋Š” 0์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด์ „์ฒ˜๋Ÿผ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์—๋Ÿฌ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉด์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์ง€๋งŒ, ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ try-catch ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ์‹œ catch๋ฌธ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. catch๋ฌธ์—์„œ๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ result์— -1์„ ๋Œ€์ž…ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์ค‘ catch๋ฌธ ์ž‘์„ฑ์‹œ ์ฃผ์˜์‚ฌํ•ญ

๊ทธ๋ฆฌ๊ณ  ๋‹ค์ค‘ catch๋ฌธ์„ ์ž‘์„ฑํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์€, ์ƒ์œ„ ์˜ˆ์™ธํด๋ž˜์Šค๊ฐ€ ํ•˜์œ„ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ณด๋‹ค ์•„๋ž˜์ชฝ์— ์œ„์น˜ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ ๊ณ ์ณ๋ด…์‹œ๋‹ค.

try {
	(ArrayIndexOutOfBoundsException ๋ฐœ์ƒ)

	(NumberFormatException ๋ฐœ์ƒ)
} catch(Exception e) {
	์˜ˆ์™ธ์ฒ˜๋ฆฌ1
} catch(ArrayIndexOutOfBoundsException e) {
	์˜ˆ์™ธ์ฒ˜๋ฆฌ2    // ์ปดํŒŒ์ผ ์˜ค๋ฅ˜
}

์ด ์ฝ”๋“œ์—์„œ ArrayIndexOutOfBoundsException ์˜ˆ์™ธ์™€ NumberFormatException ์˜ˆ์™ธ๋Š” ๋ชจ๋‘ Exception์„ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ฒซ๋ฒˆ์งธ catch ๋ธ”๋ก๋งŒ ์„ ํƒ๋˜์–ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‘๋ฒˆ์งธ catch๋ธ”๋ก์€ ์–ด๋–ค ๊ฒฝ์šฐ์—๋ผ๋„ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ผ๋Š”๊ฑฐ์ฃ . ์œ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

try {
	(ArrayIndexOutOfBoundsException ๋ฐœ์ƒ)

	(NumberFormatException ๋ฐœ์ƒ)
} catch(ArrayIndexOutOfBoundsException e) {
	์˜ˆ์™ธ์ฒ˜๋ฆฌ1
} catch(Exception e) {
	์˜ˆ์™ธ์ฒ˜๋ฆฌ2 
}

try ๋ธ”๋ก์—์„œ ArrayIndexOutOfBoundsException์ด ๋ฐœ์ƒํ•˜๋ฉด ์ฒซ๋ฒˆ์งธ catch ๋ธ”๋ก์„ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ๋ฐ–์˜ ๋‹ค๋ฅธ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‘ ๋ฒˆ์งธ catch ๋ธ”๋ก์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

finally

ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ๋„์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ค‘๋‹จ๋˜๊ฑฐ๋‚˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์— ์˜ํ•ด catch ๊ตฌ๋ฌธ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋–ค ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋ฐ˜๋“œ์‹œ ์‹คํ–‰๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ finally ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

public class DivideExceptionSample {
    void finalMessage() {
        System.out.println("๊ทธ๋Ÿผ ์ˆ˜๊ณ ํ•˜์„ธ์š”.");
    }

    public static void main(String[] args) {
        DivideExceptionSample sample = new DivideExceptionSample();
        int result;
        try {
            result = 5 / 0;
            sample.finalMessage();       // ์ด ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
        } catch (ArithmeticException e) {
            result = -1;
            System.out.println("์ˆซ์ž๋Š” 0์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
        } finally {
            sample.finalMessage();    // ์ด๊ณณ์—์„œ๋Š” ์˜ˆ์™ธ์™€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์ˆ˜ํ–‰๋œ๋‹ค.
        }
    }
}

์œ„ ์ฝ”๋“œ์—์„œ finally ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์˜ˆ์ƒ๋˜๋Š” ์ถœ๋ ฅ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ํ•œ๋ฒˆ ๊ณ ๋ฏผํ•ด๋ด…์‹œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์œ„ try๋ฌธ์—์„œ sample.finalMessage(); ๋Š” ์ ˆ๋Œ€๋กœ ์‹คํ–‰๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์™œ๋ƒํ•˜๋ฉด result = 5 / 0;๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ArithmeticException์ด ๋ฐœ์ƒํ•˜์—ฌ catch ๊ตฌ๋ฌธ์œผ๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋„˜์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋งŒ์•ฝ result = 5 / 0; ์ดํ›„์— sample.finalMessage(); ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”์—์„œ๋Š” ์œ„์™€ ๊ฐ™์ด finally๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ˆซ์ž๋Š” 0์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ ์ˆ˜๊ณ ํ•˜์„ธ์š”.

๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ•์กฐํ•˜๋ฉด, finally๋ฌธ์€ try ๋ฌธ์žฅ ์ˆ˜ํ–‰ ์ค‘ ์˜ˆ์™ธ ๋ฐœ์ƒ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด sample.finalMessage(); ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜์–ด โ€œ๊ทธ๋Ÿผ ์ˆ˜๊ณ ํ•˜์„ธ์š”โ€ ๋ผ๋Š” ๋ฌธ์žฅ์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๐Ÿซ  ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ์™€ ์˜ˆ์™ธ๋ฐœ์ƒ

์˜ˆ์™ธ๋ฅผ ์ง์ ‘ ์ •์˜ํ•ด๋ณด๊ณ  ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.
ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ์ž๋ฐ” ํ‘œ์ค€ API์—์„œ ์ œ๊ณตํ•˜๋Š” ์˜ˆ์™ธ ํด๋ž˜์Šค๋งŒ์œผ๋กœ๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์˜ˆ์™ธ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์€ํ–‰ ์—…๋ฌด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž”๊ณ ๋ณด๋‹ค ๋” ๋งŽ์€ ์ถœ๊ธˆ ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์€ ์ž”๊ณ  ๋ถ€์กฑ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž”๊ณ  ๋ถ€์กฑ ์˜ˆ์™ธ๋Š” ์ž๋ฐ” ํ‘œ์ค€ API์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž”๊ณ  ๋ถ€์กฑ ์˜ˆ์™ธ์™€ ๊ฐ™์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋น„์Šค์™€ ๊ด€๋ จ๋œ ์˜ˆ์™ธ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ •์˜ํ•ด์„œ ๋งŒ๋“ค์–ด์•ผํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ํด๋ž˜์Šค ์„ ์–ธ

๊ทธ๋Ÿผ ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์„ ์–ธํ•˜๋Š”์ง€ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

public class XXXException extends **Exception** { 
	public XXXException() { }
	public XXXException(String message) {  super(message);  }
}

or 

public class XXXException extends **RuntimeException** {
	public XXXException() { }
	public XXXException(String message) {  super(message);  }
}

์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ํด๋ž˜์Šค๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒดํฌํ•˜๋Š”(CheckedException) ์ผ๋ฐ˜ ์˜ˆ์™ธ๋กœ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒดํฌํ•˜์ง€ ์•Š๋Š”(UnCheckedException) ์‹คํ–‰ ์˜ˆ์™ธ๋กœ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์˜ˆ์™ธ๋กœ ์„ ์–ธํ•  ๊ฒฝ์šฐ Exception์„ ์ƒ์†ํ•˜๋ฉด ๋˜๊ณ , ์‹คํ–‰ ์˜ˆ์™ธ๋กœ ์„ ์–ธํ•  ๊ฒฝ์šฐ์—๋Š” RuntimeException์„ ์ƒ์†ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ํด๋ž˜์Šค์˜ ๋„ค์ด๋ฐ๋„ Exception์œผ๋กœ ๋๋‚˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ํด๋ž˜์Šค๋„ ํ•„๋“œ, ์ƒ์„ฑ์ž, ๋ฉ”์†Œ๋“œ ์„ ์–ธ๋“ค์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ์ƒ์„ฑ์ž ์„ ์–ธ๋งŒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž๋Š” ๋‘ ๊ฐœ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ๋ฐ,

ํ•˜๋‚˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์ด๊ณ ,

public XXXException() { }

๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ ์›์ธ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด String ํƒ€์ž…์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ์ƒ์„ฑ์ž ์ž…๋‹ˆ๋‹ค.

public XXXException(String message) {  super(message);  }

String ํƒ€์ž…์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ์ƒ์„ฑ์ž๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋ฅผ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค. ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€์˜ ์šฉ๋„๋Š” catch { } ๋ธ”๋ก์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ์—์„œ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด์ฃ .

๐Ÿ˜… ์˜ˆ์™ธ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

์˜ˆ์™ธ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฒ•์„ ์•Œ์•„๋ณด๊ธฐ ์ „์—, ํŠธ๋žœ์žญ์…˜์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.

ํŠธ๋žœ์žญ์…˜์ด๋ž€ ํ•˜๋‚˜์˜ ์ž‘์—… ๋‹จ์œ„๋ฅผ ๋œปํ•˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ์€ํ–‰์—์„œ์˜ โ€˜์†ก๊ธˆโ€™ ํŠธ๋žœ์žญ์…˜์„ ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. โ€˜์†ก๊ธˆโ€™ ํŠธ๋žœ์žญ์…˜์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์†ก๊ธˆ โ€˜์ฒ˜๋ฆฌ์ค‘โ€™ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
  • ์†ก๊ธˆ์ธ ๊ณ„์ขŒ์— ๋ˆ์ด ๋น ์ ธ๋‚˜๊ฐ
  • ์ˆ˜๊ธˆ์ธ ๊ณ„์ขŒ์— ๋ˆ์ด ์ฑ„์›Œ์ง
  • ์†ก๊ธˆ โ€˜์™„๋ฃŒโ€™ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ

์€ํ–‰์—์„œ์˜ ์†ก๊ธˆ ํ”„๋กœ์„ธ์Šค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด 2๊ฐ€์ง€ ๋ชจ๋‘ ์ทจ์†Œํ•˜๊ณ  โ€˜์†ก๊ธˆโ€™ ์ „์˜ ์ƒํƒœ๋กœ ๋˜๋Œ๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋ชจ๋‘ ์ทจ์†Œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์ด ํฌ๊ฒŒ ํ”๋“ค๋ฆฌ๊ฒŒ ๋˜์ฃ . ์ด๋ ‡๊ฒŒ ๋ชจ๋‘ ์ทจ์†Œํ•˜๋Š” ํ–‰์œ„๋ฅผ ๋กค๋ฐฑ(rollback)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด๋ž€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•ด ๋ฐ์ดํ„ฐ๋“ค์˜ ๊ฐ’์ด ์„œ๋กœ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

๋ˆ_์†ก๊ธˆ() {
	์†ก๊ธˆ_์ƒํƒœ๋ณ€๊ฒฝ(์ฒ˜๋ฆฌ์ค‘);
	์†ก๊ธˆ์ธ_๊ณ„์ขŒ_์ถœ๊ธˆ();
	์ˆ˜๊ธˆ์ธ_๊ณ„์ขŒ_์ž…๊ธˆ();
	์†ก๊ธˆ_์ƒํƒœ๋ณ€๊ฒฝ(์™„๋ฃŒ);
}

์†ก๊ธˆ_์ƒํƒœ๋ณ€๊ฒฝ(status) {
	...
}

์†ก๊ธˆ์ธ_๊ณ„์ขŒ_์ถœ๊ธˆ() {
	...
}

์ˆ˜๊ธˆ์ธ_๊ณ„์ขŒ_์ž…๊ธˆ() {
	...
}

๋‹ค์‹œ ์ •๋ฆฌํ•˜์ž๋ฉด, ์€ํ–‰ ์†ก๊ธˆ ํ”„๋กœ์„ธ์Šค์—์„œ ์†ก๊ธˆ ์ƒํƒœ๋ณ€๊ฒฝ, ์†ก๊ธˆ์ธ ๊ณ„์ขŒ ์ถœ๊ธˆ, ์ˆ˜๊ธˆ์ธ ๊ณ„์ขŒ ์ถœ๊ธˆ ์ด๋ผ๋Š” 3๊ฐ€์ง€ ์ž‘์—… ์ค‘ ํ•œ๊ฐ€์ง€๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ๋ชจ๋“  ์ž‘์—…์„ ์ทจ์†Œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฒƒ์ด ์ข‹์„๊นŒ์š”?

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†ก๊ธˆ ์ƒํƒœ๋ณ€๊ฒฝ, ์†ก๊ธˆ์ธ ๊ณ„์ขŒ์ถœ๊ธˆ, ์ˆ˜๊ธˆ์ธ ๊ณ„์ขŒ์ž…๊ธˆ ๋ฉ”์†Œ๋“œ์—์„œ๋Š” ๊ฐ๊ฐ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ณ 

๋ˆ ์†ก๊ธˆ ๋ฉ”์†Œ๋“œ์—์„œ ๋˜์ ธ์ง„ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋’ค ๋ชจ๋‘ ์ทจ์†Œํ•˜๋Š” ๊ฒƒ์ด ์™„๋ฒฝํ•œ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ผ๊ฒ๋‹ˆ๋‹ค.

๋ˆ_์†ก๊ธˆ() {
	**try {**
		์†ก๊ธˆ_์ƒํƒœ๋ณ€๊ฒฝ(์ฒ˜๋ฆฌ์ค‘);
		์†ก๊ธˆ์ธ_๊ณ„์ขŒ_์ถœ๊ธˆ();
		์ˆ˜๊ธˆ์ธ_๊ณ„์ขŒ_์ž…๊ธˆ();
		์†ก๊ธˆ_์ƒํƒœ๋ณ€๊ฒฝ(์™„๋ฃŒ);
	**} catch (์˜ˆ์™ธ) {
		๋ชจ๋‘์ทจ์†Œ();
	}**
}

์†ก๊ธˆ_์ƒํƒœ๋ณ€๊ฒฝ(status) **throws ์˜ˆ์™ธ** {
	...
}

์†ก๊ธˆ์ธ_๊ณ„์ขŒ_์ถœ๊ธˆ() **throws ์˜ˆ์™ธ** {
	...
}

์ˆ˜๊ธˆ์ธ_๊ณ„์ขŒ_์ž…๊ธˆ() **throws ์˜ˆ์™ธ** {
	...
}

์ด์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์†ก๊ธˆ ์ƒํƒœ๋ณ€๊ฒฝ, ์†ก๊ธˆ์ธ ๊ณ„์ขŒ์ถœ๊ธˆ, ์ˆ˜๊ธˆ์ธ ๊ณ„์ขŒ์ž…๊ธˆ ์ž‘์—… ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•  ๊ฒฝ์šฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๊ณ„์ขŒ๊ฐ„ ์†ก๊ธˆ ์ž‘์—…์ด ๋ชจ๋‘ ์ทจ์†Œ๋  ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ์ž๋ฐ”์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์‹ค๋ฌด์—์„œ ์ •๋ง ๋งŽ์ด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋งž๋Š” ๋™์ž‘๊ณผ์ •, ํ๋ฆ„์— ๋”ฐ๋ผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐœ๋ฐœ์ž์˜ ์—ญํ• ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค.

๐Ÿ‘ฝ ์ž๋™ ๋ฆฌ์†Œ์Šค ๋‹ซ๊ธฐ(try-with-resource)

์ž๋ฐ” 7์—์„œ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ try-with-resource๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์‚ฌ์šฉํ–ˆ๋˜ ๋ฆฌ์†Œ์Šค ๊ฐ์ฒด(์ž…์ถœ๋ ฅ, ์ŠคํŠธ๋ฆผ, ์„œ๋ฒ„์†Œ์ผ“, โ€ฆ)์˜ close() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ซ์•„์ค๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฆฌ์†Œ์Šค๋Š” ๋‹ค์–‘ํ•œ ์˜๋ฏธ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๊ฐ์ฒด ๋ผ๊ณ  ์ดํ•ด๋ฅผ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” BufferedReader ๊ฐ์ฒด์™€ ํŒŒ์ผ ๊ฐ์ฒด์ธ FileReader๋Š” ๋ฆฌ์†Œ์Šค ๊ฐ์ฒด๋ผ๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋Š” ์ž๋ฐ”6 ์ด์ „๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ๋˜, ๋ฆฌ์†Œ์Šค ๊ฐ์ฒด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ซ๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TryWithResourceExample {

		public static void main(String[] args) {
					BufferedReader br = null;
	        try {
	            br = new BufferedReader(new FileReader("file.txt"));
	            br.readLine();
	            br.close();
	        } catch (FileNotFoundException e) {
	            // FileNotFoundException ๋ฐœ์ƒ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
	        } catch (IOException e) {
	            // IOException ๋ฐœ์ƒ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
	        } finally {
	            if (br != null) {
	                try {
	                    br.close();
	                } catch (IOException e) {
	                    // ์˜ˆ์™ธ์ฒ˜๋ฆฌ
	                }
	            }
	        }
		}
}

finally ๋ธ”๋ก์—์„œ ๋‹ค์‹œ try-catch๋ฅผ ์—ด๊ณ  ์ตœ์ข…์ ์œผ๋กœ BufferedReader ๋ฆฌ์†Œ์Šค close๋ฅผ ํ•ด์ฃผ์ฃ . close ํ•˜๋Š” ๊ณผ์ •์—์„œ IOException์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— finally ๋ธ”๋ก ์•ˆ์—์„œ๋„ try-catch๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์ด ๋ณต์žกํ•ด๋ณด์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ ์ด๋ถ€๋ถ„์„ ์ž๋ฐ”7์—์„œ ์ถ”๊ฐ€๋œ try-with-resource๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฆฌ์†Œ์Šค close๋ฅผ ํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
	...

} catch (IOException e) {
	// ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

}

์ •๋ง ๊ฐ„๋‹จํ•ด์ง€์ฃ ? ์–ด๋””๋ฅผ ๋ด๋„ close()๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•œ ๊ณณ์ด ์—†์Šต๋‹ˆ๋‹ค.

try ๋ธ”๋ก์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰์„ ์™„๋ฃŒํ–ˆ๊ฑฐ๋‚˜ ํ˜น์€ ์ค‘๊ฐ„์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋˜๋ฉด ์ž๋™์œผ๋กœ BufferedReader์˜ close() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. try {} ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์šฐ์„  close()๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ซ๊ณ , catch ๋ธ”๋ก์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ณต์ˆ˜๊ฐœ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
     BufferedWriter writer = new BufferedWriter(new FileWriter("file2.txt"))) {

} catch (IOException e) {
    // ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

}
try (FileInputStream inputStream = new FileInputStream("file.txt");
     FileOutputStream outputStream = new FileOutputStream("file2.txt")) {
	...

} catch (IOException e) {
	// ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

}

try-with-resource ์‚ฌ์šฉ ์กฐ๊ฑด

์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•œ ์ž๋™ ๋ฆฌ์†Œ์Šค ๋‹ซ๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ๋Š” ํ•„์š”ํ•œ ์กฐ๊ฑด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค ๊ฐ์ฒด๋Š” java.lang.AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. AutoCloseable์—๋Š” close() ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š”๋ฐ try-with-resources๋Š” ๋ฐ”๋กœ ์ด close() ๋ฉ”์†Œ๋“œ๋ฅผ ์ž๋™ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ” API ๋„ํ๋จผํŠธ์—์„œ AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฐพ์•„์„œ โ€œAll Known Implementing Classes:โ€๋ฅผ ๋ณด๋ฉด try-with-resources์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ์–ด๋–ค๊ฒƒ๋“ค์ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Java Platform SE 8

AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค์˜ close() ๋ฉ”์†Œ๋“œ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” FileInputStream ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  TryWithResourceExample ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์ถœ๋ ฅ๊ฒฐ๊ณผ๋ฅผ ํ•œ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”.

public class FileInputStream implements AutoCloseable {
	private String file;

	public FileInputStream(String file) {
		this.file = file;
	}

	public void read() {
		System.out.println(file + " ์„ ์ฝ์Šต๋‹ˆ๋‹ค");
	}

	@Override
	public void close() throws Exception {
		System.out.println(file + "์„ ๋‹ซ์Šต๋‹ˆ๋‹ค");
	}
}
public class TryWithResourceExample {
	
	public static void main(String[] args) {
		try (FileInputStream fileInputStream = new FileInputStream("file.txt")){
			fileInputStream.read();
			throw new Exception();		// ๊ฐ•์ œ์ ์œผ๋กœ ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œํ‚ด
		} catch (Exception e) {
			System.out.println("์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
		}

	}
}

.

.

.

์ถœ๋ ฅ๊ฒฐ๊ณผ

file.txt ์„ ์ฝ์Šต๋‹ˆ๋‹ค
file.txt์„ ๋‹ซ์Šต๋‹ˆ๋‹ค
์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
profile
Studying in Tech University of Korea

0๊ฐœ์˜ ๋Œ“๊ธ€