๊ด€๋ฆฌ ๋ฉ”๋‰ด

EdgeSecu

JAVA-๋„คํŠธ์›Œํฌ ์ž์› ์ •๋ฆฌ ๋ณธ๋ฌธ

๊ณต๋ถ€/JAVA

JAVA-๋„คํŠธ์›Œํฌ ์ž์› ์ •๋ฆฌ

Edgemine 2025. 5. 16. 14:09

๐Ÿงฝ ๊ฐœ๋… ์ •๋ฆฌ ๋จผ์ €: AutoCloseable, try-with-resources, finally

1. AutoCloseable์ด๋ž€?

  • ์ž์› ์ •๋ฆฌ ์ž๋™ํ™”๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
  • close()๋ผ๋Š” ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋งŒ ๊ฐ•์ œํ•จ
public interface AutoCloseable {
    void close() throws Exception;
}
  • ์ž๋ฐ”์˜ InputStream, OutputStream, Socket, BufferedReader, Connection, ์ „๋ถ€ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Œ.
  • ๋ชฉ์ ์€ ๋‹จ ํ•˜๋‚˜:
  • "์ด ๊ฐ์ฒด๊ฐ€ ๋๋‚  ๋•Œ ์•Œ์•„์„œ ์ •๋ฆฌ๋˜๊ฒŒ ๋งŒ๋“ค์–ด์ค˜์š”~"

2. try-with-resources๋ž€?

  • AutoCloseable์„ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ try ๋ธ”๋ก ์•ˆ์—์„œ ์„ ์–ธํ•˜๋ฉด
  • try ๋ธ”๋ก์ด ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ close()๊ฐ€ ํ˜ธ์ถœ๋จ
    → ์˜ˆ์™ธ๊ฐ€ ๋‚˜๋“  ๋ง๋“  ๋‹ฅ์น˜๊ณ  closeํ•จ
try (Socket socket = new Socket("localhost", 8080)) {
    // socket ์‚ฌ์šฉ
} // ์—ฌ๊ธฐ์„œ ์ž๋™์œผ๋กœ socket.close() ํ˜ธ์ถœ๋จ

๐Ÿ’ก ์ด๊ฒŒ ์ž๋ฐ” 7์—์„œ ๋„์ž…๋œ ๋ฌธ๋ฒ•์ž„. ์‹ ์„ธ๊ณ„์˜€๋‹ค ์ง„์งœ๋กœ.


3. finally ๋ธ”๋ก์—์„œ ์ˆ˜๋™์œผ๋กœ ๋‹ซ๊ธฐ

์ž๋ฐ” 7 ์ด์ „์—๋Š” ์ „๋ถ€ ์ด๋ ‡๊ฒŒ ํ–ˆ์–ด์•ผ ๋จ. ์Šฌํ””์˜ ์‹œ๋Œ€.

Socket socket = null;
try {
    socket = new Socket("localhost", 8080);
    // ์‚ฌ์šฉ
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (socket != null) {
        try {
            socket.close();
        } catch (IOException e) {
            // ์—๋Ÿฌ ๋ฌด์‹œ
        }
    }
}

๐Ÿ™„ ๋ฒˆ๊ฑฐ๋กญ๊ณ , try ์•ˆ์— ๋˜ try ์žˆ๋Š” ๊ฑธ ๋ณด๋ฉด ๋ˆˆ๋ฌผ์ด ๋‚จ


๐Ÿงช ์ •๋ฆฌ: ์…‹์˜ ๊ด€๊ณ„

  • AutoCloseable = "์ž๋™ ์ •๋ฆฌ ๊ฐ€๋Šฅ" ์Šคํƒฌํ”„. ๋‚ด๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Œ.
  • try-with-resources = "AutoCloseable ๊ตฌํ˜„ ๊ฐ์ฒด๋Š” ์•Œ์•„์„œ ์ •๋ฆฌํ•ด์ค„๊ฒŒ์š”" ๋ผ๋Š” ๋ฌธ๋ฒ•
  • finally = ์ž๋ฐ” 7 ์ด์ „์˜ ์ˆ˜๋™ ๋…ธ๋™. ์ง€๊ธˆ๋„ ํŠน์ • ์ƒํ™ฉ์—์„œ ์“ฐ๊ธด ํ•จ (๋กœ๊ทธ ๋‚จ๊ธธ ๋•Œ ๋“ฑ)

๐Ÿ”ง AutoCloseable ์ง์ ‘ ๊ตฌํ˜„ ์˜ˆ์ œ

public class MyConnection implements AutoCloseable {
    public void connect() {
        System.out.println("์—ฐ๊ฒฐ ์‹œ์ž‘!");
    }

    @Override
    public void close() {
        System.out.println("์ž์› ์ •๋ฆฌ๋จ. ์—ฐ๊ฒฐ ์ข…๋ฃŒ!");
    }
}

์‚ฌ์šฉ ์˜ˆ:

try (MyConnection conn = new MyConnection()) {
    conn.connect();
    // ์ž‘์—… ์ˆ˜ํ–‰
} // ์—ฌ๊ธฐ์„œ ์ž๋™์œผ๋กœ close() ํ˜ธ์ถœ

๐Ÿ“Œ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ํฌ์ธํŠธ:

  • close()๋Š” ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ์Œ (throws Exception)
  • try-with-resources๋Š” ์—ฌ๋Ÿฌ ์ž์› ๋™์‹œ์— ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
try (InputStream in = new FileInputStream("input.txt");
     OutputStream out = new FileOutputStream("output.txt")) {
     // ํŒŒ์ผ ๋ณต์‚ฌ
}

๐Ÿ’€ ๋งˆ๋ฌด๋ฆฌ ํŒ

  • ๋„คํŠธ์›Œํฌ ์ž์› (Socket, ServerSocket ๋“ฑ)์€ ํ•ญ์ƒ ๋‹ซ์•„์•ผ ํ•จ. ์•ˆ ๋‹ซ์œผ๋ฉด ํฌํŠธ ๋จน๊ณ  ์•ˆ ๋†“๋Š”๋‹ค.
  • try-with-resources๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ + ์ž์› ์ •๋ฆฌ ๋™์‹œ์— ํ•ด์ฃผ๋ฏ€๋กœ ๋ฌด์กฐ๊ฑด ์ด ๋ฐฉ์‹ ์ถ”์ฒœ.
  • ๋„ค๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ์ž์›์„ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ทธ๋ƒฅ AutoCloseable ๊ตฌํ˜„ํ•ด๋ฒ„๋ฆฌ๋ฉด ๋จ.