πŸ“™ Java

[Java] μ œλ„€λ¦­κ³Ό μ˜ˆμ™Έ 처리

ji_wonna 2022. 9. 16. 18:08

μ œλ„€λ¦­(Generic)

ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•  λ•Œ, νƒ€μž…μ„ ꡬ체적으둜 μ§€μ •ν•˜λŠ” 것이 μ•„λ‹ˆκ³ , 좔후에 μ§€μ •ν•˜λ„λ‘ μΌλ°˜ν™”μ‹œν‚€λŠ” 것을 λ§ν•œλ‹€. (C++의 ν…œν”Œλ¦Ώκ³Ό λ™μΌν•œ λŠλ‚Œμ΄λ‹€!)

 

 

μ œλ„€λ¦­μ΄ μ‚¬μš©λœ 클래슀λ₯Ό μ œλ„€λ¦­ 클래슀라고 ν•˜λ©° νŠΉμ • λ©”μ„œλ“œλ§Œ μ œλ„€λ¦­μœΌλ‘œ μ„ μ–Έν•  경우 μ œλ„€λ¦­ λ©”μ„œλ“œλΌκ³  λΆ€λ₯Έλ‹€.

class GenericEx<T> {
    private T item;

    public GenericEx(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }

    public void setItem(T item) {
        this.item = item;
    }
}

μœ„μ˜ μ½”λ“œμ—μ„œ 클래슀 선언뢀에 <> 내뢀에 μž‘μ„±ν•œ Tλ₯Ό νƒ€μž… λ§€κ°œλ³€μˆ˜λΌκ³  ν•œλ‹€.

클래슀 이름 μ˜†μ— 클래슀 λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  νƒ€μž… 맀개 λ³€μˆ˜λ₯Ό μ„ μ–Έν•΄μ£Όκ³  λ°”λ””μ—μ„œλŠ” Tλ₯Ό μž„μ˜μ˜ νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

λ§Œμ•½ μ—¬λŸ¬ 개의 νƒ€μž… λ§€κ°œλ³€μˆ˜κ°€ ν•„μš”ν•˜λ©΄ <K, V> 이런 μ‹μœΌλ‘œ μ„ μ–Έν•˜λ©΄ λœλ‹€.

 

 

μ œλ„€λ¦­ 클래슀λ₯Ό μ •μ˜ν•  λ•Œ μ£Όμ˜ν•  점은 클래슀 λ³€μˆ˜(ν•„λ“œ λ³€μˆ˜ 쀑 static μ œμ–΄μžκ°€ 뢙은 것)μ—λŠ” νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€λŠ” 것이닀.

μ΄μœ λŠ” κ°„λ‹¨ν•˜λ‹€!

클래슀 λ³€μˆ˜λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•˜λŠ” μ„±μ§ˆμ΄ 있기 λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ 클래슀 λ³€μˆ˜μ˜ νƒ€μž…μ΄ μΈμŠ€ν„΄μŠ€ λ³„λ‘œ λ‹¬λΌμ§ˆ 수 있기 λ•Œλ¬Έμ— κ²°κ΅­ 클래슀 λ³€μˆ˜λ₯Ό 톡해 같은 λ³€μˆ˜λ₯Ό κ³΅μœ ν•˜λŠ” 것이 μ•„λ‹ˆκ²Œ λœλ‹€.

 

 

 

μ œν•œλœ μ œλ„€λ¦­ 클래슀

μ œλ„€λ¦­ ν΄λž˜μŠ€μ—μ„œ μΈμŠ€ν„΄μŠ€ν™” ν•  λ•Œ μ–΄λ–€ νƒ€μž…λ„ μ„ μ–Έ κ°€λŠ₯ν•˜μ§€λ§Œ

μƒμ†λ°›λŠ” μƒμœ„ ν΄λž˜μŠ€κ°€ 생기면 상속받은 클래슀만 νƒ€μž…μœΌλ‘œ 지정할 수 있게 λœλ‹€.

λ§ˆμ°¬κ°€μ§€λ‘œ extends ν‚€μ›Œλ“œλ₯Ό 톡해 μž‘μ„±ν•  수 μžˆλ‹€.

class Drink { ... }
class Beer extends Drink { ... }
class Pasta { ... }

// μ œλ„€λ¦­ 클래슀 μ •μ˜
//class Table<T extends Drink> 
class Table<T> {
    private T item;

