** ๐Ÿ“Œ1๋‹จ๊ณ„: java.lang ํŒจํ‚ค์ง€๋ž€? **

๐Ÿ“ฆ ํŒจํ‚ค์ง€๋ž€?

์ž๋ฐ”์—์„œ ํŒจํ‚ค์ง€(Package)๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ด€๋ จ๋œ ํด๋ž˜์Šค๋“ค์„ ๋ฌถ์–ด๋‘๋Š” ํด๋” ๊ฐ™์€ ๊ฐœ๋…์ด์—์š”!

์˜ˆ์‹œ: ํด๋” ์•ˆ์— ๋ฌธ์„œ ํŒŒ์ผ๋“ค์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ํŒจํ‚ค์ง€ ์•ˆ์— ํด๋ž˜์Šค๋“ค์ด ๋“ค์–ด ์žˆ์–ด์š”.

๐Ÿ† java.lang ํŒจํ‚ค์ง€


๐ŸŒŸ 2๋‹จ๊ณ„: Object ํด๋ž˜์Šค๋ž€? ๐Ÿ‘‘

๐Ÿ“Œ ๋ชจ๋“  ํด๋ž˜์Šค์˜ ๋ถ€๋ชจ!

๐Ÿซ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

ํ•™๊ต์—์„œ ๋ชจ๋“  ์„ ์ƒ๋‹˜(=ํด๋ž˜์Šค)๋“ค์€ ๊ต์žฅ ์„ ์ƒ๋‹˜(=Object)์˜ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•ด์š”.

์ฆ‰, ๋ชจ๋“  ์ž๋ฐ” ํด๋ž˜์Šค๋Š” Object ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์„ ๋ฌผ๋ ค๋ฐ›์•„์š”.


๐Ÿ›  3๋‹จ๊ณ„: Object ํด๋ž˜์Šค์˜ ์ค‘์š”ํ•œ ๋ฉ”์„œ๋“œ๋“ค

์ž๋ฐ”์˜ ๋ชจ๋“  ํด๋ž˜์Šค๋Š” Object์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์•Œ์•„๋ณผ๊ฒŒ์š”.

๐Ÿ”น 1) equals() ๋ฉ”์„œ๋“œ: ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๊ธฐ

๐Ÿ“Œ ์—ญํ• :

๐Ÿ‘‰ ๋‘ ๊ฐœ์˜ ๊ฐ์ฒด(๋ฌผ๊ฑด)๊ฐ€ ๊ฐ™์€ ๊ฒƒ์ธ์ง€ ๋น„๊ตํ•˜๋Š” ๊ธฐ๋Šฅ!

โŒ ์ž˜๋ชป๋œ ์˜ˆ์ œ:

class Dog {
    String name;

    public Dog(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        Dog dog1 = new Dog("์ดˆ์ฝ”");
        Dog dog2 = new Dog("์ดˆ์ฝ”");

        System.out.println(dog1.equals(dog2)); // false ์ถœ๋ ฅ!
    }
}

๐Ÿ“ ์™œ false์ผ๊นŒ์š”?

equals()๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ์ฒด์˜ ์ฃผ์†Œ(์œ„์น˜)๋ฅผ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์—,

์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ผ์„œ false๊ฐ€ ๋‚˜์™€์š”!

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: equals()๋ฅผ ์žฌ์ •์˜(Override)!

class Dog {
    String name;

    public Dog(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Dog) {
            Dog other = (Dog) obj;
            return this.name.equals(other.name);
        }
        return false;
    }

    public static void main(String[] args) {
        Dog dog1 = new Dog("์ดˆ์ฝ”");
        Dog dog2 = new Dog("์ดˆ์ฝ”");

        System.out.println(dog1.equals(dog2)); // true ์ถœ๋ ฅ!
    }
}

๐Ÿ“ ์ด์ œ true๊ฐ€ ๋‚˜์™€์š”!

์ด๋ฆ„์ด ๊ฐ™์€ ๊ฐ•์•„์ง€๋Š” ๊ฐ™์€ ๊ฐ•์•„์ง€๋ผ๊ณ  ํŒ๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์–ด์š”! ๐Ÿถ๐Ÿถ


๐Ÿ”น 2) hashCode() ๋ฉ”์„œ๋“œ: ๊ฐ™์€ ๋ฌผ๊ฑด์ด๋ฉด ๊ฐ™์€ ๋ฒˆํ˜ธ ์ฃผ๊ธฐ

๐Ÿ“Œ ์—ญํ• :

๐Ÿ‘‰ ๊ฐ์ฒด(๋ฌผ๊ฑด)๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ(ID)๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๊ธฐ๋Šฅ!

๐Ÿ‘‰ equals()๊ฐ€ true๋ผ๋ฉด, hashCode() ๊ฐ’๋„ ๊ฐ™์•„์•ผ ํ•ด์š”!

๐Ÿซ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

ํ•™๊ต์—์„œ ํ•™์ƒ๋งˆ๋‹ค ํ•™๋ฒˆ(๋ฒˆํ˜ธ)์ด ์žˆ์–ด์š”.

๊ฐ™์€ ํ•™์ƒ์ด๋ฉด ํ•™๋ฒˆ๋„ ๊ฐ™์•„์•ผ ํ•ด์š”!

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๊ฐ™์€ ๊ฐ์ฒด๋ผ๋ฉด hashCode() ๊ฐ’๋„ ๊ฐ™์•„์•ผ ํ•ด์š”.

โŒ ์ž˜๋ชป๋œ ์˜ˆ์ œ:

class Dog {
    String name;

    public Dog(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog1 = new Dog("์ดˆ์ฝ”");
        Dog dog2 = new Dog("์ดˆ์ฝ”");

        System.out.println(dog1.hashCode()); // 123456 (์˜ˆ์‹œ)
        System.out.println(dog2.hashCode()); // 654321 (์˜ˆ์‹œ)
    }
}

๐Ÿ“ ๋ฌธ์ œ์ :

dog1๊ณผ dog2๋Š” ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, hashCode() ๊ฐ’์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์–ด์š”!

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ hashCode()๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ด์š”.

โœ… hashCode() ์ˆ˜์ • ํ›„:

class Dog {
    String name;

    public Dog(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Dog) {
            Dog other = (Dog) obj;
            return this.name.equals(other.name);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return name.hashCode(); // ๊ฐ™์€ ์ด๋ฆ„์ด๋ฉด ๊ฐ™์€ hashCode ๋ฐ˜ํ™˜
    }
}

๐Ÿ“ ์ด์ œ dog1๊ณผ dog2์˜ ์ด๋ฆ„์ด ๊ฐ™์œผ๋ฉด hashCode() ๊ฐ’๋„ ๊ฐ™์•„์ ธ์š”! ๐ŸŽ‰

๐Ÿ† 4๋‹จ๊ณ„: ์ •๋ฆฌ ๐Ÿ“

๊ฐœ๋… ์„ค๋ช… ๋น„์œ 
equals() ๋‘ ๊ฐ์ฒด(๋ฌผ๊ฑด)๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ต โ€œ์ด ๊ฐ•์•„์ง€๋ž‘ ์ € ๊ฐ•์•„์ง€๋Š” ๊ฐ™์€ ๊ฐ•์•„์ง€์ธ๊ฐ€?โ€
hashCode() ๊ฐ™์€ ๊ฐ์ฒด๋ฉด ๊ฐ™์€ ๋ฒˆํ˜ธ(ID)๋ฅผ ๋ถ€์—ฌ โ€œ๊ฐ™์€ ํ•™์ƒ์ด๋ฉด ํ•™๋ฒˆ๋„ ๊ฐ™์•„์•ผ ํ•ด!โ€
Object ํด๋ž˜์Šค ๋ชจ๋“  ํด๋ž˜์Šค์˜ ๋ถ€๋ชจ โ€œ๋ชจ๋“  ์„ ์ƒ๋‹˜์ด ๊ต์žฅ ์„ ์ƒ๋‹˜์˜ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•ด!โ€

๐ŸŽฏ 5๋‹จ๊ณ„: ๋ฉด์ ‘์—์„œ ๋ฌผ์–ด๋ณผ ๋งŒํ•œ ์‹ฌํ™” ์งˆ๋ฌธ

1๏ธโƒฃ equals()์™€ ==์˜ ์ฐจ์ด์ ์€?

โœ… ==๋Š” ์ฃผ์†Œ(๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜) ๋น„๊ต

โœ… equals()๋Š” ๋‚ด์šฉ(๊ฐ’) ๋น„๊ต

2๏ธโƒฃ equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋ฉด hashCode()๋„ ๊ฐ™์ด ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š”?

โœ… ๊ฐ™์€ ๊ฐ์ฒด(equals()๊ฐ€ true)๋ผ๋ฉด, ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ(hashCode())๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ด์š”.

