JiwonDev

#7 Exception (์˜ˆ์™ธ์ฒ˜๋ฆฌ)

by JiwonDev

์ž๋ฐ”์—์„œ์˜ ์˜ค๋ฅ˜, ์˜ˆ์™ธ

์ž๋ฐ”์—์„œ ์˜ˆ์™ธ, ์˜ค๋ฅ˜๋Š” java.lang.Throwable ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉฐ ๊ตฌํ˜„ํ•˜๋ฉฐ 3๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋‚˜๋‰œ๋‹ค.

  • Error
    ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ ๋ฐ–์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ. ํ”„๋กœ์„ธ์Šค์— ์˜ํ–ฅ, ๋” ์ด์ƒ ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅ
    ๋ณดํ†ต ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ƒ๋จธ์‹  ์ž์ฒด์˜ ๋ฌธ์ œ๋กœ ์•ฑ ์ƒ์—์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Runtime Exception (= unchecked Exception)
    ๋Ÿฐํƒ€์ž„์‹œ์— ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ. ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ํ™•์ธํ•  ์ˆ˜ ์—†์–ด unchecked๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.
  • Checked Exception
    ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ๋“ค.
Exception ์˜ˆ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ ์ด์œ 
ArithmeticException ์ •์ˆ˜๋ฅผ 0์œผ๋กœ ๋‚˜๋ˆŒ๊ฒฝ์šฐ ๋ฐœ์ƒ 
ArrayIndexOutOfBoundsExcetion ๋ฐฐ์—ด์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ index๋ฅผ ์ ‘๊ทผํ•  ์‹œ ๋ฐœ์ƒ
ClassCastExcetion ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ํƒ€์ž…์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ ์‹œ ๋ฐœ์ƒ 
NullPointException  ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐธ์กฐํ• ๋•Œ ๋ฐœ์ƒ 
IllegalArgumentException ์ž˜๋ชป๋œ ์ธ์ž๋ฅผ ์ „๋‹ฌ ํ•  ๋•Œ ๋ฐœ์ƒ 
IOException ์ž…์ถœ๋ ฅ ๋™์ž‘ ์‹คํŒจ ๋˜๋Š” ์ธํ„ฐ๋ŸฝํŠธ ์‹œ ๋ฐœ์ƒ 
OutOfMemoryException  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ ๋ฐœ์ƒ  
NumberFormatException  ๋ฌธ์ž์—ด์ด ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํƒ€์ž…์˜ ์ˆซ์ž๋กœ ๋ณ€ํ™˜์‹œ ๋ฐœ์ƒ 

Exception ์•ˆ์— RuntimeException์™€ CheckedException์ด ์กด์žฌํ•œ๋‹ค.

 


Throwable ํด๋ž˜์Šค

๋ชจ๋“  ์˜ค๋ฅ˜, ์˜ˆ์™ธํด๋ž˜์Šค์˜ ๊ณตํ†ต๋œ ์กฐ์ƒ์ด๋ฉฐ Exception์— ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ๋“ค์„ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

Throwable.getMessage()
์˜ˆ์™ธ ๋ฉ”์‹œ์ง€(์›์ธ)์„ ๊ฐ„๋‹จํ•˜๊ฒŒ String์œผ๋กœ ๋ฐ›๋Š”๋‹ค.

Throwable.toString()
...print(e) ๋ชจ์–‘์œผ๋กœ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, getMessage() ๋ฉ”์†Œ๋“œ๋ณด๋‹ค๋Š” ์•ฝ๊ฐ„ ๋” ์ž์„ธํ•˜๊ฒŒ, ์˜ˆ์™ธ ํด๋ž˜์Šค ์ด๋ฆ„๋„ ๊ฐ™์ด ์ œ๊ณตํ•œ๋‹ค.

Throwable.printStackTrace()
์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ ๋ฉ”์†Œ๋“œ๋“ค์˜ ํ˜ธ์ถœ ๊ด€๊ณ„(์Šคํƒ ํŠธ๋ ˆ์ด์Šค)๋ฅผ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

 

๋””๋ฒ„๊น…์ด๋‚˜ ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋Š” ์„œ๋น„์Šค์˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋…ธ์ถœ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ์— ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๊ทธ ์ด์œ  ๋ง๊ณ ๋„ printStackTrace() ๊ฐ™์€ ์ฝ˜์†” ์ถœ๋ ฅ ์ž‘์—…์€ ์ž์›์„ ๋งŽ์ด ์žก์•„๋จน๋Š” ํ”„๋กœ์„ธ์Šค์ด๊ณ   Therad-Safety ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๋กœ๊ทธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(log4j2, slf4j)๋“ฑ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.