    public T getItem() {
        return item;
    }

    public void setItem(T item) {
        this.item = item;
    }
}

public static void main(String[] args) {
        Table<Beer> stella = new Table<>();
        Table<Pasta> rosePasta = new Table<>();//μ½”λ“œ μˆ˜μ •ν•˜λ©΄ μ—λŸ¬
}

μœ„μ˜ μ½”λ“œμ—μ„œ νƒ€μž… λ³€μˆ˜ Tκ°€ Drinkλ₯Ό 상속받도둝 μˆ˜μ •ν•˜λ©΄ Pasta νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” μ„ μ–Έν•  수 μ—†λ‹€.

 

 

 

μ œλ„€λ¦­ λ©”μ„œλ“œ

μ œλ„€λ¦­ λ©”μ„œλ“œμ—μ„œ νƒ€μž… λ§€κ°œλ³€μˆ˜λŠ” λ°˜ν™˜ νƒ€μž… μ•žμ—μ„œ μ„ μ–Έν•΄μ£Όλ©° ν•΄λ‹Ή λ©”μ„œλ“œ μ•ˆμ—μ„œλ§Œ νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

public <T> void add(T element)

λ˜ν•œ, μ œλ„€λ¦­ 클래슀의 νƒ€μž… λ§€κ°œλ³€μˆ˜μ™€ μ œλ„€λ¦­ λ©”μ„œλ“œμ˜ νƒ€μž… λ§€κ°œλ³€μˆ˜λŠ” 같은 이름을 μ‚¬μš©ν•˜λ”λΌλ„ μ„œλ‘œ λ‹€λ₯Έ νƒ€μž… λ§€κ°œλ³€μˆ˜λ‘œ μΈμ‹λœλ‹€.

또 μ œλ„€λ¦­ ν΄λž˜μŠ€μ™€λŠ” λ‹€λ₯΄κ²Œ λ©”μ„œλ“œ νƒ€μž… λ§€κ°œλ³€μˆ˜λŠ” static λ©”μ„œλ“œμ—μ„œλ„ μ„ μ–Έν•  수 μžˆλ‹€.

class Table {
        ...
        static <T> int setPrice(T element) {
                ...
        }
}

 


 

μ—λŸ¬

컴파일 μ—λŸ¬(Compile Time Error)

이름 κ·ΈλŒ€λ‘œ μ»΄νŒŒμΌν•  λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬λ‘œ ν”νžˆ IDEμ—μ„œ λΉ¨κ°„ 쀄이 μƒκΈ°λŠ” μ˜€νƒ€, μ„Έλ―Έμ½œλ‘  μƒλž΅, 잘λͺ»λœ μžλ£Œν˜•μ΄λ‚˜ 포맷을 μž…λ ₯ν–ˆμ„ λ•Œ λ°œμƒν•œλ‹€. λ”°λΌμ„œ μ•„μ£Ό μ‰½κ²Œ μ—λŸ¬λ₯Ό λ°œκ²¬ν•  수 μžˆλ‹€.

 

λŸ°νƒ€μž„ μ—λŸ¬(Run Time Error)

ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬μ΄λ‹€. κ²‰μœΌλ‘œ λ³΄κΈ°μ—λŠ” μ•„λ¬΄λŸ° λ¬Έμ œκ°€ μ—†μ–΄ 보이기 λ•Œλ¬Έμ— λ°œκ²¬ν•˜κΈ°κ°€ μ–΄λ ΅λ‹€. λŸ°νƒ€μž„ μ—λŸ¬λŠ” 주둜 컴퓨터가 μˆ˜ν–‰ν•  수 μ—†λŠ” μž‘μ—…μ„ μš”μ²­ν•  λ•Œ λ°œμƒν•˜λ©° JVM에 μ˜ν•΄ κ°μ§€λœλ‹€.

 

μ˜ˆμ™Έ

μ˜ˆμ™ΈλŠ” 잘λͺ»λœ μ½”λ”©μœΌλ‘œ 인해 λ°œμƒν•˜λŠ” λ―Έμ•½ν•œ μˆ˜μ€€μ˜ 였λ₯˜μ΄κΈ° λ•Œλ¬Έμ— μ½”λ“œλ₯Ό μˆ˜μ •ν•¨μœΌλ‘œμ¨ 수슡이 κ°€λŠ₯ν•˜λ‹€.

