Java

[Java] Finally์ ˆ

God Korea 2022. 9. 24. 10:19
728x90

๐Ÿ˜ค ์ด๊ฑด ๋ฌด์กฐ๊ฑด ์‹คํ–‰์‹œ์ผœ์ค˜! finally

 ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” try-catch๋ฌธ๊ณผ ์ž์ฃผ ์“ฐ์ด๋Š” ์นœ๊ตฌ๊ฐ€ ์žˆ๋‹ค. ๋ฐ”๋กœ 'finally'. ํ•œ๊ธ€๋กœ ํ•ด์„ํ•ด๋„ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ์ด ์นœ๊ตฌ๋Š” ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚˜์„œ '๋งˆ์ง€๋ง‰์œผ๋กœ' ํ•ด๋‹น ๋ธ”๋ก ์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ์ค€๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, finally๋Š” ๋ณดํ†ต ์–ด๋–ป๊ฒŒ ์“ฐ์ผ๊นŒ?

๐Ÿ“  finally์˜ ํ™œ์šฉ

 ์šฐ์„ , ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

import java.time.DateTimeException;

public class TestFinally {
    public static void main(String[] args) {
        try {
            int minute = Integer.parseInt(args[0]);
            if (minute < 1 || minute >= 60) {
                throw new DateTimeException("Invalid minute");
            }
//            System.out.println("ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        } catch (DateTimeException e) {
            e.printStackTrace();
//            System.out.println("ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        } finally {
            System.out.println("ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        }
    }
}

 ์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, try์™€ catch ๋ธ”๋ก์— ๊ฐ๊ฐ "ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."๋ผ๋Š” ๋ฌธ์žฅ์„ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ finally ๋ธ”๋ก์— ์ž‘์„ฑํ•˜๋ฉด, try, catch ๋ธ”๋ก ์ค‘ ์–ด๋–ค ๊ฒƒ์ด ์‹คํ–‰๋˜๋”๋ผ๋„ ํ•ด๋‹น ๋ฌธ์žฅ์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค.

๋‹ค์Œ์œผ๋กœ๋Š” ์ž์›์˜ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ์œ ์šฉํ•˜๋‹ค.

import java.time.DateTimeException;
import java.util.Scanner;

public class TestFinally {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        try {
            int minute = Integer.parseInt(sc.nextLine());
            if (minute < 1 || minute >= 60) {
                throw new DateTimeException("Invalid minute");
            }
//            System.out.println("ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        } catch (DateTimeException e) {
            e.printStackTrace();
//            System.out.println("ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        } finally {
            sc.close();
            System.out.println("ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        }
    }
}

 ๊ธฐ์กด ์ฝ”๋“œ์™€ ๋‹ฌ๋ผ์ง„ ์ ์€ minute ๋ณ€์ˆ˜์— ์ž…๋ ฅ๊ฐ’์„ Scanner๋กœ ๋ฐ›์•„์˜จ๋‹ค๋Š” ์ ์ด๋‹ค. Scanner๋ฅผ ํ™œ์šฉํ•  ์‹œ, ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ž‘ํ•˜๋Š” ๋™์•ˆ ํ‚ค๋ณด๋“œ ์ž…๋ ฅ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋„ฃ๊ณ  ์ด ์ž…๋ ฅ๊ฐ’์„ ๋ณด๋‚ด์ฃผ๋Š”๋ฐ, Scanner๋ฅผ ๋‹ซ์•„์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory leak)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋ž˜์„œ try๋‚˜ catch๋ฌธ์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ, ๋ฐ˜๋“œ์‹œ Scanner๋ฅผ ๋‹ซ์•„์ฃผ๋Š” ์˜๋ฏธ์—์„œ finally ๋ธ”๋ก์— sc.close()๋ฅผ ์‹คํ–‰ํ–ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž์›์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, finally๋Š” try-catch ๋ธ”๋ก์˜ ์ฝ”๋“œ๊ฐ€ ๋‹ค ์‹คํ–‰๋˜๋ฉด ๋ฐ”๋กœ ์‹คํ–‰๋˜๋Š”๋ฐ, ServerSocket๊ณผ Thread์™€ ๊ฐ™์€ ๊ฐœ๋…๋“ค์„ ์ด์šฉํ•ด ์„ค๊ณ„ํ•  ๋•Œ๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐ›์•„์„œ ์ž‘์—…ํ•˜๊ธฐ๋„ ์ „์— ์Šค๋ ˆ๋“œ๋ฅผ ๋ฉˆ์ถฐ๋ฒ„๋ฆฐ๋‹ค๋˜์ง€, ์ƒˆ๋กœ์šด Client๊ฐ€ ํ†ต์‹ ํ•˜๋ ค๊ณ  ์ ‘๊ทผํ•˜๋Š”๋ฐ ServerSocket์ด ๋‹ซํ˜€๋ฒ„๋ฆฐ๋‹ค๋˜์ง€ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ž์› ๊ด€๋ฆฌ์™€ ๊ด€๋ จ๋œ ์ž๋ฐ”์˜ ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์ด ํ•˜๋‚˜ ๋” ์กด์žฌํ•œ๋‹ค.

๐Ÿ“ ์ž๋™์œผ๋กœ ์—ด๊ณ  ๋‹ซ์•„์ฃผ๋Š” try-with-resource

 try-catch ๋ธ”๋ก์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ๋งŒ ์ž์›์„ ์—ด๊ณ  ๋‹ซ๋Š” ๊ตฌ๋ฌธ์ด๋‹ค. ์ด ๋ฌธ๋ฒ•์€ ์ž๋ฐ”๋ฅผ ์ ‘ํ•œ์ง€ ์–ผ๋งˆ ์•ˆ ๋œ ๋ถ„๋“ค์€ ๋‹ค์†Œ ์ƒ์†Œํ•  ์ˆ˜ ์žˆ๋‹ค.

import java.time.DateTimeException;
import java.util.Scanner;

public class TestFinally {
    public static void main(String[] args) {
        try (Scanner sc = new Scanner(System.in)) { // try-with-resource ๋ธ”๋ก
            int minute = Integer.parseInt(sc.nextLine());
            if (minute < 1 || minute >= 60) {
                throw new DateTimeException("Invalid minute");
            }
//            System.out.println("ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        } catch (DateTimeException e) {
            e.printStackTrace();
//            System.out.println("ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        } finally {
            System.out.println("ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        }
    }
}

 ์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๊ธฐ์กด์— ๋ฉ”์„œ๋“œ ํ•„๋“œ์— ์„ ์–ธ๋๋˜ Scanner๊ฐ€ ๊ฐ‘์ž๊ธฐ try ์˜†์œผ๋กœ ์ด๋™ํ–ˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ์•„๊นŒ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ try ๋ธ”๋ก์„ ๋งŒ๋‚˜๋ฉด Scanner ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , try๋“ , catch๋“  ๋ธ”๋ก์„ ๋น ์ ธ๋‚˜๊ฐ€๋ฉด Scanner ๊ฐ์ฒด๋ฅผ ํšŒ์ˆ˜ํ•ด๋ฒ„๋ฆฐ๋‹ค. ์•„์ง๊นŒ์ง€๋Š” ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•ด๋ณธ ์ ์ด ํ•œ ๋ฒˆ๋„ ์—†์ง€๋งŒ, ๋‚˜์ค‘์—๋Š” ํ•œ ๋ฒˆ์ฏค ํ™œ์šฉํ•ด๋ณด๊ณ  ์‹ถ์€ ๊ตฌ๋ฌธ์ด๋‹ค.

 ์ด๋ ‡๊ฒŒ ์ž๋ฐ”์˜ ์˜ˆ์™ธ ๊ด€๋ จ๋œ ํฌ์ŠคํŒ…์„ ๋งˆ์นœ๋‹ค. ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ๊ท€์ฐฎ์„ ์ˆœ ์žˆ์ง€๋งŒ, ์˜ˆ์™ธ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์ด ๋‹ฌ๋ผ์ง„๋‹ค. ์ด ๋ง์€ ์ฆ‰์Šจ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ท€์ฐฎ์ง€๋งŒ 30๋ถ„ ๋™์•ˆ ์˜ˆ์™ธ๋ฅผ ๊นŒ๋‹ค๋กญ๊ฒŒ ๊ด€๋ฆฌํ•˜๋ฉด, ์•ž์œผ๋กœ ๋ฐœ์ƒํ•  ๋ฌด์ˆ˜ํ•œ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋งŒ ๋งˆ์นœ๋‹ค. ๋ชจ๋‘ finally ๋ธ”๋ก์— "์ข‹์€ ๊ฐœ๋ฐœ์ž ๋˜๊ธฐ."๋ฅผ ๋‹ด๊ณ  ์‚ด์•„๊ฐ€๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ๐Ÿ˜

728x90