Back_End/JAVA

์ž๋ฐ”(JAVA) try-with-resources

10Biliion 2024. 12. 31. 09:30

 

๐Ÿง try-with-resources๋ž€?

Java 7์—์„œ ์ฒ˜์Œ ๋„์ž…๋œ try-with-resources๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๋‹ซ์•„์ฃผ๋Š” ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ „์—๋Š” finally ๋ธ”๋ก์„ ์‚ฌ์šฉํ•ด ์ง์ ‘ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ซ์•„์•ผ ํ–ˆ๋Š”๋ฐ์š”, ์ด ๊ธฐ๋Šฅ ๋•๋ถ„์— ์ฝ”๋“œ๋Š” ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ๋„ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค๋Š” java.lang.AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

try (ResourceType resource = new ResourceType()) {
    // ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…
} catch (Exception e) {
    // ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
}

์˜ˆ์ œ ์ฝ”๋“œ

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

public class TryWithResourcesExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

BufferedReader์™€ FileReader๋ฅผ ์‚ฌ์šฉํ•ด ํŒŒ์ผ์„ ์ฝ๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋Š” ์ž‘์—…์ด ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ ๋‹ซํž™๋‹ˆ๋‹ค.


AutoCloseable vs Closeable

๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์€ ๋‘ ๊ฐ€์ง€ ์ธํ„ฐํŽ˜์ด์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • AutoCloseable: Java 7์—์„œ ๋„์ž…๋œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Closeable: I/O ๊ด€๋ จ ํด๋ž˜์Šค์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, AutoCloseable์˜ ํ•˜์œ„ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

AutoCloseable์˜ close() ๋ฉ”์„œ๋“œ๋Š” Exception์„ ๋˜์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, Closeable์˜ close() ๋ฉ”์„œ๋“œ๋Š” IOException๋งŒ ๋˜์ง‘๋‹ˆ๋‹ค.


์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค ์ฒ˜๋ฆฌ

try-with-resources๋Š” ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์„ธ๋ฏธ์ฝœ๋ก (;)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ

try (
    BufferedReader br = new BufferedReader(new FileReader("example.txt"));
    FileWriter fw = new FileWriter("output.txt")
) {
    String line;
    while ((line = br.readLine()) != null) {
        fw.write(line + "\n");
    }
} catch (IOException e) {
    e.printStackTrace();
}

๊ธฐ์กด ๋ฐฉ์‹๊ณผ ๋น„๊ต

์ „ํ†ต์ ์ธ try-finally ๋ฐฉ์‹

BufferedReader br = null;
try {
    br = new BufferedReader(new FileReader("example.txt"));
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (br != null) {
        try {
            br.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

์ฝ”๋“œ๊ฐ€ ๊ธธ๊ณ  ๋ณต์žกํ•˜์ฃ ? try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์—†์•จ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋ฆฌ์†Œ์Šค ๋‹ซ๊ธฐ ์ˆœ์„œ

๋ฆฌ์†Œ์Šค๋Š” ์„ ์–ธ๋œ ์—ญ์ˆœ์œผ๋กœ ๋‹ซํž™๋‹ˆ๋‹ค.

์˜ˆ์ œ

try (
    ResourceA a = new ResourceA();
    ResourceB b = new ResourceB()
) {
    // ์ž‘์—… ์ˆ˜ํ–‰
}

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ResourceB๊ฐ€ ๋จผ์ € ๋‹ซํžˆ๊ณ , ๊ทธ๋‹ค์Œ ResourceA๊ฐ€ ๋‹ซํž™๋‹ˆ๋‹ค.


์ปค์Šคํ…€ ๋ฆฌ์†Œ์Šค ๋งŒ๋“ค๊ธฐ

์‚ฌ์šฉ์ž ์ •์˜ ํด๋ž˜์Šค๋„ AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ

class CustomResource implements AutoCloseable {
    @Override
    public void close() {
        System.out.println("๋ฆฌ์†Œ์Šค๊ฐ€ ๋‹ซํ˜”์Šต๋‹ˆ๋‹ค.");
    }
}

public class CustomResourceExample {
    public static void main(String[] args) {
        try (CustomResource resource = new CustomResource()) {
            System.out.println("๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.");
        }
    }
}

์ถœ๋ ฅ ๊ฒฐ๊ณผ:

๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.
๋ฆฌ์†Œ์Šค๊ฐ€ ๋‹ซํ˜”์Šต๋‹ˆ๋‹ค.

์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ฐœ์„ 

try-with-resources๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ซ๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ์–ต์ œ(suppression)ํ•˜์—ฌ ์ฃผ์š” ์˜ˆ์™ธ์— ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค. ์–ต์ œ๋œ ์˜ˆ์™ธ๋Š” getSuppressed() ๋ฉ”์„œ๋“œ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ

public class SuppressedExceptionExample {
    public static void main(String[] args) throws Exception {
        try (ResourceA a = new ResourceA()) {
            throw new Exception("์ฃผ์š” ์˜ˆ์™ธ");
        }
    }
}

class ResourceA implements AutoCloseable {
    @Override
    public void close() throws Exception {
        throw new Exception("๋‹ซ๊ธฐ ์˜ˆ์™ธ");
    }
}

try-with-resources์˜ ์žฅ์ 

  1. ์ฝ”๋“œ ๊ฐ„์†Œํ™”: finally ๋ธ”๋ก ์—†์ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ์Œ.
  2. ์•ˆ์ „์„ฑ ํ–ฅ์ƒ: ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๋‹ซ์•„ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€.
  3. ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ: ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ.
  4. ์˜ˆ์™ธ ์–ต์ œ ๊ด€๋ฆฌ: ๋‹ซ๊ธฐ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌ.