BackEnd๐Ÿงต

2023.05.02 TIL(์—ด๊ฑฐํ˜•, ์˜ˆ์™ธ์ฒ˜๋ฆฌ)

hae02y 2023. 5. 2. 20:53
๋ฐ˜์‘ํ˜•

 

๐Ÿ‘€Today...


 

 

 

โ˜• Today I Leaned


Enum

Enum(์—ด๊ฑฐํ˜•)์€ ์„œ๋กœ ์—ฐ๊ด€๋œ ์ƒ์ˆ˜์˜ ์ง‘ํ•ฉ์ด๋‹ค. ์ƒ์ˆ˜ = ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์„ ์˜๋ฏธํ•˜๊ณ , ์—ด๊ฑฐํ˜•์€ ์ด๋Ÿฌํ•œ ์ƒ์ˆ˜๋“ค์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋‹ค๋ฃฐ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. 

enum Names { JELLY, KEVIN, YOUMIN }  //์ด๋Ÿฐ์‹์œผ๋กœ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉ

public Class Main{...}

enum์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์ˆ˜๋ช…์˜ ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ  ํƒ€์ž…์— ๋Œ€ํ•œ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  switch๋ฌธ์—์„œ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

๋ฆฌํ„ดํƒ€์ž… ๋ฉ”์„œ๋“œ(๋งค๊ฐœ๋ณ€์ˆ˜) ์„ค๋ช…
String name() ์—ด๊ฑฐ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ•˜๋ฉฐ, ๋ฆฌํ„ด๋˜๋Š” ๋ฌธ์ž์—ด์€ ์—ด๊ฑฐํƒ€์ž…์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ ์ƒ์ˆ˜ ์ด๋ฆ„๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
int ordinal() ์—ด๊ฑฐ ๊ฐ์ฒด์˜ ์ˆœ๋ฒˆ(0๋ถ€ํ„ฐ ์‹œ์ž‘)์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
int compareTo(๋น„๊ต๊ฐ’) ์ฃผ์–ด์ง„ ๋งค๊ฐœ ๊ฐ’๊ณผ ๋น„๊ตํ•ด์„œ ์ˆœ๋ฒˆ ์ฐจ์ด๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
์—ด๊ฑฐ ํƒ€์ž… valueOf(String name) ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ์—ด๊ฑฐ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
์—ด๊ฑฐ ๋ฐฐ์—ด values() ๋ชจ๋“  ์—ด๊ฑฐ ๊ฐ์ฒด๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

 

 

์ œ๋„ค๋ฆญ(Generic)

#์ œ๋„ค๋ฆญ ํด๋ž˜์Šค

generic์€ ํƒ€์ž…์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ถ”ํ›„์— ์ง€์ •ํ• ์ˆ˜์žˆ๋„๋ก ์ผ๋ฐ˜ํ™”ํ•ด ๋‘๋Š”๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ž‘์„ฑํ•œ ํด๋ž˜์Šค ๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ ์ฝ”๋“œ๊ฐ€ ํŠน์ • ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ์–ฝ๋งค์ด์ง€ ์•Š๊ฒŒ ํ•ด ๋‘” ๊ฒƒ์ด๋‹ค.

//์ œ๋„ค๋ฆญ ํด๋ž˜์Šค ์ •์˜
class Basket<T> {
	private T item1; // O 
	static  T item2; // X ==> ํด๋ž˜์Šค ๋ณ€์ˆ˜์—๋Š” ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜์—†๋‹ค.
}
//์ œ๋„ค๋ฆญ ํด๋ž˜์Šค ์‚ฌ์šฉ
Basket<String>  basket1 = new Basket<String>("Hello");
Basket<String>  basket1 = new Basket<>("Hello");  //new ๋’ค์—๋Š” ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์ƒ๋žต๊ฐ€๋Šฅ

//์ œ๋„ค๋ฆญ ํด๋ž˜์Šค ๋‹คํ˜•์„ฑ ์ ์šฉ
class Flower { ... }
class Rose extends Flower { ... }
class RosePasta { ... }