์™œ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š”๊ฑฐ์ฃ ?

๋”๋ณด๊ธฐ
[์›๋ฌธ ๋งํฌ]
์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๊ฐ€ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ž„์œผ๋กœ์„œ ์ƒ๊ธฐ๋Š” ๋ณด์•ˆ ๋ฌธ์ œ๋‚˜ ๋น„์šฉ ๋ฌธ์ œ๋„ ์žˆ๊ฒ ์ง€๋งŒ, ๋‹ค๋ฅธ ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„ , Throwable.printStackTrace() ๋Š” ์Šคํƒ ์ถ”์ ๋‚ด์šฉ์„ System.err ๋ผ๋Š” ํ‘œ์ค€ ์ฝ˜์†”์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์— ์ ์Šต๋‹ˆ๋‹ค. System.err ๋Š” ์ฝ˜์†”์ด ์•„๋‹Œ ๋‹ค๋ฅธ ํŒŒ์ผ์— ๋ฆฌ๋‹ค์ด๋ ‰์…˜(System.setErr() ์‚ฌ์šฉ) ๋  ์ˆ˜ ์žˆ๊ณ  ์ด๋Ÿฐ ๋ฐฉ์‹์˜ ๋กœ๊ทธ๋Š” ์‰ฝ๊ฒŒ ๋ถ„์„ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ Throwable.printStackTrace()๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์•ฑ์—์„œ ๋™์‹œ ํ˜ธ์ถœ ๋  ๋•Œ, ์Šคํƒ ์ถ”์ ์„ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋™์ž‘์€ ์‹œ์Šคํ…œ์— ์žˆ์–ด ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜์™€ Side-Effect๋ฅผ ์•ผ๊ธฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์„œ๋น„์Šค์—์„œ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ๋˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

์ž๋ฐ” 1.4๋ถ€ํ„ฐ ์ œ๊ณต๋œ java.util.logging ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์ง€๋งŒ, ๊ธฐ๋Šฅ์ด ์ข‹์€ ํŽธ์€ ์•„๋‹ˆ๋ผ 1.4 ๋ฒ„์ „ ์ถœ์‹œ ๋‹น์‹œ์—๋„ log4j๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋กœ๊ทธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด log4j2๋‚˜ slf4j ๊ฐ™์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

# ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ์˜ˆ์™ธ ๋ฐœ์ƒ (try, catch, finally, throw)

try, catch ๋ฌธ์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜์žˆ๋‹ค. ๋งŒ์•ฝ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์‹คํ–‰ํ•  ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด finally๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

try{ 
// ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ
// ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฝ”๋“œ ์‹คํ–‰์„ ๋ฉˆ์ถ”๊ณ  catch๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
    
}catch (Exception e){
// ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ ํ–ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•  ์ฝ”๋“œ. Exception ๊ฐ์ฒด๋กœ ์˜ˆ์™ธ๋ฅผ ํ™•์ธํ•œ๋‹ค.
     System.out.println(e); //์˜ค๋ฅ˜ ์ถœ๋ ฅ(๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€)
     
}finally{
//์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์ˆ˜ํ–‰
}

 

์˜ˆ์™ธ๋Š” throw [Exception ๊ฐ์ฒด] ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

public void throwException(int number){
        try{
            if(number>12){ // ์˜ˆ์™ธ ๋ฐœ์ƒ ์ฝ”๋“œ
                throw new Exception("Number is over than 12");
            }
            System.out.println("Number is " + number);
        }catch(Exception e){
            e.printStackTrace();
        }
}

 

๋งŒ์•ฝ catch ๋ฌธ์— ํ•ด๋‹นํ•˜๋Š” ์˜ˆ์™ธ ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋ฉด, ๋ฉ”์„œ๋“œ์— throws ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ ๋ฐ–์œผ๋กœ ๋˜์ ธ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•˜๋ฉฐ, catch ๋ฌธ์„ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ์˜ˆ์™ธ๋ฅผ ๋ฐ–์œผ๋กœ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค.

 public void throwsException(int number) throws Exception{
    // ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”์„œ๋“œ ๋ฐ–(๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ ๋œ ๊ณณ)์œผ๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•œ๋‹ค.
    throw new Exception("Number is over than 12");
}

 