โœ… ๊ทธ๋ž˜์•ผ HashSet, HashMap ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ด์š”!


๐ŸŽ‰ 6๋‹จ๊ณ„: toString() ๋ฉ”์„œ๋“œ: ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

๐Ÿ“Œ ์—ญํ• :

๐Ÿ‘‰ ๊ฐ์ฒด๋ฅผ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ธฐ๋Šฅ!

โŒ toString()์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์ง€ ์•Š์œผ๋ฉด?

class Dog {
    String name;

    public Dog(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("์ดˆ์ฝ”");
        System.out.println(dog); // ์ด์ƒํ•œ ์ฝ”๋“œ ์ถœ๋ ฅ๋จ! (์˜ˆ: Dog@15db9742)
    }
}

โœ… toString()์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋ฉด?

class Dog {
    String name;

    public Dog(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "๊ฐ•์•„์ง€ ์ด๋ฆ„: " + name;
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ: "๊ฐ•์•„์ง€ ์ด๋ฆ„: ์ดˆ์ฝ”" ๐ŸŽ‰


๐Ÿš€ 7๋‹จ๊ณ„: clone() ๋ฉ”์„œ๋“œ: ๊ฐ์ฒด ๋ณต์‚ฌํ•˜๊ธฐ

๐Ÿ‘‰ ๊ฐ์ฒด๋ฅผ ๋˜‘๊ฐ™์ด ๋ณต์‚ฌํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์š”.

๐Ÿ‘‰ ๋งˆ์น˜ ๋ณต์‚ฌ๊ธฐ(ํ”„๋ฆฐํ„ฐ)๋กœ ์ฑ…์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”! ๐Ÿ–จ

class Dog implements Cloneable {
    String name;

    public Dog(String name) {
        this.name = name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}


๐ŸŽฏ 8๋‹จ๊ณ„: finalize() ๋ฉ”์„œ๋“œ โ€“ ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ

๐Ÿ“Œ finalize()๋ž€?

๐Ÿ‘‰ ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ(=๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์‚ญ์ œํ•  ๋•Œ) ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ˆ์š”.

๐Ÿซ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

ํ•™๊ต์—์„œ ๋ฐฉ์„ ๋‚˜๊ฐ€๊ธฐ ์ „์— ๋ถˆ์„ ๋„๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”! ๐Ÿ’ก

์ฆ‰, ๊ฐ์ฒด๊ฐ€ ์‚ญ์ œ๋˜๊ธฐ ์ „์— ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•ด์•ผ ํ•  ์ผ์„ ์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ˆ์š”.

โŒ finalize()๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ

class Book {
    String title;

    public Book(String title) {
        this.title = title;
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println(title + " ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋ฉ๋‹ˆ๋‹ค!");
    }
}

public class Main {
    public static void main(String[] args) {
        Book book = new Book("์ž๋ฐ” ๊ธฐ์ดˆ");
        book = null; // ๊ฐ์ฒด๋ฅผ ์—†์•ฐ

        System.gc(); // ๊ฐ•์ œ๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์‹คํ–‰
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

์ž๋ฐ” ๊ธฐ์ดˆ ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋ฉ๋‹ˆ๋‹ค!

โœ… ๊ฐ์ฒด๊ฐ€ ์—†์–ด์งˆ ๋•Œ finalize()๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽ‰


๐Ÿš€ 9๋‹จ๊ณ„: System ํด๋ž˜์Šค โ€“ ์šด์˜์ฒด์ œ(OS)์™€ ๋Œ€ํ™”ํ•˜๋Š” ํด๋ž˜์Šค

๐Ÿ“Œ System ํด๋ž˜์Šค๋ž€?

๐Ÿ‘‰ ์šด์˜์ฒด์ œ(OS)์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํด๋ž˜์Šค์˜ˆ์š”!

๐Ÿซ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

์šฐ๋ฆฌ๊ฐ€ ์Šค๋งˆํŠธํฐ(์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ)์„ ์‚ฌ์šฉํ•  ๋•Œ,

๐Ÿ‘‰ Wi-Fi ์—ฐ๊ฒฐ, ์•Œ๋žŒ ์„ค์ •, ์•ฑ ์ข…๋ฃŒ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋ ค๋ฉด?

โžก ์šด์˜์ฒด์ œ(OS)๊ฐ€ ๋„์™€์ค˜์•ผ ํ•ด์š”!

โžก ์ž๋ฐ”์—์„œ๋Š” ์šด์˜์ฒด์ œ์˜ ๋„์›€์„ ๋ฐ›๋Š” ๋„๊ตฌ๊ฐ€ System ํด๋ž˜์Šค์˜ˆ์š”.


โœ… 9.1 System.exit(0) โ€“ ํ”„๋กœ๊ทธ๋žจ ๊ฐ•์ œ ์ข…๋ฃŒํ•˜๊ธฐ

๐Ÿ“Œ System.exit(0)

๐Ÿ‘‰ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒํ•˜๋Š” ๊ธฐ๋Šฅ!

public class Main {
    public static void main(String[] args) {
        System.out.println("ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘!");

        System.exit(0); // ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ

        System.out.println("์ด ๋ฌธ์žฅ์€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ!");
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘!

โŒ ๋ฌธ์ œ์ :

System.exit(0)์„ ์‹คํ–‰ํ•˜๋ฉด ๊ทธ ๋’ค ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์•„์š”!

๐Ÿ’ก ๊ฒŒ์ž„์—์„œ โ€œ๊ฒŒ์ž„ ์ข…๋ฃŒ ๋ฒ„ํŠผโ€์„ ๋ˆ„๋ฅด๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ๊บผ์ง€๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”! ๐ŸŽฎ


โœ… 9.2 System.currentTimeMillis() โ€“ ํ˜„์žฌ ์‹œ๊ฐ„ ์ธก์ •ํ•˜๊ธฐ

๐Ÿ“Œ System.currentTimeMillis()

๐Ÿ‘‰ ํ˜„์žฌ ์‹œ๊ฐ„์„ 1/1000์ดˆ(๋ฐ€๋ฆฌ์ดˆ) ๋‹จ์œ„๋กœ ์ธก์ •!

public class Main {
    public static void main(String[] args) {
        long start = System.currentTimeMillis(); // ์‹œ์ž‘ ์‹œ๊ฐ„ ์ €์žฅ

        for (int i = 0; i < 1000000; i++) {} // ์‹œ๊ฐ„ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…

        long end = System.currentTimeMillis(); // ๋๋‚œ ์‹œ๊ฐ„ ์ €์žฅ
        System.out.println("์‹คํ–‰ ์‹œ๊ฐ„: " + (end - start) + "ms");
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ (์˜ˆ์‹œ):

์‹คํ–‰ ์‹œ๊ฐ„: 5ms

โœ… ์ด์ œ ํ”„๋กœ๊ทธ๋žจ์ด ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ์‹คํ–‰๋˜๋Š”์ง€ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿš€


โœ… 9.3 System.getProperty() โ€“ ์‹œ์Šคํ…œ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

๐Ÿ“Œ System.getProperty("key")

๐Ÿ‘‰ ๋‚ด ์ปดํ“จํ„ฐ(์šด์˜์ฒด์ œ)์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ!

public class Main {
    public static void main(String[] args) {
        String javaVersion = System.getProperty("java.version");
        System.out.println("ํ˜„์žฌ ์ž๋ฐ” ๋ฒ„์ „: " + javaVersion);
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ (์˜ˆ์‹œ):

ํ˜„์žฌ ์ž๋ฐ” ๋ฒ„์ „: 17.0.1

โœ… ์ด์ œ ๋‚ด ์ปดํ“จํ„ฐ๊ฐ€ ์–ด๋–ค ์ž๋ฐ” ๋ฒ„์ „์„ ์“ฐ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽ‰


โœ… 9.4 System.getenv() โ€“ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ€์ ธ์˜ค๊ธฐ

๐Ÿ“Œ System.getenv("ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ด๋ฆ„")

๐Ÿ‘‰ ์šด์˜์ฒด์ œ(OS)์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฝ๋Š” ๊ธฐ๋Šฅ!

public class Main {
    public static void main(String[] args) {
        String username = System.getenv("USERNAME"); // ์œˆ๋„์šฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜
        System.out.println("ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ด๋ฆ„: " + username);
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ (์˜ˆ์‹œ):

ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ด๋ฆ„: Alice

โœ… ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ–ฅ


๐ŸŽฏ 10๋‹จ๊ณ„: Class ํด๋ž˜์Šค โ€“ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ํด๋ž˜์Šค

๐Ÿ“Œ Class ํด๋ž˜์Šค๋ž€?

๐Ÿ‘‰ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•ด์š”!

๐Ÿซ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

์ž๋ฐ”์—์„œ โ€œํด๋ž˜์Šคโ€๋Š” ์„ค๊ณ„๋„๋ผ๊ณ  ํ–ˆ์ฃ ? ๐Ÿ—

โžก Class ํด๋ž˜์Šค๋Š” ์ด ์„ค๊ณ„๋„๋ฅผ ์ฝ๊ณ  ๋ถ„์„ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•ด์š”!


โœ… 10.1 getClass() โ€“ ๊ฐ์ฒด์˜ ํด๋ž˜์Šค ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

๐Ÿ“Œ Object.getClass()

๐Ÿ‘‰ ๊ฐ์ฒด์˜ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ!

public class Main {
    public static void main(String[] args) {
        String text = "Hello, World!";
        Class<?> clazz = text.getClass(); // text์˜ ํด๋ž˜์Šค ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
        System.out.println("ํด๋ž˜์Šค ์ด๋ฆ„: " + clazz.getName());
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

ํด๋ž˜์Šค ์ด๋ฆ„: java.lang.String

โœ… "Hello, World!"๋Š” String ํƒ€์ž…์ด๋ผ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽ‰


โœ… 10.2 Class.forName() โ€“ ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ํด๋ž˜์Šค ๋กœ๋“œํ•˜๊ธฐ

๐Ÿ“Œ Class.forName("ํด๋ž˜์Šค ์ด๋ฆ„")

๐Ÿ‘‰ ํด๋ž˜์Šค ์ด๋ฆ„(๋ฌธ์ž์—ด)์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ!

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> clazz = Class.forName("java.lang.String");
        System.out.println("ํด๋ž˜์Šค ์ด๋ฆ„: " + clazz.getName());
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

ํด๋ž˜์Šค ์ด๋ฆ„: java.lang.String

โœ… ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ์ž…๋ ฅํ•ด์„œ Class ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽ‰


##


๐ŸŽฏ 11๋‹จ๊ณ„: ๋ฆฌํ”Œ๋ ‰์…˜(Reflection) โ€“ ํด๋ž˜์Šค ์ •๋ณด ๋‹ค๋ฃจ๊ธฐ

๐Ÿ“Œ ๋ฆฌํ”Œ๋ ‰์…˜์ด๋ž€?

๐Ÿ‘‰ ํด๋ž˜์Šค ๋‚ด๋ถ€ ์ •๋ณด๋ฅผ ์ฝ”๋“œ๋กœ ์ฝ๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด์—์š”.

๐Ÿ‘‰ ์‹คํ–‰ ์ค‘์— ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ, ํ•„๋“œ, ์ƒ์„ฑ์ž๋ฅผ ํ™•์ธํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์š”!


๐Ÿซ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

๐Ÿ“š ์ฑ…์˜ ๋ชฉ์ฐจ๋ฅผ ๋ณด๊ณ  ๋‚ด์šฉ ํ™•์ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”!


โœ… 11.1 ํด๋ž˜์Šค ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ (getClass())

๐Ÿ“Œ Object.getClass()

๐Ÿ‘‰ ๊ฐ์ฒด์˜ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ!

public class Main {
    public static void main(String[] args) {
        String text = "Hello, World!";
        Class<?> clazz = text.getClass(); // text์˜ ํด๋ž˜์Šค ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
        System.out.println("ํด๋ž˜์Šค ์ด๋ฆ„: " + clazz.getName());
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

ํด๋ž˜์Šค ์ด๋ฆ„: java.lang.String

โœ… "Hello, World!"๋Š” String ํด๋ž˜์Šค์—์„œ ๋งŒ๋“ค์–ด์กŒ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽ‰


โœ… 11.2 ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ํด๋ž˜์Šค ๋กœ๋“œํ•˜๊ธฐ (Class.forName())

๐Ÿ“Œ Class.forName("ํด๋ž˜์Šค ์ด๋ฆ„")

๐Ÿ‘‰ ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ์ž…๋ ฅํ•ด์„œ Class ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ!

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> clazz = Class.forName("java.util.ArrayList");
        System.out.println("ํด๋ž˜์Šค ์ด๋ฆ„: " + clazz.getName());
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

ํด๋ž˜์Šค ์ด๋ฆ„: java.util.ArrayList

โœ… "java.util.ArrayList"๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ–ˆ์–ด์š”!


โœ… 11.3 ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ

๐Ÿ“Œ getDeclaredMethods()

๐Ÿ‘‰ ํด๋ž˜์Šค ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ!

import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Class.forName("java.lang.String");

        // String ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ ์ถœ๋ ฅ
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("๋ฉ”์„œ๋“œ ์ด๋ฆ„: " + method.getName());
        }
    }
}

๐Ÿ“ ์ถœ๋ ฅ ์˜ˆ์‹œ:

๋ฉ”์„œ๋“œ ์ด๋ฆ„: substring
๋ฉ”์„œ๋“œ ์ด๋ฆ„: indexOf
๋ฉ”์„œ๋“œ ์ด๋ฆ„: length
๋ฉ”์„œ๋“œ ์ด๋ฆ„: equals
...

โœ… "๋ชฉ์ฐจ๋ฅผ ํ™•์ธํ•ด์„œ ์ฑ… ์•ˆ์— ์–ด๋–ค ๋‚ด์šฉ์ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ"๊ณผ ๊ฐ™์•„์š”! ๐Ÿ“–


๐ŸŽฏ 12๋‹จ๊ณ„: String, StringBuffer, StringBuilder โ€“ ๋ฌธ์ž์—ด ๋‹ค๋ฃจ๊ธฐ

๐Ÿ“Œ String ํด๋ž˜์Šค๋ž€?

๐Ÿ‘‰ ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค์˜ˆ์š”.

๐Ÿ‘‰ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š”(๋ถˆ๋ณ€, Immutable) ๊ฐ์ฒด!


โœ… 12.1 String ๊ฐ์ฒด๋Š” ๋ถˆ๋ณ€(Immutable)์ด๋‹ค!

public class Main {
    public static void main(String[] args) {
        String str1 = "Hello";
        str1 = str1 + " World"; // ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง

        System.out.println(str1); // ์ถœ๋ ฅ: Hello World
    }
}

๐Ÿ“ ์™œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์งˆ๊นŒ?

โžก String ๊ฐ์ฒด๋Š” ํ•œ ๋ฒˆ ๋งŒ๋“ค๋ฉด ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด์—์š”!

โžก ๊ธฐ์กด "Hello"๋Š” ์‚ฌ๋ผ์ง€๊ณ , ์ƒˆ๋กœ์šด "Hello World" ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋จ!


โœ… 12.2 StringBuffer์™€ StringBuilder๋Š” ๊ฐ€๋ณ€(Mutable) ๊ฐ์ฒด!

๐Ÿ“Œ StringBuffer์™€ StringBuilder๋Š” ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด์š”!

๐Ÿ“Œ ์ฆ‰, ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ!

โœ… ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

โœ String โ†’ โ€œ์ผํšŒ์šฉ ์ข…์ด์— ๊ธ€์„ ์จ์„œ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒโ€

โœ StringBuffer, StringBuilder โ†’ โ€œํ™”์ดํŠธ๋ณด๋“œ์— ๊ธ€์„ ์“ฐ๊ณ  ์ง€์šธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ!โ€

โœ… 12.3 StringBuffer ์‚ฌ์šฉ ์˜ˆ์ œ

public class Main {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("Hello");
        sb.append(" World");  // ๋ฌธ์ž์—ด ์ถ”๊ฐ€

        System.out.println(sb.toString());  // ์ถœ๋ ฅ: Hello World
    }
}

โœ… ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๊ธฐ์กด ๋ฌธ์ž์—ด์„ ์ˆ˜์ •! ๐ŸŽ‰


โœ… 12.4 StringBuilder ์‚ฌ์šฉ ์˜ˆ์ œ (๋” ๋น ๋ฆ„)

public class Main {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Java");
        sb.append(" Programming");  // ๋ฌธ์ž์—ด ์ถ”๊ฐ€

        System.out.println(sb.toString());  // ์ถœ๋ ฅ: Java Programming
    }
}

โœ… StringBuilder๋Š” StringBuffer๋ณด๋‹ค ์†๋„๊ฐ€ ๋น ๋ฆ„! ๐Ÿš€

โœ… ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด ์•„๋‹ˆ๋ผ๋ฉด StringBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ!


โœ… 12.5 String vs StringBuffer vs StringBuilder ๋น„๊ต ์ •๋ฆฌ

ํด๋ž˜์Šค ํŠน์ง• ์ˆ˜์ • ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ์‚ฌ์šฉ ์ถ”์ฒœ
String ๋ฌธ์ž์—ด ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€ (Immutable) โŒ ๋ฌธ์ž์—ด์ด ์ž์ฃผ ๋ณ€ํ•˜์ง€ ์•Š์„ ๋•Œ
StringBuffer ๋ฌธ์ž์—ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ (Mutable) โœ… ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ
StringBuilder ๋ฌธ์ž์—ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ (Mutable) โœ… ๋‹จ์ผ ์Šค๋ ˆ๋“œ์—์„œ ์†๋„ ๋น ๋ฅด๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๐Ÿš€ 13๋‹จ๊ณ„: Math ํด๋ž˜์Šค โ€“ ์ˆ˜ํ•™ ๊ณ„์‚ฐ ๋„์šฐ๋ฏธ

๐Ÿ“Œ Math ํด๋ž˜์Šค๋Š” ์ž๋ฐ”์—์„œ ์ˆ˜ํ•™ ๊ณ„์‚ฐ์„ ๋„์™€์ฃผ๋Š” ํด๋ž˜์Šค์˜ˆ์š”!

๐Ÿ“Œ Math ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”! (static ๋ฉ”์„œ๋“œ ์ œ๊ณต)


โœ… 13.1 Math ํด๋ž˜์Šค์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

๋ฉ”์„œ๋“œ ์„ค๋ช… ์˜ˆ์ œ
Math.abs(x) ์ ˆ๋Œ“๊ฐ’ ๊ตฌํ•˜๊ธฐ Math.abs(-10) โ†’ 10
Math.pow(x, y) ์ œ๊ณฑ ๊ณ„์‚ฐ Math.pow(2, 3) โ†’ 8
Math.sqrt(x) ์ œ๊ณฑ๊ทผ(โˆš) ๊ณ„์‚ฐ Math.sqrt(16) โ†’ 4
Math.max(x, y) ๋‘ ์ˆซ์ž ์ค‘ ํฐ ๊ฐ’ ์ฐพ๊ธฐ Math.max(10, 20) โ†’ 20
Math.min(x, y) ๋‘ ์ˆซ์ž ์ค‘ ์ž‘์€ ๊ฐ’ ์ฐพ๊ธฐ Math.min(10, 20) โ†’ 10
Math.random() 0.0 ~ 1.0 ์‚ฌ์ด ๋‚œ์ˆ˜(๋žœ๋ค ๊ฐ’) ์ƒ์„ฑ Math.random() โ†’ 0.12345

โœ… 13.2 Math.random()์„ ํ™œ์šฉํ•œ ๋žœ๋ค ์ˆซ์ž ์ƒ์„ฑ

public class Main {
    public static void main(String[] args) {
        int randomNumber = (int) (Math.random() * 100) + 1; // 1~100 ์‚ฌ์ด ๋žœ๋ค ์ˆซ์ž
        System.out.println("๋žœ๋ค ์ˆซ์ž: " + randomNumber);
    }
}

๐Ÿ“ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ˆซ์ž๊ฐ€ ์ถœ๋ ฅ๋จ! ๐ŸŽฒ


###


๐ŸŽฏ 14๋‹จ๊ณ„: Wrapper ํด๋ž˜์Šค โ€“ ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋‹ค๋ฃจ๊ธฐ

๐Ÿ“Œ Wrapper ํด๋ž˜์Šค๋ž€?

๐Ÿ‘‰ ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ(int, double ๋“ฑ)๋ฅผ ๊ฐ์ฒด(Object)๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํด๋ž˜์Šค์˜ˆ์š”!

๐Ÿ‘‰ ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค˜์š”.


๐Ÿซ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

โœ… โ€œ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ(int)๋Š” ํฌ์žฅ๋˜์ง€ ์•Š์€ ์‚ฌํƒ•โ€

โœ… โ€œWrapper ํด๋ž˜์Šค(Integer)๋Š” ํฌ์žฅ๋œ ์‚ฌํƒ•โ€

โœ… ํ•„์š”ํ•  ๋•Œ๋Š” ํฌ์žฅ์„ ๋ฒ—๊ฒจ์„œ(์–ธ๋ฐ•์‹ฑ) ์‚ฌ์šฉํ•˜๊ณ , ๋‹ค์‹œ ํฌ์žฅ(์˜คํ† ๋ฐ•์‹ฑ)ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”!


โœ… 14.1 ๊ธฐ๋ณธํ˜• vs Wrapper ํด๋ž˜์Šค ๋น„๊ต

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ Wrapper ํด๋ž˜์Šค
int Integer
double Double
boolean Boolean
char Character

โœ… 14.2 ์˜คํ† ๋ฐ•์‹ฑ(AutoBoxing)๊ณผ ์–ธ๋ฐ•์‹ฑ(Unboxing)

๐Ÿ“Œ ์˜คํ† ๋ฐ•์‹ฑ: ๊ธฐ๋ณธํ˜• โ†’ ๊ฐ์ฒด ๋ณ€ํ™˜

๐Ÿ“Œ ์–ธ๋ฐ•์‹ฑ: ๊ฐ์ฒด โ†’ ๊ธฐ๋ณธํ˜• ๋ณ€ํ™˜

public class Main {
    public static void main(String[] args) {
        // ์˜คํ† ๋ฐ•์‹ฑ: int โ†’ Integer ๊ฐ์ฒด
        Integer num1 = 10;

        // ์–ธ๋ฐ•์‹ฑ: Integer ๊ฐ์ฒด โ†’ int
        int num2 = num1;

        System.out.println("num1 (Integer ๊ฐ์ฒด): " + num1);
        System.out.println("num2 (int ๊ธฐ๋ณธํ˜•): " + num2);
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

num1 (Integer ๊ฐ์ฒด): 10
num2 (int ๊ธฐ๋ณธํ˜•): 10

โœ… ์ž๋ฐ”์—์„œ๋Š” ์˜คํ† ๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ์ด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋ผ์š”!


โœ… 14.3 Wrapper ํด๋ž˜์Šค์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

๋ฉ”์„œ๋“œ ์„ค๋ช… ์˜ˆ์ œ
Integer.parseInt("123") ๋ฌธ์ž์—ด์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ Integer.parseInt("123") โ†’ 123
Double.parseDouble("3.14") ๋ฌธ์ž์—ด์„ ์‹ค์ˆ˜๋กœ ๋ณ€ํ™˜ Double.parseDouble("3.14") โ†’ 3.14
Integer.valueOf(100) ๊ธฐ๋ณธํ˜•์„ Wrapper ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ Integer.valueOf(100) โ†’ Integer ๊ฐ์ฒด
Character.isDigit('5') ๋ฌธ์ž๊ฐ€ ์ˆซ์ž์ธ์ง€ ํ™•์ธ Character.isDigit('5') โ†’ true

๐ŸŽฏ 15๋‹จ๊ณ„: ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ โ€“ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋„๊ตฌ

๐Ÿ“Œ ์ปฌ๋ ‰์…˜(Collection) ํ”„๋ ˆ์ž„์›Œํฌ๋ž€?

๐Ÿ‘‰ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ!

๐Ÿ‘‰ ArrayList, HashMap, HashSet ๋“ฑ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜๊ฐ€ ์žˆ์–ด์š”.


โœ… 15.1 List (์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ โ€“ ArrayList)

๐Ÿ“Œ List ํŠน์ง•:

โœ… ์ˆœ์„œ(์ธ๋ฑ์Šค)๊ฐ€ ์žˆ์Œ

โœ… ์ค‘๋ณต ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฐ€๋Šฅ

๐Ÿ“Œ ArrayList ์‚ฌ์šฉ ์˜ˆ์ œ

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        list.add("์‚ฌ๊ณผ");
        list.add("๋ฐ”๋‚˜๋‚˜");
        list.add("์˜ค๋ Œ์ง€");

        System.out.println("๊ณผ์ผ ๋ชฉ๋ก: " + list);
        System.out.println("์ฒซ ๋ฒˆ์งธ ๊ณผ์ผ: " + list.get(0));
        System.out.println("๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ: " + list.size());
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

๊ณผ์ผ ๋ชฉ๋ก: [์‚ฌ๊ณผ, ๋ฐ”๋‚˜๋‚˜, ์˜ค๋ Œ์ง€]
์ฒซ ๋ฒˆ์งธ ๊ณผ์ผ: ์‚ฌ๊ณผ
๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ: 3

โœ… ๋ฐฐ์—ด๊ณผ ๋‹ค๋ฅด๊ฒŒ ํฌ๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋Š˜์–ด๋‚˜์š”!


โœ… 15.2 Set (์ค‘๋ณต ์—†๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ โ€“ HashSet)

๐Ÿ“Œ Set ํŠน์ง•:

โœ… ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์Œ

โœ… ์ˆœ์„œ๊ฐ€ ์—†์Œ

๐Ÿ“Œ HashSet ์‚ฌ์šฉ ์˜ˆ์ œ

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();

        set.add("์ถ•๊ตฌ");
        set.add("๋†๊ตฌ");
        set.add("์•ผ๊ตฌ");
        set.add("์ถ•๊ตฌ"); // ์ค‘๋ณต ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€

        System.out.println("์šด๋™ ๋ชฉ๋ก: " + set);
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

์šด๋™ ๋ชฉ๋ก: [์ถ•๊ตฌ, ๋†๊ตฌ, ์•ผ๊ตฌ]

โœ… "์ถ•๊ตฌ"๊ฐ€ ์ค‘๋ณต๋˜์–ด ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜์–ด์š”!


โœ… 15.3 Map (ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ์ €์žฅ โ€“ HashMap)

๐Ÿ“Œ Map ํŠน์ง•:

โœ… ๋ฐ์ดํ„ฐ๋ฅผ ํ‚ค(key)-๊ฐ’(value) ํ˜•ํƒœ๋กœ ์ €์žฅ

โœ… ํ‚ค๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†์Œ

๐Ÿ“Œ HashMap ์‚ฌ์šฉ ์˜ˆ์ œ

import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();

        map.put("์‚ฌ๊ณผ", 1000);
        map.put("๋ฐ”๋‚˜๋‚˜", 1500);
        map.put("์˜ค๋ Œ์ง€", 2000);

        System.out.println("๊ณผ์ผ ๊ฐ€๊ฒฉํ‘œ: " + map);
        System.out.println("์‚ฌ๊ณผ ๊ฐ€๊ฒฉ: " + map.get("์‚ฌ๊ณผ"));
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

๊ณผ์ผ ๊ฐ€๊ฒฉํ‘œ: {์‚ฌ๊ณผ=1000, ๋ฐ”๋‚˜๋‚˜=1500, ์˜ค๋ Œ์ง€=2000}
์‚ฌ๊ณผ ๊ฐ€๊ฒฉ: 1000

โœ… โ€œ์‚ฌ๊ณผโ€๋ผ๋Š” ํ‚ค๋กœ ๊ฐ€๊ฒฉ์„ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์š”!


๐ŸŽฏ 16๋‹จ๊ณ„: ์˜ˆ์™ธ ์ฒ˜๋ฆฌ (Exception Handling) โ€“ ์˜ค๋ฅ˜์— ๋Œ€๋น„ํ•˜๋Š” ๋ฐฉ๋ฒ•

๐Ÿ“Œ ์˜ˆ์™ธ(Exception)๋ž€?

๐Ÿ‘‰ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ์˜ค๋ฅ˜(์—๋Ÿฌ)๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ!

๐Ÿ‘‰ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ‘์ž๊ธฐ ์ข…๋ฃŒ๋˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์–ด์š”!


โœ… 16.1 try-catch ๋ฌธ๋ฒ• (์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ)

๐Ÿ“Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ try ๋ธ”๋ก์— ๋„ฃ๊ณ , ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฉด catch์—์„œ ์ฒ˜๋ฆฌ!

public class Main {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // 0์œผ๋กœ ๋‚˜๋ˆ„๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ!
            System.out.println(result);
        } catch (ArithmeticException e) {
            System.out.println("์˜ˆ์™ธ ๋ฐœ์ƒ: 0์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!");
        }
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

์˜ˆ์™ธ ๋ฐœ์ƒ: 0์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!

โœ… ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ•์ œ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ , ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์–ด์š”!


#


๐ŸŽฏ 17๋‹จ๊ณ„: ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ(Multi-Thread) โ€“ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—… ์ฒ˜๋ฆฌํ•˜๊ธฐ

๐Ÿ“Œ ์Šค๋ ˆ๋“œ(Thread)๋ž€?

๐Ÿ‘‰ ํ”„๋กœ๊ทธ๋žจ์ด ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์˜ˆ์š”.

๐Ÿ‘‰ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์€ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ(Main Thread)๋กœ ์‹คํ–‰๋ผ์š”.

๐Ÿ‘‰ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”!


๐Ÿซ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

โœ… โ€œ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ = ์š”๋ฆฌ์‚ฌ 1๋ช…์ด ์Œ์‹์„ ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค๊ธฐโ€

โœ… โ€œ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ = ์š”๋ฆฌ์‚ฌ ์—ฌ๋Ÿฌ ๋ช…์ด ๋™์‹œ์— ์š”๋ฆฌํ•˜๊ธฐโ€


โœ… 17.1 ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ ์˜ˆ์ œ

๐Ÿ“Œ ํ•œ ๋ฒˆ์— ํ•œ ์ž‘์—…๋งŒ ์‹คํ–‰๋จ!

public class Main {
    public static void main(String[] args) {
        System.out.println("์ž‘์—… 1 ์‹œ์ž‘");
        System.out.println("์ž‘์—… 2 ์‹œ์ž‘");
        System.out.println("์ž‘์—… 3 ์‹œ์ž‘");
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

์ž‘์—… 1 ์‹œ์ž‘
์ž‘์—… 2 ์‹œ์ž‘
์ž‘์—… 3 ์‹œ์ž‘

โœ… ์ž‘์—…์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋ผ์š”!


โœ… 17.2 ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์˜ˆ์ œ (Thread ํด๋ž˜์Šค ์‚ฌ์šฉ)

๐Ÿ“Œ Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰!

class MyThread extends Thread {
    private String name;

    public MyThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(name + " ์ž‘์—… ์ค‘: " + i);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread t1 = new MyThread("์Šค๋ ˆ๋“œ 1");
        MyThread t2 = new MyThread("์Šค๋ ˆ๋“œ 2");

        t1.start();  // ์Šค๋ ˆ๋“œ 1 ์‹คํ–‰
        t2.start();  // ์Šค๋ ˆ๋“œ 2 ์‹คํ–‰
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ(์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ˆœ์„œ ๋žœ๋ค):

์Šค๋ ˆ๋“œ 1 ์ž‘์—… ์ค‘: 0
์Šค๋ ˆ๋“œ 2 ์ž‘์—… ์ค‘: 0
์Šค๋ ˆ๋“œ 1 ์ž‘์—… ์ค‘: 1
์Šค๋ ˆ๋“œ 2 ์ž‘์—… ์ค‘: 1
...

โœ… ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๋™์‹œ์— ์‹คํ–‰๋ผ์š”!


โœ… 17.3 ๋™๊ธฐํ™” ๋ฌธ์ œ์™€ synchronized ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๐Ÿ“Œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋Š” ๋™์‹œ์— ๊ฐ™์€ ์ž์›์„ ์‚ฌ์šฉํ•  ๋•Œ ์ถฉ๋Œ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ“Œ synchronized๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๋ฒˆ์— ํ•œ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ!

class BankAccount {
    private int balance = 1000;

    public synchronized void withdraw(int amount) {
        if (balance >= amount) {
            System.out.println(Thread.currentThread().getName() + " ์ถœ๊ธˆ ์„ฑ๊ณต!");
            balance -= amount;
        } else {
            System.out.println(Thread.currentThread().getName() + " ์ž”์•ก ๋ถ€์กฑ!");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        BankAccount account = new BankAccount();

        Runnable task = () -> {
            for (int i = 0; i < 3; i++) {
                account.withdraw(300);
            }
        };

        Thread t1 = new Thread(task, "์Šค๋ ˆ๋“œ 1");
        Thread t2 = new Thread(task, "์Šค๋ ˆ๋“œ 2");

        t1.start();
        t2.start();
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

์Šค๋ ˆ๋“œ 1 ์ถœ๊ธˆ ์„ฑ๊ณต!
์Šค๋ ˆ๋“œ 2 ์ถœ๊ธˆ ์„ฑ๊ณต!
์Šค๋ ˆ๋“œ 1 ์ถœ๊ธˆ ์„ฑ๊ณต!
์Šค๋ ˆ๋“œ 2 ์ž”์•ก ๋ถ€์กฑ!

โœ… synchronized ๋•๋ถ„์— ์ž”์•ก์ด ์Œ์ˆ˜๊ฐ€ ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”!


๐ŸŽฏ 18๋‹จ๊ณ„: ํŒŒ์ผ ์ž…์ถœ๋ ฅ (I/O) โ€“ ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐฉ๋ฒ•

๐Ÿ“Œ ํŒŒ์ผ ์ž…์ถœ๋ ฅ์ด๋ž€?

๐Ÿ‘‰ ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜, ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์ด์—์š”!

๐Ÿ‘‰ FileReader, FileWriter, BufferedReader, BufferedWriter ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.


โœ… 18.1 ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ (FileWriter)

import java.io.FileWriter;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try (FileWriter writer = new FileWriter("test.txt")) {
            writer.write("Hello, Java!\n");
            writer.write("ํŒŒ์ผ ์ž…์ถœ๋ ฅ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.");
            System.out.println("ํŒŒ์ผ ์ €์žฅ ์™„๋ฃŒ!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ (test.txt ํŒŒ์ผ ์ƒ์„ฑ๋จ)

Hello, Java!
ํŒŒ์ผ ์ž…์ถœ๋ ฅ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

โœ… "test.txt" ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋จ!


โœ… 18.2 ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ (FileReader)

import java.io.FileReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try (FileReader reader = new FileReader("test.txt")) {
            int data;
            while ((data = reader.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ (ํŒŒ์ผ ๋‚ด์šฉ ์ถœ๋ ฅ๋จ)

Hello, Java!
ํŒŒ์ผ ์ž…์ถœ๋ ฅ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

โœ… ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์–ด์š”!


๐ŸŽฏ 19๋‹จ๊ณ„: ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ โ€“ ์ธํ„ฐ๋„ท ํ†ต์‹ ํ•˜๊ธฐ

๐Ÿ“Œ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

๐Ÿ‘‰ ์ž๋ฐ”๋ฅผ ์ด์šฉํ•ด์„œ ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ!

๐Ÿ‘‰ Socket ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”.


โœ… 19.1 ๊ฐ„๋‹จํ•œ ์„œ๋ฒ„ ์˜ˆ์ œ (ServerSocket)

๐Ÿ“Œ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์‘๋‹ต์„ ๋ณด๋ƒ„!

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(5000);
        System.out.println("์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค...");

        Socket socket = serverSocket.accept();
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        out.println("์•ˆ๋…•ํ•˜์„ธ์š”! ์„œ๋ฒ„์—์„œ ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.");

        socket.close();
        serverSocket.close();
    }
}

๐Ÿ“ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ•˜๋ฉด "์•ˆ๋…•ํ•˜์„ธ์š”!" ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ„!


โœ… 19.2 ๊ฐ„๋‹จํ•œ ํด๋ผ์ด์–ธํŠธ ์˜ˆ์ œ (Socket)

๐Ÿ“Œ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์ ‘์†ํ•ด์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์Œ!

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 5000);

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String message = in.readLine();
        System.out.println("์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฉ”์‹œ์ง€: " + message);

        socket.close();
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ (ํด๋ผ์ด์–ธํŠธ ์‹คํ–‰ํ•˜๋ฉด ์„œ๋ฒ„ ๋ฉ”์‹œ์ง€ ๋ฐ›์Œ)

์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฉ”์‹œ์ง€: ์•ˆ๋…•ํ•˜์„ธ์š”! ์„œ๋ฒ„์—์„œ ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.

โœ… ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”!


##


๐ŸŽฏ 20๋‹จ๊ณ„: JDBC (Java Database Connectivity) โ€“ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ

๐Ÿ“Œ JDBC๋ž€?

๐Ÿ‘‰ ์ž๋ฐ”์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB)์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” API!

๐Ÿ‘‰ MySQL, Oracle, PostgreSQL ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์–ด์š”.


โœ… 20.1 JDBC ๊ธฐ๋ณธ ๊ฐœ๋…

๐Ÿ“Œ JDBC๋ฅผ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—… ์ˆœ์„œ

1๏ธโƒฃ JDBC ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋“œ โ†’ Class.forName("๋“œ๋ผ์ด๋ฒ„๋ช…")

2๏ธโƒฃ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ โ†’ DriverManager.getConnection("DB์ฃผ์†Œ")

3๏ธโƒฃ SQL ์‹คํ–‰ โ†’ Statement ๋˜๋Š” PreparedStatement ์‚ฌ์šฉ

4๏ธโƒฃ ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ โ†’ ResultSet ์ด์šฉ

5๏ธโƒฃ ์—ฐ๊ฒฐ ์ข…๋ฃŒ โ†’ close() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ


โœ… 20.2 MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์˜ˆ์ œ

๐Ÿ“Œ MySQL์— ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฝ”๋“œ!

import java.sql.*;

public class JDBCExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydb";
        String user = "root";
        String password = "1234";

        try {
            // 1. JDBC ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋“œ
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println("DB ์—ฐ๊ฒฐ ์„ฑ๊ณต!");

            // 3. SQL ์‹คํ–‰
            String sql = "SELECT * FROM users";
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);

            // 4. ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ
            while (rs.next()) {
                System.out.println("ID: " + rs.getInt("id") + ", ์ด๋ฆ„: " + rs.getString("name"));
            }

            // 5. ์—ฐ๊ฒฐ ์ข…๋ฃŒ
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

๐Ÿ“ ์‹คํ–‰ ๊ฒฐ๊ณผ (์˜ˆ์‹œ)

DB ์—ฐ๊ฒฐ ์„ฑ๊ณต!
ID: 1, ์ด๋ฆ„: ํ™๊ธธ๋™
ID: 2, ์ด๋ฆ„: ๊น€์ฒ ์ˆ˜

โœ… MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด์š”!


โœ… 20.3 ๋ฐ์ดํ„ฐ ์‚ฝ์ž… (INSERT)

String sql = "INSERT INTO users (name, age) VALUES ('์ด์˜ํฌ', 25)";
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql);
stmt.close();

โœ… ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ DB์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”!


๐ŸŽฏ 21๋‹จ๊ณ„: ๋žŒ๋‹ค ํ‘œํ˜„์‹ (Lambda Expression) โ€“ ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ

๐Ÿ“Œ ๋žŒ๋‹ค ํ‘œํ˜„์‹์ด๋ž€?

๐Ÿ‘‰ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹!

๐Ÿ‘‰ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์–ด์š”!

๐Ÿ‘‰ ()->{} ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•ด ํ•จ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.


โœ… 21.1 ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

๐Ÿ“Œ ์ผ๋ฐ˜์ ์ธ ์ต๋ช… ํด๋ž˜์Šค ์‚ฌ์šฉ ๋ฐฉ์‹

interface MyFunction {
    void run();
}

public class Main {
    public static void main(String[] args) {
        MyFunction f = new MyFunction() {
            @Override
            public void run() {
                System.out.println("๊ธฐ์กด ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰!");
            }
        };
        f.run();
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

๊ธฐ์กด ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰!

โœ… ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ ธ์š”!


โœ… 21.2 ๋žŒ๋‹ค ํ‘œํ˜„์‹ ์‚ฌ์šฉ ์˜ˆ์ œ

๐Ÿ“Œ ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์งง์•„์ง!

interface MyFunction {
    void run();
}

public class Main {
    public static void main(String[] args) {
        MyFunction f = () -> System.out.println("๋žŒ๋‹ค ํ‘œํ˜„์‹์œผ๋กœ ์‹คํ–‰!");
        f.run();
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

๋žŒ๋‹ค ํ‘œํ˜„์‹์œผ๋กœ ์‹คํ–‰!

โœ… ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์กŒ์–ด์š”!


โœ… 21.3 ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹

๐Ÿ“Œ ๋žŒ๋‹ค์‹์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์–ด์š”.

interface Calculator {
    int add(int a, int b);
}

public class Main {
    public static void main(String[] args) {
        Calculator calc = (a, b) -> a + b;
        System.out.println("10 + 20 = " + calc.add(10, 20));
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

10 + 20 = 30

โœ… ํ•จ์ˆ˜๋ฅผ ์งง๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์„œ ํŽธ๋ฆฌํ•ด์š”!


๐ŸŽฏ 22๋‹จ๊ณ„: ์ŠคํŠธ๋ฆผ API (Stream API) โ€“ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ฐ„์†Œํ™”

๐Ÿ“Œ ์ŠคํŠธ๋ฆผ(Stream)์ด๋ž€?

๐Ÿ‘‰ ์ปฌ๋ ‰์…˜(List, Set ๋“ฑ)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ!

๐Ÿ‘‰ for๋ฌธ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•  ์ˆ˜ ์žˆ์–ด์š”!


โœ… 22.1 ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ

๐Ÿ“Œ forEach()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต๋ฌธ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์–ด์š”!

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("ํ™๊ธธ๋™", "์ด์˜ํฌ", "๊น€์ฒ ์ˆ˜");

        // ๊ธฐ์กด ๋ฐฉ์‹
        for (String name : names) {
            System.out.println(name);
        }

        // ์ŠคํŠธ๋ฆผ ๋ฐฉ์‹
        names.stream().forEach(System.out::println);
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

ํ™๊ธธ๋™
์ด์˜ํฌ
๊น€์ฒ ์ˆ˜

โœ… ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์กŒ์–ด์š”!


โœ… 22.2 filter()๋กœ ํŠน์ • ์กฐ๊ฑด์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ถœ๋ ฅํ•˜๊ธฐ

๐Ÿ“Œ ๋ฆฌ์ŠคํŠธ์—์„œ ํŠน์ • ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ’๋งŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์–ด์š”.

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

        numbers.stream()
               .filter(n -> n % 2 == 0) // ์ง์ˆ˜๋งŒ ์„ ํƒ
               .forEach(System.out::println);
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

2
4
6

โœ… ์กฐ๊ฑด์„ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”!


โœ… 22.3 map()์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ํ•˜๊ธฐ

๐Ÿ“Œ ๊ฐ ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์š”.

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("hong", "kim", "lee");

        names.stream()
             .map(name -> name.toUpperCase()) // ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜
             .forEach(System.out::println);
    }
}

๐Ÿ“ ์ถœ๋ ฅ ๊ฒฐ๊ณผ:

HONG
KIM
LEE

โœ… ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์ด ๊ฐ„ํŽธํ•ด์š”!


##

๐ŸŽฏ 23๋‹จ๊ณ„: ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP) โ€“ ์ž๋ฐ”์˜ ํ•ต์‹ฌ ๊ฐœ๋…

๐Ÿ“Œ OOP(Object-Oriented Programming)๋ž€?

๐Ÿ‘‰ ๊ฐ์ฒด(ํด๋ž˜์Šค)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹!

๐Ÿ‘‰ ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜๊ณ , ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์Œ!


โœ… 23.1 OOP์˜ 4๋Œ€ ํŠน์ง•

๊ฐœ๋… ์„ค๋ช… ๋น„์œ 
์บก์Аํ™”(Encapsulation) ๋ฐ์ดํ„ฐ๋ฅผ ์ˆจ๊ธฐ๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋„๋ก ๋งŒ๋“ฆ โ€œ์ž๋™์ฐจ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋„ ์šด์ „ํ•  ์ˆ˜ ์žˆ์Œโ€
์ƒ์†(Inheritance) ๊ธฐ์กด ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑ โ€œ๋ถ€๋ชจ์˜ ์žฌ์‚ฐ์„ ์ž์‹์ด ๋ฌผ๋ ค๋ฐ›์Œโ€
๋‹คํ˜•์„ฑ(Polymorphism) ๊ฐ™์€ ์ฝ”๋“œ๋กœ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ โ€œ๋™๋ฌผ ํด๋ž˜์Šค โ†’ ๊ฐœ, ๊ณ ์–‘์ด ๋ชจ๋‘ ํฌํ•จโ€
์ถ”์ƒํ™”(Abstraction) ์ค‘์š”ํ•œ ์ •๋ณด๋งŒ ๋ณด์—ฌ์ฃผ๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์ˆจ๊น€ โ€œ์šด์ „ํ•  ๋•Œ ์—”์ง„ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋Š” ๋ชฐ๋ผ๋„ ๋จโ€

โœ… 23.2 ์บก์Аํ™” ์˜ˆ์ œ (private, getter, setter)

๐Ÿ“Œ private์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  getter/setter๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ฆ

class Person {
    private String name; // ๋ฐ์ดํ„ฐ ์ˆจ๊น€

    public Person(String name) {
        this.name = name;
    }

    public String getName() { // ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ
        return name;
    }

    public void setName(String name) { // ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Person p = new Person("ํ™๊ธธ๋™");
        System.out.println(p.getName()); // ํ™๊ธธ๋™

        p.setName("์ด์˜ํฌ");
        System.out.println(p.getName()); // ์ด์˜ํฌ
    }
}

โœ… ์ง์ ‘ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ , ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์š”!


โœ… 23.3 ์ƒ์† ์˜ˆ์ œ (extends)

๐Ÿ“Œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ฌผ๋ ค๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ!

class Animal {
    void makeSound() {
        System.out.println("๋™๋ฌผ์ด ์†Œ๋ฆฌ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค.");
    }
}

class Dog extends Animal { // Animal ํด๋ž˜์Šค ์ƒ์†
    void makeSound() {
        System.out.println("๋ฉ๋ฉ!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound(); // ๋ฉ๋ฉ!
    }
}

โœ… ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ Dog ํด๋ž˜์Šค์—์„œ makeSound() ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜(Override)ํ•  ์ˆ˜ ์žˆ์–ด์š”!


โœ… 23.4 ๋‹คํ˜•์„ฑ ์˜ˆ์ œ (์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding), ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading))

๐Ÿ“Œ ๊ฐ™์€ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์œผ๋กœ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ!

1๏ธโƒฃ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding) โ€“ ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹์ด ์žฌ์ •์˜

class Parent {
    void show() {
        System.out.println("๋ถ€๋ชจ ํด๋ž˜์Šค");
    }
}

class Child extends Parent {
    @Override
    void show() {
        System.out.println("์ž์‹ ํด๋ž˜์Šค");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent obj = new Child();
        obj.show(); // ์ž์‹ ํด๋ž˜์Šค
    }
}

โœ… ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด์š”!

2๏ธโƒฃ ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading) โ€“ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค๊ธฐ

class MathUtil {
    int add(int a, int b) {
        return a + b;
    }

    int add(int a, int b, int c) {
        return a + b + c;
    }
}

public class Main {
    public static void main(String[] args) {
        MathUtil m = new MathUtil();
        System.out.println(m.add(10, 20)); // 30
        System.out.println(m.add(10, 20, 30)); // 60
    }
}

โœ… ๊ฐ™์€ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ด์š”!


๐ŸŽฏ 24๋‹จ๊ณ„: ๋””์ž์ธ ํŒจํ„ด โ€“ ํšจ์œจ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ๋ฐฉ๋ฒ•

๐Ÿ“Œ ๋””์ž์ธ ํŒจํ„ด์ด๋ž€?

๐Ÿ‘‰ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ๊ตฌ์กฐ!

๐Ÿ‘‰ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ!


โœ… 24.1 ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด(Singleton Pattern)

๐Ÿ“Œ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์„œ ๊ณต์œ ํ•˜๋Š” ํŒจํ„ด

class Singleton {
    private static Singleton instance;

    private Singleton() {} // ์ƒ์„ฑ์ž private

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

public class Main {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();

        System.out.println(s1 == s2); // true (๊ฐ™์€ ๊ฐ์ฒด)
    }
}

โœ… ์–ด๋””์—์„œ ํ˜ธ์ถœํ•˜๋“  Singleton.getInstance()๋ฅผ ํ†ตํ•ด ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜!


๐ŸŽฏ 25๋‹จ๊ณ„: ์Šคํ”„๋ง(Spring) โ€“ ์ž๋ฐ”์˜ ๋Œ€ํ‘œ์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ

๐Ÿ“Œ ์Šคํ”„๋ง(Spring)์ด๋ž€?

๐Ÿ‘‰ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์‰ฝ๊ฒŒ ๋„์™€์ฃผ๋Š” ์ž๋ฐ” ํ”„๋ ˆ์ž„์›Œํฌ!

๐Ÿ‘‰ ๋ณต์žกํ•œ ์„ค์ •์„ ์ž๋™ํ™”ํ•˜๊ณ , ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์คŒ!


โœ… 25.1 ์Šคํ”„๋ง์˜ ์ฃผ์š” ๊ฐœ๋…

๊ฐœ๋… ์„ค๋ช…
DI (์˜์กด์„ฑ ์ฃผ์ž…) ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์™ธ๋ถ€์—์„œ ์ฃผ์ž…
IoC (์ œ์–ด์˜ ์—ญ์ „) ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ์Šคํ”„๋ง์ด ๊ด€๋ฆฌ
AOP (๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ) ๊ณตํ†ต ๊ธฐ๋Šฅ(๋กœ๊ทธ, ๋ณด์•ˆ ๋“ฑ)์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€

โœ… 25.2 ์Šคํ”„๋ง ๋ถ€ํŠธ(Spring Boot)๋กœ ๊ฐ„๋‹จํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๊ธฐ

๐Ÿ“Œ ๊ฐ„๋‹จํ•œ Spring Boot ์›น API ์˜ˆ์ œ

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

@RestController
class HelloController {
    @GetMapping("/")
    public String hello() {
        return "Hello, Spring Boot!";
    }
}

โœ… http://localhost:8080/์— ์ ‘์†ํ•˜๋ฉด "Hello, Spring Boot!"๊ฐ€ ์ถœ๋ ฅ๋จ! ๐Ÿš€


๐Ÿš€ ๋งˆ๋ฌด๋ฆฌ: ์—ฌ๊ธฐ๊นŒ์ง€ ๋ฐฐ์šฐ๋ฉด ์ž๋ฐ” ๋งˆ์Šคํ„ฐ!

โœ… ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ์ฃผ์š” ๊ฐœ๋… ์ •๋ฆฌ!

1๏ธโƒฃ ๊ธฐ๋ณธ ๋ฌธ๋ฒ• & ๋ฐ์ดํ„ฐ ํƒ€์ž…

2๏ธโƒฃ ํด๋ž˜์Šค & ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)

3๏ธโƒฃ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ (List, Set, Map)

4๏ธโƒฃ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ & ํŒŒ์ผ ์ž…์ถœ๋ ฅ (I/O)

5๏ธโƒฃ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ & ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

6๏ธโƒฃ JDBC (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™)

7๏ธโƒฃ ๋žŒ๋‹ค ํ‘œํ˜„์‹ & ์ŠคํŠธ๋ฆผ API

8๏ธโƒฃ ๋””์ž์ธ ํŒจํ„ด & ์Šคํ”„๋ง(Spring) ํ”„๋ ˆ์ž„์›Œํฌ

์ด์ œ ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๋ฉด์„œ ์ž๋ฐ” ์‹ค๋ ฅ์„ ํ‚ค์šฐ๋ฉด ๋ผ์š”! ๐Ÿš€

๊ถ๊ธˆํ•œ ์  ์žˆ์œผ๋ฉด ์–ธ์ œ๋“ ์ง€ ์งˆ๋ฌธํ•ด ์ฃผ์„ธ์š”! ๐Ÿ˜Š๐Ÿ”ฅ

๐ŸŽฏ 26๋‹จ๊ณ„: ์‹ค์ „ ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ โ€“ ์ž๋ฐ” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๊ธฐ

โœ… 26.1 ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ ๊ตฌ์กฐ

๐Ÿ“Œ ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ

๐Ÿ“ myproject
 โ”ฃ ๐Ÿ“ src
 โ”ƒ โ”ฃ ๐Ÿ“ main
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“ java
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“ com.myapp
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“„ MainApplication.java (์Šคํ”„๋ง ๋ถ€ํŠธ ์‹œ์ž‘์ )
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“ controller (์š”์ฒญ ์ฒ˜๋ฆฌ)
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“ service (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“ repository (DB ์—ฐ๊ฒฐ)
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“ entity (DB ๋ชจ๋ธ)
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“ resources
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“„ application.properties (ํ™˜๊ฒฝ ์„ค์ •)
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“ static (์ •์  ํŒŒ์ผ: CSS, JS)
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“ templates (HTML ํ…œํ”Œ๋ฆฟ)
 โ”ƒ โ”ฃ ๐Ÿ“ test (ํ…Œ์ŠคํŠธ ์ฝ”๋“œ)
 โ”ฃ ๐Ÿ“„ pom.xml (Maven ์„ค์ •)
 โ”ฃ ๐Ÿ“„ build.gradle (Gradle ์„ค์ •)

โœ… ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋Š” ์ด๋Ÿฐ ๊ตฌ์กฐ๋กœ ๋‚˜๋‰˜๊ณ , ์—ญํ• ์„ ๊ตฌ๋ถ„ํ•ด์„œ ๊ฐœ๋ฐœํ•ด์š”!


โœ… 26.2 ๊ฐ„๋‹จํ•œ ํšŒ์› ๊ด€๋ฆฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๊ธฐ

๐Ÿ“Œ Spring Boot + JPA + H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ

1๏ธโƒฃ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

๐Ÿ‘‰ Spring Initializr์—์„œ Spring Boot ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

๐Ÿ‘‰ ํ•„์š”ํ•œ ์˜์กด์„ฑ ์ถ”๊ฐ€:

โœ… Spring Web

โœ… Spring Boot DevTools

โœ… Lombok

โœ… Spring Data JPA

โœ… H2 Database


2๏ธโƒฃ Member ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ (ํšŒ์› ์ •๋ณด ์ €์žฅ)

package com.myapp.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter @Setter
@NoArgsConstructor
public class Member {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;
}

โœ… JPA ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด DB์™€ ์—ฐ๊ฒฐ๋˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์–ด์š”!


3๏ธโƒฃ ํšŒ์› ์ €์žฅ์†Œ (MemberRepository)

package com.myapp.repository;

import com.myapp.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<Member, Long> {
}

โœ… JPA๋ฅผ ํ™œ์šฉํ•ด์„œ DB์— ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”!


4๏ธโƒฃ ํšŒ์› ์„œ๋น„์Šค (MemberService)

package com.myapp.service;

import com.myapp.entity.Member;
import com.myapp.repository.MemberRepository;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class MemberService {
    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    public List<Member> getAllMembers() {
        return memberRepository.findAll();
    }

    public Member saveMember(Member member) {
        return memberRepository.save(member);
    }
}

โœ… ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ์„œ๋น„์Šค ํด๋ž˜์Šค์˜ˆ์š”!


5๏ธโƒฃ ์ปจํŠธ๋กค๋Ÿฌ (MemberController)

package com.myapp.controller;

import com.myapp.entity.Member;
import com.myapp.service.MemberService;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/members")
public class MemberController {
    private final MemberService memberService;

    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

    @GetMapping
    public List<Member> getAllMembers() {
        return memberService.getAllMembers();
    }

    @PostMapping
    public Member createMember(@RequestBody Member member) {
        return memberService.saveMember(member);
    }
}

โœ… REST API๋กœ ํšŒ์› ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ณ  ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”!


6๏ธโƒฃ application.properties ์„ค์ • (H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ)

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

โœ… H2 ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ!


7๏ธโƒฃ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ํ›„ API ํ…Œ์ŠคํŠธ

๐Ÿ“Œ http://localhost:8080/members์— GET, POST ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ณ  ์กฐํšŒ๋จ!

โœ… Postman ๋˜๋Š” cURL์„ ์‚ฌ์šฉํ•ด์„œ API ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ!


๐ŸŽฏ 27๋‹จ๊ณ„: ์„ฑ๋Šฅ ์ตœ์ ํ™” โ€“ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ

โœ… 27.1 SQL ์ตœ์ ํ™” (@Query ํ™œ์šฉ)

@Query("SELECT m FROM Member m WHERE m.name = :name")
List<Member> findByName(@Param("name") String name);

โœ… JPA์˜ ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ์„ฑ๋Šฅ์„ ๋” ๋†’์ผ ์ˆ˜ ์žˆ์–ด์š”!


โœ… 27.2 ์บ์‹ฑ(Cache) ์‚ฌ์šฉ

@Cacheable("members")
public List<Member> getAllMembers() {
    return memberRepository.findAll();
}

โœ… ์ž์ฃผ ์กฐํšŒ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์บ์‹ฑํ•ด์„œ ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ์–ด์š”!


โœ… 27.3 ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ (@Async ์‚ฌ์šฉ)

@Async
public CompletableFuture<List<Member>> getMembersAsync() {
    return CompletableFuture.completedFuture(memberRepository.findAll());
}

โœ… ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด API ์‘๋‹ต ์†๋„๊ฐ€ ๋นจ๋ผ์ ธ์š”!


๐ŸŽฏ 28๋‹จ๊ณ„: ํ…Œ์ŠคํŠธ ์ž๋™ํ™” โ€“ ์•ˆ์ •์ ์ธ ์ฝ”๋“œ ๋งŒ๋“ค๊ธฐ

โœ… 28.1 JUnit์„ ์‚ฌ์šฉํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ

@SpringBootTest
public class MemberServiceTest {
    @Autowired
    private MemberService memberService;

    @Test
    public void ํšŒ์›_๋ชฉ๋ก_์กฐํšŒ_ํ…Œ์ŠคํŠธ() {
        List<Member> members = memberService.getAllMembers();
        assertNotNull(members);
    }
}

โœ… JUnit์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ์ž๋™์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”!


๐ŸŽฏ 29๋‹จ๊ณ„: ๋ฐฐํฌ โ€“ ์‹ค์ œ ์„œ๋ฒ„์— ์„œ๋น„์Šค ์˜ฌ๋ฆฌ๊ธฐ

โœ… 29.1 ๋„์ปค(Docker)๋กœ ์ปจํ…Œ์ด๋„ˆํ™”

๐Ÿ“Œ Dockerfile ์ƒ์„ฑ

FROM openjdk:17
COPY target/myapp.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

โœ… Docker๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋””์„œ๋“  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”!


โœ… 29.2 AWS์— ๋ฐฐํฌํ•˜๊ธฐ

๐Ÿ“Œ EC2์—์„œ ์‹คํ–‰

scp myapp.jar ec2-user@myserver:/home/ec2-user/
ssh ec2-user@myserver
java -jar myapp.jar

โœ… AWS EC2 ์„œ๋ฒ„์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์–ด์š”!


๐Ÿš€ 30๋‹จ๊ณ„: ์‹ค์ „ ํ”„๋กœ์ ํŠธ ๋งˆ๋ฌด๋ฆฌ

โœ… ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋‚ด์šฉ์œผ๋กœ ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ!

1๏ธโƒฃ Spring Boot๋กœ API ๊ฐœ๋ฐœ

2๏ธโƒฃ JPA & ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™

3๏ธโƒฃ ์„ฑ๋Šฅ ์ตœ์ ํ™” (SQL ํŠœ๋‹, ์บ์‹ฑ, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ)

4๏ธโƒฃ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” (JUnit)

5๏ธโƒฃ ๋ฐฐํฌ (Docker & AWS)

โœ… ์ด์ œ ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์ทจ์—… ์ค€๋น„๋ฅผ ํ•˜๋ฉด ๋ผ์š”! ๐Ÿš€๐Ÿ”ฅ

๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์œผ๋ฉด ์–ธ์ œ๋“ ์ง€ ์งˆ๋ฌธํ•ด ์ฃผ์„ธ์š”! ๐Ÿ˜Š