[java] 리소스를 올바르게 닫지 않음으로써 발생하는 메모리 누수 예시는 어떤 것들이 있나요?
  1. 파일 입출력: 파일을 열면, 파일을 닫아야 합니다. 파일을 닫지 않으면 파일 핸들러가 계속해서 메모리를 점유하게 되어 메모리 누수가 발생할 수 있습니다.
FileInputStream fis = null;
try {
    fis = new FileInputStream("file.txt");
    // 파일을 사용하는 로직
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. 데이터베이스 연결: 데이터베이스 연결은 해제되지 않으면 메모리 누수가 발생할 수 있습니다. 데이터베이스 연결을 사용한 후에는 반드시 연결을 닫아야 합니다.
Connection connection = null;
try {
    connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db");
    // 데이터베이스 작업 수행
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  1. 스레드 사용: 스레드를 실행한 후에는 스레드를 종료해야 합니다. 스레드를 종료하지 않으면 해당 스레드의 리소스가 계속해서 점유되어 메모리 누수가 발생할 수 있습니다.
Thread thread = new Thread(() -> {
    // 스레드 작업 수행
});

thread.start();

// 스레드 종료
thread.interrupt();
  1. 그 외 자원 사용: 자원을 사용한 후에는 반드시 자원을 닫아야 메모리 누수를 방지할 수 있습니다. 예를 들어, 네트워크 연결, 소켓, 스트림 등의 자원을 사용한 후에는 반드시 해당 자원을 닫아야 합니다.
Socket socket = null;
try {
    socket = new Socket("localhost", 8080);
    // 네트워크 통신 작업 수행
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (socket != null) {
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

리소스를 사용한 후에는 finally 블록을 사용하여 리소스를 닫는 것이 좋습니다. 이를 통해 예외 발생 시에도 리소스 닫힘을 보장할 수 있습니다.