๋ฌผ๋ก  ์ด๋Ÿฐ์‹์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋ฉด ๋ฐ˜๋“œ์‹œ ์ƒ์œ„ ๋ฉ”์„œ๋“œ์—์„œ try-catch๋ฌธ์œผ๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ๋งŒ์•ฝ ๋๊นŒ์ง€ ํ•ด์ฃผ์ง€ ์•Š๊ณ  ์•ฑ์˜ ์ง„์ž…์  (Main)์—์„œ ๊นŒ์ง€ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ฒŒ ๋˜๋ฉด Main ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” JVM์—์„œ ์˜ˆ์™ธ๋ฅผ ์žก์•„(catch) ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.


# ๋‚˜๋งŒ์˜ ์˜ˆ์™ธ ๋งŒ๋“ค๊ธฐ

ํ•„์š”ํ•˜๋‹ค๋ฉด Exception ์ด๋‚˜ RuntimeException์„ ์ƒ์†๋ฐ›์•„ ์ง์ ‘ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“ฌ์œผ๋กœ์„œ ๊ฐ์ฒด ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ค๋ฅ˜์ƒํ™ฉ์„ ๋ณต๊ตฌ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ฃผ๊ณ  ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์ œ ํ•˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค. 

// Divide 0 ์˜ˆ์™ธ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์—ˆ๋‹ค.
class DivideException extends Exception {
    DivideException(){
        super();
    }
    DivideException(String message){
        super(message);
    }
}