class Basket<T> {
    private T item;

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

class Main {
    public static void main(String[] args) {
        Basket<Flower> flowerBasket = new Basket<>();
        flowerBasket.setItem(new Rose());      // ๋‹คํ˜•์„ฑ ์ ์šฉ
        flowerBasket.setItem(new RosePasta()); // ์—๋Ÿฌ
    }
}

์ œ๋„ค๋ฆญ ํด๋ž˜์Šค ์‚ฌ์šฉ์‹œ์— ๊ธฐ๋ณธํƒ€์ž…์„ ์ง€์ •ํ• ์ˆ˜์—†๋‹ค. ์ฆ‰ int, double๋“ฑ์˜ ์›์‹œํƒ€์ž…์„ ์ง€์ •ํ• ๊ฒฝ์šฐ, Integer, Double ๊ฐ™์€ ๋ž˜ํผํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

[wrapperclass] http://www.tcpschool.com/java/java_api_wrapper

 

# ํŠน์ • ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์œผ๋ฉด์„œ ๋™์‹œ์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ์ œํ•œ

class Basket<T extends Flower & Plant> { // &๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    private T item;
		...
}

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ํด๋ž˜์Šค๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค ์•ž์— ์œ„์น˜์‹œ์ผœ์•ผํ•œ๋‹ค.

 

# ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ

generic method๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ํŠน์ • ๋ฉ”์„œ๋“œ๋งŒ ์ œ๋„ค๋ฆญ์œผ๋กœ ์„ ์–ธํ•œ ๊ฒƒ์ด๋‹ค, 

class Basket<T> {                        // 1 : ์—ฌ๊ธฐ์—์„œ ์„ ์–ธํ•œ ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜ T์™€ 
		...
		static <T> void add(T element) { // 2 : ์—ฌ๊ธฐ์—์„œ ์„ ์–ธํ•œ ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜ T๋Š” ์„œ๋กœ ๋‹ค๋ฅด๋‹ค.
				...
		}
}

์œ„ ์˜ˆ์ œ์™€๊ฐ™์ด <T>๋กœ ํƒ€์ž…์ด ์ •์˜๋œ Basket class์™€ add๋ฉ”์„œ๋“œ๋Š” ์•ŒํŒŒ๋ฒณ ๋ฌธ์ž๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ผ๋ฟ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋‹ค. ์ด์œ ๋Š” ํƒ€์ž…์ด ์ง€์ •๋œ๋Š” ์‹œ์ ์ด ๋‹ฌ๋ผ์„œ์ธ๋ฐ, ํด๋ž˜์Šค๋ช… ์˜†์— ์„ ์–ธํ•œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋ ๋•Œ ํƒ€์ž…์ด ์ง€์ •๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ์˜ ํƒ€์ž…์ง€์ •์€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ ๋•Œ ์ด๋ฃจ์–ด ์ง„๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ๋„ ๋ณผ์ˆ˜์žˆ๋“ฏ์ด ํด๋ž˜์Šค ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋‹ฌ๋ฆฌ static๋ฉ”์„œ๋“œ์—์„œ๋„ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

class Basket {
    public <T> void getPrint(T item) {
        System.out.println(item.equals("Kim coding")); // ๊ฐ€๋Šฅ
    }
}

๊ทธ๋ฆฌ๊ณ  ์œ„์™€ ๊ฐ™์ด Objectํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋Š” ๋ถˆ๊ฐ€๋Šฅ)

 

 

์™€์ผ๋“œ ์นด๋“œ

<? extends T>	//์ƒํ•œ์ œํ•œ, T์™€ T๋ฅผ ์ƒ์†๋ฐ›๋Š” ํ•˜์œ„ํด๋ž˜์Šค ํƒ€์ž…๋งŒ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์„์ˆ˜์žˆ๋‹ค.
<? super T>		//ํ•˜ํ•œ์ œํ•œ, T์™€ T์˜ ์ƒ์œ„ ํด๋ž˜์Šค๋งŒ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋„๋กํ•œ๋‹ค.
<?> // <? extends Object> ์™€ ๊ฐ™๋‹ค, ์ฆ‰ ๋ชจ๋“  ํด๋ž˜์Šคํƒ€์ž…์„ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์„์ˆ˜์žˆ๋‹ค.

 

 

์˜ˆ์™ธ์ฒ˜๋ฆฌ

# ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์˜ ๊ณ„์ธต๋„

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

 

public class RuntimeExceptionTest {

    public static void main(String[] args) {

        try {
            System.out.println("[์†Œ๋ฌธ์ž ์•ŒํŒŒ๋ฒณ์„ ๋Œ€๋ฌธ์ž๋กœ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ]");
            printMyName(null); // (1) ์˜ˆ์™ธ ๋ฐœ์ƒ
            printMyName("abc"); // ์ด ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  catch ๋ฌธ์œผ๋กœ ์ด๋™
        } 
        catch (ArithmeticException e) {
            System.out.println("ArithmeticException ๋ฐœ์ƒ!"); // (2) ์ฒซ ๋ฒˆ์งธ catch๋ฌธ
        } 
        catch (NullPointerException e) { // (3) ๋‘ ๋ฒˆ์งธ catch๋ฌธ
            System.out.println("NullPointerException ๋ฐœ์ƒ!"); 
            System.out.println("e.getMessage: " + e.getMessage()); // (4) ์˜ˆ์™ธ ์ •๋ณด๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ• - 1
            System.out.println("e.toString: " + e.toString()); // (4) ์˜ˆ์™ธ ์ •๋ณด๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ• - 2
            e.printStackTrace(); // (4) ์˜ˆ์™ธ ์ •๋ณด๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ• - 3
        } 
        finally {
            System.out.println("[ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ]"); // (5) finally๋ฌธ
        }
    }

    static void printMyName(String str) {
        String upperCaseAlphabet = str.toUpperCase();
        System.out.println(upperCaseAlphabet);
    }
}

// ์ถœ๋ ฅ๊ฐ’
[์†Œ๋ฌธ์ž ์•ŒํŒŒ๋ฒณ์„ ๋Œ€๋ฌธ์ž๋กœ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ]
NullPointerException ๋ฐœ์ƒ!
e.getMessage: null
e.toString: java.lang.NullPointerException
[ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ]
java.lang.NullPointerException
	at RuntimeExceptionTest.printMyName(RuntimeExceptionTest.java:20)
	at RuntimeExceptionTest.main(RuntimeExceptionTest.java:7)
  • try : ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž….    ์ •์ƒ์‹คํ–‰ => finally๋ธ”๋ก    ์˜ˆ์™ธ๋ฐœ์ƒ=>catch๋ธ”๋ก
  • catch : ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ• ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ, ์—ฌ๋Ÿฌ์ข…๋ฅ˜์˜ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌ๊ฐ€๋Šฅ, ํ•˜๋‚˜ ์ด์ƒ ์‚ฌ์šฉ๊ฐ€๋Šฅ
  • finally : ์˜ˆ์™ธ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ์‹คํ–‰, ํ•„์ˆ˜ x

# ์˜ˆ์™ธ ์ „๊ฐ€

์˜ˆ์™ธ๋ฅผ ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ๋– ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ•.

    static void throwException() throws ClassNotFoundException, NullPointerException {
        ...
    }

 

 


 

๋ฐ˜์‘ํ˜•