μžλ°”μ—μ„œλŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ μ˜ˆμ™Έ ν΄λž˜μŠ€λ‘œλΆ€ν„° 객체λ₯Ό μƒμ„±ν•˜μ—¬ 이λ₯Ό 톡해 μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•œλ‹€.

μ˜ˆμ™Έ ν΄λž˜μŠ€λŠ” 크게 일반 μ˜ˆμ™Έ ν΄λž˜μŠ€μ™€ μ‹€ν–‰ μ˜ˆμ™Έ 클래슀둜 λ‚˜λ‰œλ‹€.

 

일반 μ˜ˆμ™Έ 클래슀 (Exception)

RuntimeException ν΄λž˜μŠ€μ™€ κ·Έ ν•˜μœ„ 클래슀λ₯Ό μ œμ™Έν•œ λͺ¨λ“  Exception ν΄λž˜μŠ€μ™€ ν•˜μœ„ ν΄λž˜μŠ€λ“€μ„ 가리킨닀. ClassNotFoundException(잘λͺ»λœ 클래슀λͺ…)μ΄λ‚˜ DataFormatException(잘λͺ»λœ 데이터 ν˜•μ‹) λ“±μ˜ μ‹€μˆ˜λ‘œ λ°œμƒν•œλ‹€.

 

μ‹€ν–‰ μ˜ˆμ™Έ 클래슀 (Runtime Exception)

RuntimeException ν΄λž˜μŠ€μ™€ κ·Έ ν•˜μœ„ ν΄λž˜μŠ€λ“€μ„ 가리킨닀. 주둜 개발자의 μ‹€μˆ˜λ‘œ λ°œμƒν•˜λŠ” κ²½μš°κ°€ 많으며 문법 μš”μ†Œμ™€ 관련이 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ ClassCastException(ν˜• λ³€ν™˜ 였λ₯˜), ArrayIndexOutOfBoundsException(λ²”μœ„ 벗어남), NullPointerException(nullκ°’ μ°Έμ‘°) 등이 μžˆλ‹€.

 

 

 

처리 방법

try-catch

λ‹€μŒκ³Ό 같이 try-catch문으둜 μ˜ˆμ™Έ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€.

try {
    // μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œλ₯Ό μ‚½μž…
} 
catch (ExceptionType1 e1) {
    // ExceptionType1 μœ ν˜•μ˜ μ˜ˆμ™Έ λ°œμƒ μ‹œ μ‹€ν–‰ν•  μ½”λ“œ
} 
catch (ExceptionType2 e2) {
    // ExceptionType2 μœ ν˜•μ˜ μ˜ˆμ™Έ λ°œμƒ μ‹œ μ‹€ν–‰ν•  μ½”λ“œ
} 
finally {
    // finally λΈ”λŸ­μ€ μ˜΅μ…”λ„(κΌ­ ν¬ν•¨λ˜μ§€ μ•Šμ•„λ„ 됨)
    // μ˜ˆμ™Έ λ°œμƒ 여뢀와 상관없이 항상 μ‹€ν–‰
}

 

 

μ˜ˆμ™Έ μ „κ°€

μ˜ˆμ™Έλ₯Ό ν˜ΈμΆœν•œ 곳으둜 λ‹€μ‹œ λ– λ„˜κΈ°λŠ” 방법이닀.

λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€ 끝에 throws ν‚€μ›Œλ“œμ™€ λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έλ“€μ„ μ‰Όν‘œλ‘œ λ‚˜μ—΄ν•΄μ£Όλ©΄ λœλ‹€.

λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œλͺ…(λ§€κ°œλ³€μˆ˜, ...) throws μ˜ˆμ™Έν΄λž˜μŠ€1, μ˜ˆμ™Έν΄λž˜μŠ€2, ... {
    ...μƒλž΅...
}

 

 

throws와 μœ μ‚¬ν•œ throw ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ˜λ„μ μœΌλ‘œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ μˆ˜λ„ μžˆλ‹€.

public class ExceptionEx {
    public static void main(String[] args) {
        try {
            Exception intendedException = new Exception("μ˜λ„λœ μ˜ˆμ™Έ");
            throw intendedException;
        } catch (Exception e) {
            System.out.println("μ˜ˆμ™Έ λ°œμƒμ‹œν‚€κΈ° 성곡");
        }
    }
    
}

//OutPut
μ˜ˆμ™Έ λ°œμƒμ‹œν‚€κΈ° 성곡