class Calculator{
    int left, right;
    public void setOprands(int left, int right){        
        this.left = left;
        this.right = right;
    }
    public void divide() throws DivideException{
        if(this.right == 0){
            throw new DivideException("0์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
        }
        System.out.print(this.left/this.right);
    }
}

// ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” Exception ํด๋ž˜์Šค๋“ค๊ณผ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.
public class CalculatorDemo {
    public static void main(String[] args) {
        Calculator c1 = new Calculator();
        c1.setOprands(10, 0);
        try {
            c1.divide();
        } catch (DivideException e) {
            e.printStackTrace();
        }
    }
}

# Try with Resource ๋ฌธ (์ž์› ํ•ด์ œ) 

Java7๋ถ€ํ„ฐ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์‹œ์Šคํ…œ ์ž์› ํ•ด์ œ(๋ฐ˜ํ™˜)์„ ์‰ฝ๊ฒŒ ํ• ์ˆ˜์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๊ธฐ์กด์˜ try-catch-finally ๊ตฌ๋ฌธ์œผ๋กœ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ž‘ํ•˜๋‹ค๊ฐ€ ๋ฉˆ์ถ˜๊ฒฝ์šฐ, ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ๋™์ž‘ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋‹ค ๋‚˜๋ˆ  ๊ฐ๊ฐ ๋‹ค๋ฅด๊ฒŒ ์ž์› ํ•ด์ œ์ฝ”๋“œ( .close() )๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ๋‹ค๋ฉด, ์ด๋ฅผ JVM์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

public static void main(String args[]) {
	// try (~) ์— ํ•„์š”ํ•œ ์ž์› ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•œ๋‹ค.
    try (
    	 FileInputStream is = new FileInputStream("file.txt");
         BufferedInputStream bis = new BufferedInputStream(is)
    ) {// ์ž์› ์‚ฌ์šฉ
        int data = -1;
        while ((data = bis.read()) != -1) 
            System.out.print((char) data);
            
    } catch (IOException e) {
        // ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ
    } 
    // ์ด๋ ‡๊ฒŒ Try-Resource ๊ตฌ๋ฌธ์„ ์ด์šฉํ•˜๋ฉด Finally๋ฅผ ์ด์šฉํ•ด ์ž์›์„ ํ•ด์ œํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
}

์ฐธ๊ณ ๋กœ Java9 ๋ถ€ํ„ฐ๋Š” Try-with-resoucre๋ฌธ์„ ์ข€ ๋” ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฐ”๋€Œ์—ˆ๋‹ค. ๋ฐ–์—์„œ ์„ ์–ธํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•ด๋„ ๋™์ผํ•˜๊ฒŒ ์ž์›์„ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.

public class Class1 {
    public method1() throws Exception {
      Connection conn = DriverManager.getConnection("...");
      Statement stat = conn.createStatement();
      ResultSet rs = stat.executeQuery("SELECT 1 from dual")

      try (conn; stat; rs) {
          // ...
      } catch (Exception e) {
          // ...
      } 
    }
}

 

๊ทธ๋Ÿฐ๋ฐ ์ž๋ฐ”์—์„œ ์ž์›์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” JVM์ด ์•Œ์•„์„œ ๊ด€๋ฆฌํ•ด์ฃผ๋Š”๊ฑฐ ์•„๋‹ˆ์—ˆ๋‚˜์š”?

๋”๋ณด๊ธฐ

์—ฌ๊ธฐ์—์„œ ์˜๋ฌธ์„ ๋Š๋ผ๋Š” ์‚ฌ๋žŒ๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋ถ„๋ช… ์ž๋ฐ”์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” JVM์˜ Garbage Collector๊ฐ€ ์•Œ์•„์„œ ๊ด€๋ฆฌํ•ด์ค€๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์™œ ๊ตณ์ด .close() ๋ฉ”์„œ๋“œ๋กœ ์ž์›์„ ํ•ด์ œํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

 

์—ฌ๊ธฐ์„œ .close()๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ์ž์›์€ GC์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์ž์›(๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ ์ธ์Šคํ„ด์Šค)์ด ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋žจ์— ์‚ฌ์šฉ๋˜๋Š” ์™ธ๋ถ€ ์ž์›, ์ฆ‰ ์šด์˜์ฒด์ œ์—์„œ ์ œ๊ณตํ•˜๋Š” ์‹œ์Šคํ…œ ์ž์›์„ ์˜๋ฏธํ•œ๋‹ค.

 

์™ธ๋ถ€์ž์›์„ ํŒŒ์ผ๋กœ ์˜ˆ๋ฅผ ๋“ค๋ฉด A.txt ์ถœ๋ ฅ์„ ์œ„ํ•ด์„œ ๋””์Šคํฌ์— ์ €์žฅ๋˜์–ด์žˆ๋Š” A.txt์˜ ๋‚ด์šฉ์„ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š”๋ฐ, ํ•ด๋‹น ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ „๋ถ€ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๋น„ํšจ์œจ์ ์ด๊ณ  ๋ถ€๋‹ด์ด ๋งŽ์€ ์ž‘์—…์ด๋‹ค. ๊ทธ๋ž˜์„œ ํŒŒ์ผ์„ ํ†ต์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž…์ถœ๋ ฅ Stream์„ ์ƒ์„ฑํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜๊ณ  ๊ทธ Stream์„ ์ด์šฉํ•˜์—ฌ ํŒŒ์ผ์˜ ์›ํ•˜๋Š” ๋ถ€๋ถ„์„ ์›ํ•˜๋Š” ๋งŒํผ ์ฝ๊ณ  ์“ฐ๋Š”๋ฐ, ์—ฌ๊ธฐ์—์„œ ์ž…์ถœ๋ ฅ Stream์€ ์šด์˜์ฒด์ œ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ์ž์›(๋ช…๋ น์–ด)์„ ์ด์šฉํ•˜๋ฉฐ ๋งŒ๋“ ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ DB์ปค๋„ฅ์…˜, ๋„คํŠธ์›Œํฌ ์ปค๋„ฅ์…˜, ์“ฐ๋ ˆ๋“œ๋“ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋ณดํ†ต ์ด๋Ÿฌํ•œ Stream ํด๋ž˜์Šค๋“ค์€ ์‚ฌ์šฉ์„ ๋งˆ์น˜๊ณ  ์šด์˜์ฒด์ œ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” .close() ๋ฉ”์„œ๋“œ๊ฐ€ ์ œ๊ณต๋œ๋‹ค. ๋ฌผ๋ก  close๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ JVM์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถ”์ ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๋˜๋„๋ก์ด๋ฉด ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ํ•˜์ง€๋งŒ ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž‘์—…์€ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋งค์šฐ ๊นŒ๋‹ค๋กœ์šด๋ฐ ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Java7๋ถ€ํ„ฐ try (~) ์•ˆ์— ์„ ์–ธ๋œ ๊ฐ์ฒด๋Š” ํ•ด๋‹น ๊ตฌ๋ฌธ์ด ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์ž์›์„ ๋ฐ˜๋‚ฉํ•˜๋„๋ก ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