๐ค ์ด๊ฑด ๋ฌด์กฐ๊ฑด ์คํ์์ผ์ค! 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 ๋ธ๋ก์ "์ข์ ๊ฐ๋ฐ์ ๋๊ธฐ."๋ฅผ ๋ด๊ณ ์ด์๊ฐ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค. ๐
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ vs ์ค๋ฒ๋ผ์ด๋ฉ (0) | 2022.09.28 |
---|---|
[Java] ์๋ฐ์ ํ๋ผ๋ฏธํฐ (0) | 2022.09.27 |
[Java] ๋ด๊ฐ ์์ธ๋ฅผ '๋์ง๋' ๋ฒ (2) | 2022.09.22 |
[Java] ์์ธ๋ฅผ ๋ค๋ฃจ๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ (2) | 2022.09.21 |
[Java] ์์ธ ์ฒ๋ฆฌ์ ์ด์ ์ ์ข ๋ฅ (2) | 2022.09.20 |