** ๐Ÿ“Œ1. ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋‹ค๋ฃจ๋Š” ์ด์œ **

์ปดํ“จํ„ฐ์—์„œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด:

โœ… ์˜ค๋Š˜ ๋‚ ์งœ ์ถœ๋ ฅํ•˜๊ธฐ

โœ… ์ƒ์ผ ๊ณ„์‚ฐํ•˜๊ธฐ

โœ… ์˜ˆ์•ฝ ์‹œ์Šคํ…œ์—์„œ ๋‚ ์งœ ๋น„๊ตํ•˜๊ธฐ

Java์—์„œ๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚ ์งœ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์˜ค๋Š˜์€ Date ํด๋ž˜์Šค์™€ SimpleDateFormat ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‚ ์งœ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ๋ณผ ๊ฑฐ์˜ˆ์š”! ๐Ÿš€


2. ๋‚ ์งœ ์ถœ๋ ฅํ•˜๊ธฐ (Date ํด๋ž˜์Šค)

Date ํด๋ž˜์Šค๋Š” ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์˜ค๋Š” ํด๋ž˜์Šค์˜ˆ์š”.

Date now = new Date();
System.out.println(now);

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

Thu Feb 15 12:30:45 KST 2024

์—ฌ๊ธฐ์„œ ๊ฐ ๋ถ€๋ถ„์€ ๋‹ค์Œ์„ ์˜๋ฏธํ•ด์š”:


3. ๋‚ ์งœ๋ฅผ ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•˜๊ธฐ (SimpleDateFormat)

๊ธฐ๋ณธ ์ถœ๋ ฅ ๋ฐฉ์‹์ด ์–ด๋ ต๋‹ค๋ฉด, SimpleDateFormat ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์š”.

SimpleDateFormat sf = new SimpleDateFormat("yyyy๋…„ MM์›” dd์ผ HH์‹œ mm๋ถ„ ss์ดˆ E a");
System.out.println(sf.format(now));

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

2024๋…„ 02์›” 15์ผ 12์‹œ 30๋ถ„ 45์ดˆ ๋ชฉ ์˜คํ›„

์—ฌ๊ธฐ์„œ ํ˜•์‹ ๊ธฐํ˜ธ๋ฅผ ์„ค๋ช…ํ•ด๋ณผ๊ฒŒ์š”!

๊ธฐํ˜ธ ์˜๋ฏธ ์˜ˆ์‹œ
yyyy ์—ฐ๋„ 2024
MM ์›” (2์ž๋ฆฌ) 02 (2์›”)
dd ์ผ (2์ž๋ฆฌ) 15
HH ์‹œ๊ฐ„ (24์‹œ๊ฐ„ ํ˜•์‹) 13 (์˜คํ›„ 1์‹œ)
mm ๋ถ„ 30
ss ์ดˆ 45
E ์š”์ผ ๋ชฉ (Thursday)
a ์˜ค์ „/์˜คํ›„ ์˜ค์ „ ๋˜๋Š” ์˜คํ›„

์ด์ œ ์›ํ•˜๋Š” ๋‚ ์งœ ํ˜•์‹์„ ์ž์œ ๋กญ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽ‰


4. ๋ฌธ์ž์—ด์„ ๋‚ ์งœ(Date ๊ฐ์ฒด)๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

๋‚ ์งœ๋ฅผ String์œผ๋กœ ์ €์žฅํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋‚ ์งœ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”!

SimpleDateFormat sf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatDate = "2025-12-25 10:00:00";
Date day = null;

try {
    day = sf2.parse(formatDate);
} catch (ParseException e) {
    e.printStackTrace();
}

System.out.println(day);

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

Thu Dec 25 10:00:00 KST 2025

โœ… parse() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ž์—ด์„ ๋‚ ์งœ(Date)๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์š”.

โœ… ๋งŒ์•ฝ ์ž˜๋ชป๋œ ํ˜•์‹์˜ ๋‚ ์งœ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— try-catch ๋ฌธ์œผ๋กœ ๊ฐ์‹ธ์ค๋‹ˆ๋‹ค.


5. ๋‚ ์งœ ์ฐจ์ด ๊ณ„์‚ฐํ•˜๊ธฐ

๋‚ ์งœ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด getTime() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ผ์š”!

long diffMillis = day.getTime() - now.getTime();
long diffDays = diffMillis / (1000L * 60 * 60 * 24);
System.out.println("๋‚ ์งœ ์ฐจ์ด(์ผ): " + diffDays);

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

๋‚ ์งœ ์ฐจ์ด(์ผ): 315

โœ… getTime() ๋ฉ”์„œ๋“œ๋Š” 1970๋…„ 1์›” 1์ผ 00:00:00 UTC๋ถ€ํ„ฐ ๊ฒฝ๊ณผํ•œ ๋ฐ€๋ฆฌ์ดˆ(ms) ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์š”.

โœ… ๋‘ ๋‚ ์งœ ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•œ ๋’ค ๋ฐ€๋ฆฌ์ดˆ โ†’ ์ผ(day) ๋‹จ์œ„๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ๋‚ ์งœ ์ฐจ์ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์–ด์š”.


6. ๋‚ ์งœ ๋”ํ•˜๊ธฐ (3์ผ ํ›„์˜ ๋‚ ์งœ ๊ตฌํ•˜๊ธฐ)

๋‚ ์งœ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ๋Š” Calendar ํด๋ž˜์Šค๋ฅผ ์“ฐ๋Š” ๊ฒŒ ๋” ํŽธ๋ฆฌํ•ด์š”!

Calendar cal = Calendar.getInstance();
cal.setTime(now);
cal.add(Calendar.DATE, 3);
Date newDate = cal.getTime();
System.out.println("3์ผ ํ›„ ๋‚ ์งœ: " + new SimpleDateFormat("yyyy-MM-dd E์š”์ผ").format(newDate));

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

3์ผ ํ›„ ๋‚ ์งœ: 2024-02-18 ์ผ์š”์ผ

โœ… Calendar.add(Calendar.DATE, 3)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ€๋ฆฌ์ดˆ ๊ณ„์‚ฐ ์—†์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‚ ์งœ๋ฅผ ๋”ํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽ‰


7. ๋‚ ์งœ์™€ ์š”์ผ ์ถœ๋ ฅํ•˜๊ธฐ

๋‚ ์งœ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด์„œ ์š”์ผ๊นŒ์ง€ ํ•จ๊ป˜ ํ‘œ์‹œํ•˜๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ผ์š”!

System.out.println(new SimpleDateFormat("yyyy-MM-dd E์š”์ผ").format(day));

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

2025-12-25 ๋ชฉ์š”์ผ

โœ… "E์š”์ผ"์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ ์งœ์™€ ํ•จ๊ป˜ ์š”์ผ๋„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ˜Š


๋งˆ๋ฌด๋ฆฌ ์ •๋ฆฌ

๊ธฐ๋Šฅ ์‚ฌ์šฉ๋ฒ•
ํ˜„์žฌ ๋‚ ์งœ ๊ฐ€์ ธ์˜ค๊ธฐ new Date()
๋‚ ์งœ๋ฅผ ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ SimpleDateFormat + format()
๋ฌธ์ž์—ด์„ ๋‚ ์งœ๋กœ ๋ณ€ํ™˜ parse()
๋‚ ์งœ ์ฐจ์ด ๊ณ„์‚ฐ getTime() ํ™œ์šฉ
๋‚ ์งœ ๋”ํ•˜๊ธฐ/๋นผ๊ธฐ Calendar.add()
๋‚ ์งœ + ์š”์ผ ์ถœ๋ ฅ "E์š”์ผ" ํฌ๋งท ํ™œ์šฉ

8. ํŠน์ • ๋‚ ์งœ์˜ ๋ฐ€๋ฆฌ์ดˆ ๊ฐ’ ๊ตฌํ•˜๊ธฐ

๋‚ ์งœ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ 1970๋…„ 1์›” 1์ผ 00:00:00 UTC ๊ธฐ์ค€์œผ๋กœ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„(long ํƒ€์ž… ์ˆซ์ž)๋กœ ์ €์žฅ๋ผ์š”.

Date now = new Date();
System.out.println("ํ˜„์žฌ ์‹œ๊ฐ„์˜ ๋ฐ€๋ฆฌ์ดˆ ๊ฐ’: " + now.getTime());
System.out.println("ํ˜„์žฌ ์‹œ๊ฐ„์˜ ๋ฐ€๋ฆฌ์ดˆ ๊ฐ’(System.currentTimeMillis()): " + System.currentTimeMillis());

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

ํ˜„์žฌ ์‹œ๊ฐ„์˜ ๋ฐ€๋ฆฌ์ดˆ ๊ฐ’: 1709232000000
ํ˜„์žฌ ์‹œ๊ฐ„์˜ ๋ฐ€๋ฆฌ์ดˆ ๊ฐ’(System.currentTimeMillis()): 1709232000000

โœ… getTime()๊ณผ System.currentTimeMillis()๋Š” ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์š”!

โœ… System.currentTimeMillis()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ์‹œ๊ฐ„์„ Date ๊ฐ์ฒด ์—†์ด๋„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด์š”.


9. ํŠน์ • ๋‚ ์งœ๋ฅผ ๋ฐ€๋ฆฌ์ดˆ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

SimpleDateFormat์„ ์‚ฌ์šฉํ•ด์„œ ํŠน์ • ๋‚ ์งœ์˜ ๋ฐ€๋ฆฌ์ดˆ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.

SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
String sday = "2025-03-01";
Date day = null;

try {
    day = sf.parse(sday);
} catch (ParseException e) {
    e.printStackTrace();
}

if (day != null) {
    System.out.println(sday + " " + new SimpleDateFormat("E์š”์ผ").format(day));
    System.out.println("๋ฐ€๋ฆฌ์ดˆ ๊ฐ’: " + day.getTime());
} else {
    System.out.println("๋‚ ์งœ ๋ณ€ํ™˜ ์‹คํŒจ!");
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

2025-03-01 ํ† ์š”์ผ
๋ฐ€๋ฆฌ์ดˆ ๊ฐ’: 1746073200000

โœ… "yyyy-MM-dd" ํ˜•์‹์œผ๋กœ ๋‚ ์งœ๋ฅผ String์—์„œ Date ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค getTime()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ€๋ฆฌ์ดˆ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์–ด์š”!


10. ๋‚ ์งœ ๊ฐ„๊ฒฉ(์ผ ์ˆ˜) ๊ณ„์‚ฐํ•˜๊ธฐ

getTime()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‘ ๋‚ ์งœ ์‚ฌ์ด์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์–ด์š”.

SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sf.parse("2024-02-28");
Date date2 = sf.parse("2024-03-10");

long diffMillis = date2.getTime() - date1.getTime();
long diffDays = diffMillis / (1000L * 60 * 60 * 24);

System.out.println("๋‚ ์งœ ์ฐจ์ด(์ผ): " + diffDays);

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

๋‚ ์งœ ์ฐจ์ด(์ผ): 11

โœ… getTime()์„ ์‚ฌ์šฉํ•ด์„œ ๋‘ ๋‚ ์งœ์˜ ๋ฐ€๋ฆฌ์ดˆ ์ฐจ์ด โ†’ ์ผ(day) ๋‹จ์œ„๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ๋‚ ์งœ ๊ฐ„๊ฒฉ์„ ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์–ด์š”!


11. ํŠน์ • ๋‚ ์งœ์—์„œ X์ผ ๋”ํ•˜๊ธฐ (or ๋นผ๊ธฐ)

๋‚ ์งœ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„ ์—ฐ์‚ฐ ๋Œ€์‹  Calendar ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ํŽธ๋ฆฌํ•ด์š”.

Calendar cal = Calendar.getInstance();
cal.setTime(date1);  // ๊ธฐ์ค€ ๋‚ ์งœ ์„ค์ •
cal.add(Calendar.DATE, 5); // 5์ผ ์ถ”๊ฐ€
System.out.println("5์ผ ํ›„ ๋‚ ์งœ: " + sf.format(cal.getTime()));

cal.add(Calendar.DATE, -3); // 3์ผ ๋นผ๊ธฐ
System.out.println("3์ผ ์ „ ๋‚ ์งœ: " + sf.format(cal.getTime()));

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

5์ผ ํ›„ ๋‚ ์งœ: 2024-03-04
3์ผ ์ „ ๋‚ ์งœ: 2024-03-01

โœ… Calendar.add(Calendar.DATE, ๊ฐ’)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ ์งœ๋ฅผ ์‰ฝ๊ฒŒ ๋”ํ•˜๊ฑฐ๋‚˜ ๋บ„ ์ˆ˜ ์žˆ์–ด์š”.


12. ๋‚ ์งœ ๋น„๊ตํ•˜๊ธฐ (Before, After, Equals)

Date ๊ฐ์ฒด๋Š” ๋น„๊ต ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

Date date1 = sf.parse("2024-02-28");
Date date2 = sf.parse("2024-03-10");

if (date1.before(date2)) {
    System.out.println("date1์€ date2๋ณด๋‹ค ์ด์ „ ๋‚ ์งœ์ž…๋‹ˆ๋‹ค.");
}
if (date2.after(date1)) {
    System.out.println("date2๋Š” date1๋ณด๋‹ค ์ดํ›„ ๋‚ ์งœ์ž…๋‹ˆ๋‹ค.");
}
if (date1.equals(date2)) {
    System.out.println("๋‘ ๋‚ ์งœ๋Š” ๊ฐ™์Šต๋‹ˆ๋‹ค.");
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

date1์€ date2๋ณด๋‹ค ์ด์ „ ๋‚ ์งœ์ž…๋‹ˆ๋‹ค.
date2๋Š” date1๋ณด๋‹ค ์ดํ›„ ๋‚ ์งœ์ž…๋‹ˆ๋‹ค.

โœ… before() โ†’ ํŠน์ • ๋‚ ์งœ๊ฐ€ ๋‹ค๋ฅธ ๋‚ ์งœ๋ณด๋‹ค ์ด์ „์ธ์ง€ ํ™•์ธ

โœ… after() โ†’ ํŠน์ • ๋‚ ์งœ๊ฐ€ ๋‹ค๋ฅธ ๋‚ ์งœ๋ณด๋‹ค ์ดํ›„์ธ์ง€ ํ™•์ธ

โœ… equals() โ†’ ๋‘ ๋‚ ์งœ๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธ


13. 3์ผ ํ›„ ๋‚ ์งœ ๊ตฌํ•˜๊ธฐ (๋ฐ€๋ฆฌ์ดˆ ์—ฐ์‚ฐ ๋ฐฉ์‹ vs Calendar ๋ฐฉ์‹ ๋น„๊ต)

1) ๋ฐ€๋ฆฌ์ดˆ ์—ฐ์‚ฐ ๋ฐฉ์‹

Date now = new Date();
now.setTime(now.getTime() + (1000L * 60 * 60 * 24 * 3));
System.out.println("3์ผ ํ›„ ๋‚ ์งœ: " + new SimpleDateFormat("yyyy-MM-dd E์š”์ผ").format(now));

โœ… ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ 3์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹

โŒ ์‹ค์ˆ˜๋กœ ์ž˜๋ชป๋œ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ


2) Calendar ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹ (๋” ์•ˆ์ „ํ•จ)

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 3);
System.out.println("3์ผ ํ›„ ๋‚ ์งœ: " + new SimpleDateFormat("yyyy-MM-dd E์š”์ผ").format(cal.getTime()));

โœ… Calendar.add()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋‚ ์งœ ์—ฐ์‚ฐ์„ ํ•ด์ฃผ๋ฏ€๋กœ ๋” ์•ˆ์ „ํ•ด์š”! ๐ŸŽ‰


14. ์š”์ผ ์ถœ๋ ฅํ•˜๊ธฐ

์š”์ผ์„ ์ถœ๋ ฅํ•˜๋ ค๋ฉด SimpleDateFormat์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์š”.

System.out.println(new SimpleDateFormat("yyyy-MM-dd E์š”์ผ").format(date1));

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

2024-02-28 ์ˆ˜์š”์ผ

โœ… "E์š”์ผ"์„ ์‚ฌ์šฉํ•˜๋ฉด ์š”์ผ๊นŒ์ง€ ์‰ฝ๊ฒŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์–ด์š”!


15. ์ •๋ฆฌ: ๋‚ ์งœ ๊ด€๋ จ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์š”์•ฝ

๊ธฐ๋Šฅ ์‚ฌ์šฉ๋ฒ•
ํ˜„์žฌ ๋‚ ์งœ ๊ฐ€์ ธ์˜ค๊ธฐ new Date()
๋‚ ์งœ๋ฅผ ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ SimpleDateFormat + format()
๋ฌธ์ž์—ด์„ ๋‚ ์งœ๋กœ ๋ณ€ํ™˜ parse()
๋‚ ์งœ ์ฐจ์ด ๊ณ„์‚ฐ getTime() ํ™œ์šฉ
๋‚ ์งœ ๋”ํ•˜๊ธฐ/๋นผ๊ธฐ Calendar.add(Calendar.DATE, ๊ฐ’)
ํŠน์ • ๋‚ ์งœ์˜ ์š”์ผ ์ถœ๋ ฅ "E์š”์ผ" ํฌ๋งท ํ™œ์šฉ
๋‚ ์งœ ๋น„๊ต before(), after(), equals()

16. ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋ณด๋‹ค ์ •๊ตํ•˜๊ฒŒ ๋‹ค๋ฃจ๋Š” LocalDateTime (Java 8 ์ด์ƒ)

Date์™€ Calendar๋Š” ์˜ค๋ž˜๋œ ํด๋ž˜์Šค๋ผ์„œ, Java 8๋ถ€ํ„ฐ๋Š” java.time ํŒจํ‚ค์ง€์˜ ์ƒˆ๋กœ์šด API๊ฐ€ ๋„์ž…๋˜์—ˆ์–ด์š”.

์ด์ œ๋Š” LocalDateTime, LocalDate, LocalTime์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ง๊ด€์ ์ด๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์š”!


1) LocalDateTime์„ ์‚ฌ์šฉํ•ด ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๊ฐ€์ ธ์˜ค๊ธฐ

import java.time.LocalDateTime;

public class Main {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        System.out.println("ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„: " + now);
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„: 2024-02-29T14:30:15.123

โœ… LocalDateTime.now() โ†’ ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์˜ด

โœ… T14:30:15.123 โ†’ ์‹œ:๋ถ„:์ดˆ.๋ฐ€๋ฆฌ์ดˆ๊นŒ์ง€ ํ‘œ์‹œ๋จ


2) ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ (DateTimeFormatter)

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy๋…„ MM์›” dd์ผ HH์‹œ mm๋ถ„ ss์ดˆ");
        String formattedDate = now.format(formatter);

        System.out.println("ํ˜•์‹ ์ง€์ •๋œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„: " + formattedDate);
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

ํ˜•์‹ ์ง€์ •๋œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„: 2024๋…„ 02์›” 29์ผ 14์‹œ 30๋ถ„ 15์ดˆ

โœ… DateTimeFormatter.ofPattern("yyyy๋…„ MM์›” dd์ผ HH์‹œ mm๋ถ„ ss์ดˆ") โ†’ ๋‚ ์งœ ํ˜•์‹์„ ์ง€์ •

โœ… now.format(formatter) โ†’ ๋‚ ์งœ๋ฅผ ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜


3) LocalDate์™€ LocalTime์œผ๋กœ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋ถ„๋ฆฌํ•˜๊ธฐ

import java.time.LocalDate;
import java.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now(); // ํ˜„์žฌ ๋‚ ์งœ
        LocalTime now = LocalTime.now();   // ํ˜„์žฌ ์‹œ๊ฐ„

        System.out.println("ํ˜„์žฌ ๋‚ ์งœ: " + today);
        System.out.println("ํ˜„์žฌ ์‹œ๊ฐ„: " + now);
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

ํ˜„์žฌ ๋‚ ์งœ: 2024-02-29
ํ˜„์žฌ ์‹œ๊ฐ„: 14:30:15.123

โœ… LocalDate.now() โ†’ ๋‚ ์งœ๋งŒ ๊ฐ€์ ธ์˜ด

โœ… LocalTime.now() โ†’ ์‹œ๊ฐ„๋งŒ ๊ฐ€์ ธ์˜ด


17. ๋‚ ์งœ ๋”ํ•˜๊ธฐ ๋ฐ ๋นผ๊ธฐ (plusDays(), minusDays())

import java.time.LocalDate;

public class Main {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();

        LocalDate nextWeek = today.plusDays(7);
        LocalDate lastWeek = today.minusDays(7);

        System.out.println("์˜ค๋Š˜ ๋‚ ์งœ: " + today);
        System.out.println("์ผ์ฃผ์ผ ํ›„: " + nextWeek);
        System.out.println("์ผ์ฃผ์ผ ์ „: " + lastWeek);
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

์˜ค๋Š˜ ๋‚ ์งœ: 2024-02-29
์ผ์ฃผ์ผ ํ›„: 2024-03-07
์ผ์ฃผ์ผ ์ „: 2024-02-22

โœ… plusDays(7) โ†’ 7์ผ์„ ๋”ํ•จ

โœ… minusDays(7) โ†’ 7์ผ์„ ๋บŒ

โœ… plusMonths(1) / minusMonths(1) ๋„ ๊ฐ€๋Šฅ

18. ๋‘ ๋‚ ์งœ ๊ฐ„์˜ ์ฐจ์ด ๊ณ„์‚ฐ (ChronoUnit.DAYS.between())

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class Main {
    public static void main(String[] args) {
        LocalDate startDate = LocalDate.of(2024, 2, 1);
        LocalDate endDate = LocalDate.of(2024, 2, 29);

        long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);

        System.out.println("๋‘ ๋‚ ์งœ์˜ ์ฐจ์ด(์ผ): " + daysBetween);
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

๋‘ ๋‚ ์งœ์˜ ์ฐจ์ด(์ผ): 28

โœ… ChronoUnit.DAYS.between(startDate, endDate) โ†’ ๋‚ ์งœ ์ฐจ์ด๋ฅผ ์ผ ๋‹จ์œ„๋กœ ๊ณ„์‚ฐ

โœ… ChronoUnit.MONTHS.between(startDate, endDate) โ†’ ๊ฐœ์›” ๋‹จ์œ„ ๊ณ„์‚ฐ๋„ ๊ฐ€๋Šฅ


19. ํŠน์ • ๋‚ ์งœ์˜ ์š”์ผ ๊ตฌํ•˜๊ธฐ

import java.time.LocalDate;
import java.time.DayOfWeek;

public class Main {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2024, 3, 1);
        DayOfWeek dayOfWeek = date.getDayOfWeek();

        System.out.println("2024๋…„ 3์›” 1์ผ์˜ ์š”์ผ: " + dayOfWeek);
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

2024๋…„ 3์›” 1์ผ์˜ ์š”์ผ: FRIDAY

โœ… getDayOfWeek() โ†’ ์š”์ผ์„ ๋ฐ˜ํ™˜ (MONDAY, TUESDAY, WEDNESDAY, โ€ฆ)


20. LocalDateTime์„ Date๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ (Date.from())

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        Date date = Date.from(now.atZone(ZoneId.systemDefault()).toInstant());

        System.out.println("LocalDateTime: " + now);
        System.out.println("Date ๊ฐ์ฒด: " + date);
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

LocalDateTime: 2024-02-29T14:30:15.123
Date ๊ฐ์ฒด: Thu Feb 29 14:30:15 KST 2024

โœ… LocalDateTime์„ Date๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด toInstant()๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”.


21. Date๋ฅผ LocalDateTime์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        Date date = new Date();
        LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

        System.out.println("Date ๊ฐ์ฒด: " + date);
        System.out.println("LocalDateTime: " + localDateTime);
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

Date ๊ฐ์ฒด: Thu Feb 29 14:30:15 KST 2024
LocalDateTime: 2024-02-29T14:30:15.123

โœ… toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()์„ ์‚ฌ์šฉํ•ด ๋ณ€ํ™˜


22. ์š”์•ฝ ์ •๋ฆฌ

๊ธฐ๋Šฅ Date & Calendar ๋ฐฉ์‹ LocalDateTime ๋ฐฉ์‹ (Java 8 ์ด์ƒ)
ํ˜„์žฌ ๋‚ ์งœ/์‹œ๊ฐ„ new Date() LocalDateTime.now()
๋‚ ์งœ ํฌ๋งท ๋ณ€๊ฒฝ SimpleDateFormat DateTimeFormatter
๋ฌธ์ž์—ด โ†’ ๋‚ ์งœ ๋ณ€ํ™˜ parse() LocalDate.parse()
๋‚ ์งœ ์ฐจ์ด ๊ณ„์‚ฐ getTime() ํ™œ์šฉ ChronoUnit.DAYS.between()
๋‚ ์งœ ๋”ํ•˜๊ธฐ/๋นผ๊ธฐ Calendar.add() plusDays(), minusDays()

###


23. ์ •๊ทœ ํ‘œํ˜„์‹(Regex)๋ž€?

์ •๊ทœ ํ‘œํ˜„์‹(Regex, Regular Expression)์€ ๋ฌธ์ž์—ด์—์„œ ํŠน์ • ๊ทœ์น™์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ์š”.

๐Ÿ“Œ ์ •๊ทœ ํ‘œํ˜„์‹์ด ์‚ฌ์šฉ๋˜๋Š” ์˜ˆ์‹œ

โœ… ์ด๋ฉ”์ผ ์ฃผ์†Œ ๊ฒ€์ฆ: "user@example.com"์ด ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์ธ์ง€ ํ™•์ธ

โœ… ์ „ํ™”๋ฒˆํ˜ธ ๊ฒ€์‚ฌ: "010-1234-5678" ๊ฐ™์€ ํ˜•์‹ ์ฐพ๊ธฐ

โœ… ํŠน์ • ๋‹จ์–ด ๊ฒ€์ƒ‰: ๋ฌธ์žฅ์—์„œ "Hello"๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ

โœ… ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ•๋„ ๊ฒ€์‚ฌ: ์ตœ์†Œ 8์ž ์ด์ƒ, ์ˆซ์ž/ํŠน์ˆ˜๋ฌธ์ž ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธ


24. Java์—์„œ ์ •๊ทœ ํ‘œํ˜„์‹ ์‚ฌ์šฉํ•˜๊ธฐ

Java์—์„œ๋Š” java.util.regex ํŒจํ‚ค์ง€์˜ Pattern๊ณผ Matcher ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด ์ •๊ทœ ํ‘œํ˜„์‹์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์š”.

1) ์ •๊ทœ ํ‘œํ˜„์‹์œผ๋กœ ํŠน์ • ํŒจํ„ด ์ฐพ๊ธฐ

import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String text = "Hello, my number is 010-1234-5678";
        String pattern = "\\d{3}-\\d{4}-\\d{4}";  // ์ „ํ™”๋ฒˆํ˜ธ ํ˜•์‹ (000-0000-0000)

        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(text);

        if (m.find()) {
            System.out.println("์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค: " + m.group());
        } else {
            System.out.println("์ „ํ™”๋ฒˆํ˜ธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
        }
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค: 010-1234-5678

โœ… \\d{3}-\\d{4}-\\d{4} โ†’ ์ˆซ์ž(3์ž๋ฆฌ)-์ˆซ์ž(4์ž๋ฆฌ)-์ˆซ์ž(4์ž๋ฆฌ) ํŒจํ„ด

โœ… m.find() โ†’ text์—์„œ ํŒจํ„ด์ด ์žˆ๋Š”์ง€ ๊ฒ€์ƒ‰

โœ… m.group() โ†’ ์ฐพ์€ ๋ฌธ์ž์—ด ์ถœ๋ ฅ


25. ์ •๊ทœ ํ‘œํ˜„์‹ ๊ธฐ์ดˆ ๋ฌธ๋ฒ•

ํ‘œํ˜„์‹ ์˜๋ฏธ ์˜ˆ์ œ
. ์ž„์˜์˜ ํ•œ ๋ฌธ์ž (๊ณต๋ฐฑ ์ œ์™ธ) "a." โ†’ "ab", "a1" (โœ…) "abc" (โŒ)
\d ์ˆซ์ž (0~9) "\\d" โ†’ "1", "5", "9" (โœ…) "a" (โŒ)
\D ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž "\\D" โ†’ "a", "#", "B" (โœ…) "5" (โŒ)
\s ๊ณต๋ฐฑ (์ŠคํŽ˜์ด์Šค, ํƒญ, ์ค„๋ฐ”๊ฟˆ) "hello\sworld" โ†’ "hello world" (โœ…)
\w ์˜๋ฌธ์ž, ์ˆซ์ž, _ "\\w" โ†’ "a", "1", "_" (โœ…) "@" (โŒ)
\W \w๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž (ํŠน์ˆ˜๋ฌธ์ž) "\\W" โ†’ "@", "#", " " (โœ…) "A" (โŒ)
* 0๊ฐœ ์ด์ƒ ๋ฐ˜๋ณต "ab*" โ†’ "a", "ab", "abb", "abbbbb"
+ 1๊ฐœ ์ด์ƒ ๋ฐ˜๋ณต "ab+" โ†’ "ab", "abb", "abbbbb" (โœ…) "a" (โŒ)
? 0๊ฐœ ๋˜๋Š” 1๊ฐœ "ab?" โ†’ "a", "ab" (โœ…) "abb" (โŒ)
{n} ์ •ํ™•ํžˆ n๊ฐœ ๋ฐ˜๋ณต "a{3}" โ†’ "aaa" (โœ…) "aa", "aaaa" (โŒ)
{n,m} n๊ฐœ ์ด์ƒ, m๊ฐœ ์ดํ•˜ "a{2,4}" โ†’ "aa", "aaa", "aaaa" (โœ…) "a", "aaaaa" (โŒ)
^ ๋ฌธ์ž์—ด ์‹œ์ž‘ "^Hello" โ†’ "Hello world" (โœ…) "world Hello" (โŒ)
$ ๋ฌธ์ž์—ด ๋ "world$" โ†’ "Hello world" (โœ…) "world Hello" (โŒ)

26. ์ด๋ฉ”์ผ ๊ฒ€์ฆ (์ •๊ทœ ํ‘œํ˜„์‹ ํ™œ์šฉ)

์ด๋ฉ”์ผ ์ฃผ์†Œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์ธ์ง€ ํ™•์ธํ•˜๋Š” ์˜ˆ์ œ์˜ˆ์š”.

import java.util.regex.*;

public class EmailValidator {
    public static void main(String[] args) {
        String email = "user@example.com";
        String pattern = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$";

        if (Pattern.matches(pattern, email)) {
            System.out.println("์˜ฌ๋ฐ”๋ฅธ ์ด๋ฉ”์ผ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.");
        } else {
            System.out.println("์ž˜๋ชป๋œ ์ด๋ฉ”์ผ ํ˜•์‹์ž…๋‹ˆ๋‹ค.");
        }
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

์˜ฌ๋ฐ”๋ฅธ ์ด๋ฉ”์ผ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.

โœ… "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$" โ†’ ์ด๋ฉ”์ผ ํ˜•์‹ ๊ฒ€์ฆ

โœ… Pattern.matches(pattern, email) โ†’ ์ด๋ฉ”์ผ์ด ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ


27. ํŠน์ • ํŒจํ„ด์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์–ด ์ฐพ๊ธฐ

์˜ˆ๋ฅผ ๋“ค์–ด "b"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์–ด๋ฅผ ์ฐพ๊ณ  ์‹ถ๋‹ค๋ฉด?

import java.util.regex.*;

public class RegexTest {
    public static void main(String[] args) {
        String text = "bat, babe, ball, cat, car, combat";
        Pattern p = Pattern.compile("\\bb\\w+");  // 'b'๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์–ด ์ฐพ๊ธฐ
        Matcher m = p.matcher(text);

        while (m.find()) {
            System.out.println("๋งค์นญ๋œ ๋‹จ์–ด: " + m.group());
        }
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

๋งค์นญ๋œ ๋‹จ์–ด: bat
๋งค์นญ๋œ ๋‹จ์–ด: babe
๋งค์นญ๋œ ๋‹จ์–ด: ball

โœ… \\bb\\w+ โ†’ ๋‹จ์–ด ๊ฒฝ๊ณ„(\b)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "b"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์–ด ์ฐพ๊ธฐ


28. ์ •๊ทœ ํ‘œํ˜„์‹์œผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

๐Ÿ“Œ ์กฐ๊ฑด:

import java.util.regex.*;

public class PasswordValidator {
    public static void main(String[] args) {
        String password = "Hello123";
        String pattern = "^(?=.*[A-Z])(?=.*\\d).{8,}$";

        if (Pattern.matches(pattern, password)) {
            System.out.println("๊ฐ•๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.");
        } else {
            System.out.println("๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์•ฝํ•ฉ๋‹ˆ๋‹ค.");
        }
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

๊ฐ•๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

โœ… (?=.*[A-Z]) โ†’ ๋Œ€๋ฌธ์ž ํ•œ ๊ฐœ ์ด์ƒ

โœ… (?=.*\\d) โ†’ ์ˆซ์ž ํ•œ ๊ฐœ ์ด์ƒ

โœ… .{8,} โ†’ ์ตœ์†Œ 8์ž ์ด์ƒ


29. ์ •๋ฆฌ

๐Ÿ“Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ •๊ทœ ํ‘œํ˜„์‹

ํŒจํ„ด ์„ค๋ช… ์˜ˆ์ œ
\d{3}-\d{4}-\d{4} ์ „ํ™”๋ฒˆํ˜ธ 010-1234-5678
^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$ ์ด๋ฉ”์ผ ์ฃผ์†Œ user@example.com
(?=.*[A-Z])(?=.*\d).{8,} ๊ฐ•๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ Hello123
\bJava\b โ€œJavaโ€๋ผ๋Š” ๋‹จ์–ด๋งŒ ๊ฒ€์ƒ‰ "I love Java"

30. ์ปฌ๋ ‰์…˜(Collection)์ด๋ž€?

์ปฌ๋ ‰์…˜์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” Java์˜ API์˜ˆ์š”.

์ž๋ฐ” ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํฌ๊ฒŒ List, Set, Map์œผ๋กœ ๋‚˜๋‰˜์–ด์š”.

์ธํ„ฐํŽ˜์ด์Šค ํŠน์ง• ์˜ˆ์ œ
List ์ˆœ์„œ ์œ ์ง€, ์ค‘๋ณต ํ—ˆ์šฉ ArrayList, LinkedList
Set ์ˆœ์„œ ์—†์Œ, ์ค‘๋ณต ๋ถˆ๊ฐ€ HashSet, TreeSet
Map ํ‚ค-๊ฐ’(Key-Value) ์Œ ์ €์žฅ HashMap, TreeMap

31. ArrayList (๊ฐ€๋ณ€ ํฌ๊ธฐ ๋ฐฐ์—ด)

ArrayList๋Š” ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋œ ๋ฐฐ์—ด(Array)๊ณผ ๋‹ฌ๋ฆฌ ์ž๋™์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ์กฐ์ ˆ๋˜๋Š” ๋ฆฌ์ŠคํŠธ์˜ˆ์š”.

1) ArrayList ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        // ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
        ArrayList<String> list = new ArrayList<>();

        // ๊ฐ’ ์ถ”๊ฐ€
        list.add("์‚ฌ๊ณผ");
        list.add("๋ฐ”๋‚˜๋‚˜");
        list.add("์ฒด๋ฆฌ");

        // ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ
        System.out.println("๊ณผ์ผ ๋ฆฌ์ŠคํŠธ: " + list);
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

๊ณผ์ผ ๋ฆฌ์ŠคํŠธ: [์‚ฌ๊ณผ, ๋ฐ”๋‚˜๋‚˜, ์ฒด๋ฆฌ]

โœ… add() โ†’ ๋ฆฌ์ŠคํŠธ์— ๊ฐ’ ์ถ”๊ฐ€

โœ… ๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ๋Š” ์ž๋™์œผ๋กœ ์กฐ์ ˆ๋จ


2) ๋ฆฌ์ŠคํŠธ์—์„œ ํŠน์ • ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ (get())

System.out.println("์ฒซ ๋ฒˆ์งธ ๊ณผ์ผ: " + list.get(0));

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

์ฒซ ๋ฒˆ์งธ ๊ณผ์ผ: ์‚ฌ๊ณผ

โœ… get(index) โ†’ ๋ฆฌ์ŠคํŠธ์˜ ํŠน์ • ์œ„์น˜ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ


3) ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ ํ™•์ธ (size())

System.out.println("๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ: " + list.size());

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ: 3

โœ… size() โ†’ ๋ฆฌ์ŠคํŠธ์˜ ํ˜„์žฌ ํฌ๊ธฐ ๋ฐ˜ํ™˜


4) ๋ฆฌ์ŠคํŠธ์—์„œ ํŠน์ • ๊ฐ’ ์ œ๊ฑฐ (remove())

list.remove("๋ฐ”๋‚˜๋‚˜");
System.out.println("๋ฐ”๋‚˜๋‚˜ ์‚ญ์ œ ํ›„ ๋ฆฌ์ŠคํŠธ: " + list);

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

๋ฐ”๋‚˜๋‚˜ ์‚ญ์ œ ํ›„ ๋ฆฌ์ŠคํŠธ: [์‚ฌ๊ณผ, ์ฒด๋ฆฌ]

โœ… remove("๊ฐ’") โ†’ ํŠน์ • ์š”์†Œ ์‚ญ์ œ


5) ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉํ•˜๊ธฐ

for (String fruit : list) {
    System.out.println(fruit);
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

์‚ฌ๊ณผ
์ฒด๋ฆฌ

โœ… ํ–ฅ์ƒ๋œ for๋ฌธ(for-each)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์–ด์š”!


32. HashSet (์ค‘๋ณต ์—†๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ)

HashSet์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ˆ์š”.

import java.util.HashSet;

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

        set.add(10);
        set.add(20);
        set.add(10);  // ์ค‘๋ณต ๊ฐ’ ์ถ”๊ฐ€

        System.out.println("HashSet ๋‚ด์šฉ: " + set);
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

HashSet ๋‚ด์šฉ: [10, 20]

โœ… HashSet์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ


33. HashMap (Key-Value ์ €์žฅ)

HashMap์€ ํ‚ค(Key)์™€ ๊ฐ’(Value)์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ˆ์š”.

import java.util.HashMap;

public class HashMapExample {
    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.get("์‚ฌ๊ณผ"));
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

์‚ฌ๊ณผ ๊ฐ€๊ฒฉ: 1000

โœ… put(key, value) โ†’ ํ‚ค-๊ฐ’ ์ €์žฅ

โœ… get(key) โ†’ ํŠน์ • ํ‚ค์˜ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ


34. TreeMap (์ž๋™ ์ •๋ ฌ๋˜๋Š” Map)

TreeMap์€ ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž๋™ ์ •๋ ฌ๋˜๋Š” Map์ด์—์š”.

import java.util.TreeMap;

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

        map.put(3, "์‚ฌ๊ณผ");
        map.put(1, "๋ฐ”๋‚˜๋‚˜");
        map.put(2, "์ฒด๋ฆฌ");

        System.out.println("TreeMap: " + map);
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

TreeMap: {1=๋ฐ”๋‚˜๋‚˜, 2=์ฒด๋ฆฌ, 3=์‚ฌ๊ณผ}

โœ… TreeMap์€ ์ž๋™์œผ๋กœ Key๋ฅผ ์ •๋ ฌ


35. Collections ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ™œ์šฉ

๐Ÿ“Œ ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ (Collections.sort())

import java.util.ArrayList;
import java.util.Collections;

public class SortExample {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(30);
        list.add(10);
        list.add(20);

        Collections.sort(list);
        System.out.println("์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ: " + list);

        Collections.sort(list, Collections.reverseOrder());
        System.out.println("๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ: " + list);
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ: [10, 20, 30]
๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ: [30, 20, 10]

โœ… Collections.sort() โ†’ ๋ฆฌ์ŠคํŠธ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ

โœ… Collections.reverseOrder() โ†’ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ


36. ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ •๋ฆฌ

์ปฌ๋ ‰์…˜ ํŠน์ง• ์ฃผ์š” ๋ฉ”์„œ๋“œ
ArrayList ์ˆœ์„œ ์œ ์ง€, ์ค‘๋ณต ํ—ˆ์šฉ add(), get(), remove(), size()
LinkedList ์‚ฝ์ž…/์‚ญ์ œ ๋น ๋ฆ„ addFirst(), addLast(), removeFirst()
HashSet ์ค‘๋ณต ์ œ๊ฑฐ, ์ˆœ์„œ ์—†์Œ add(), remove(), contains()
TreeSet ์ž๋™ ์ •๋ ฌ๋˜๋Š” Set add(), first(), last()
HashMap ํ‚ค-๊ฐ’ ์ €์žฅ put(), get(), remove()
TreeMap ํ‚ค ์ž๋™ ์ •๋ ฌ put(), get(), firstKey()

37. ํŒŒ์ผ ์ž…์ถœ๋ ฅ(File I/O)์ด๋ž€?

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

๐Ÿ“Œ ํŒŒ์ผ ์ž…์ถœ๋ ฅ ์ฃผ์š” ํด๋ž˜์Šค

ํด๋ž˜์Šค ๊ธฐ๋Šฅ
File ํŒŒ์ผ ์ •๋ณด ํ™•์ธ (์กด์žฌ ์—ฌ๋ถ€, ํฌ๊ธฐ ๋“ฑ)
FileWriter ํ…์ŠคํŠธ ํŒŒ์ผ ์“ฐ๊ธฐ (์ถœ๋ ฅ)
FileReader ํ…์ŠคํŠธ ํŒŒ์ผ ์ฝ๊ธฐ (์ž…๋ ฅ)
BufferedWriter ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์“ฐ๊ธฐ (์„ฑ๋Šฅ ํ–ฅ์ƒ)
BufferedReader ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์ฝ๊ธฐ (์„ฑ๋Šฅ ํ–ฅ์ƒ)
FileInputStream ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ์ฝ๊ธฐ (์ด๋ฏธ์ง€, ์˜์ƒ ๋“ฑ)
FileOutputStream ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ์“ฐ๊ธฐ (์ด๋ฏธ์ง€, ์˜์ƒ ๋“ฑ)

38. ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ํ™•์ธ (File ํด๋ž˜์Šค)

import java.io.File;
import java.io.IOException;

public class FileExample {
    public static void main(String[] args) {
        File file = new File("test.txt");

        try {
            if (file.createNewFile()) {
                System.out.println("ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
            } else {
                System.out.println("ํŒŒ์ผ์ด ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

โœ… file.createNewFile() โ†’ ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์ƒ์„ฑ

โœ… IOException โ†’ ์ž…์ถœ๋ ฅ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ try-catch ์‚ฌ์šฉ


39. ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ (FileWriter)

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

public class WriteFileExample {
    public static void main(String[] args) {
        try {
            FileWriter writer = new FileWriter("test.txt");
            writer.write("์•ˆ๋…•ํ•˜์„ธ์š”! ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์”๋‹ˆ๋‹ค.");
            writer.close();
            System.out.println("ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

โœ… write("๋‚ด์šฉ") โ†’ ํŒŒ์ผ์— ๋ฌธ์ž์—ด์„ ์”€

โœ… close() โ†’ ํŒŒ์ผ์„ ๋‹ซ์•„์•ผ ์ €์žฅ๋จ


40. ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ (FileReader)

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

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

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ

์•ˆ๋…•ํ•˜์„ธ์š”! ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์”๋‹ˆ๋‹ค.

โœ… read() โ†’ ํŒŒ์ผ์—์„œ ํ•œ ๊ธ€์ž์”ฉ ์ฝ์Œ

โœ… -1์ด ๋‚˜์˜ค๋ฉด ํŒŒ์ผ ๋ (EOF)


41. ํŒŒ์ผ์„ ํ•œ ์ค„์”ฉ ์ฝ๊ธฐ (BufferedReader)

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

public class BufferedReadExample {
    public static void main(String[] args) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader("test.txt"));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

โœ… readLine() โ†’ ํ•œ ์ค„์”ฉ ์ฝ์–ด์„œ ์ถœ๋ ฅ

โœ… BufferedReader โ†’ ์„ฑ๋Šฅ์ด ๋” ๋น ๋ฆ„


42. ํŒŒ์ผ ๋ณต์‚ฌํ•˜๊ธฐ (FileInputStream & FileOutputStream)

์ด๋ฏธ์ง€, ๋™์˜์ƒ ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ(2์ง„์ˆ˜ ๋ฐ์ดํ„ฐ)์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉํ•ด์š”.

import java.io.*;

public class FileCopyExample {
    public static void main(String[] args) {
        try {
            FileInputStream input = new FileInputStream("source.jpg");
            FileOutputStream output = new FileOutputStream("copy.jpg");

            byte[] buffer = new byte[1024];
            int length;
            while ((length = input.read(buffer)) != -1) {
                output.write(buffer, 0, length);
            }

            input.close();
            output.close();
            System.out.println("ํŒŒ์ผ ๋ณต์‚ฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

โœ… FileInputStream โ†’ ํŒŒ์ผ์„ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ฝ๊ธฐ

โœ… FileOutputStream โ†’ ํŒŒ์ผ์„ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์“ฐ๊ธฐ


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

๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ปดํ“จํ„ฐ ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ธฐ์ˆ ์ด์—์š”.

Java๋Š” Socket๊ณผ ServerSocket์„ ์‚ฌ์šฉํ•ด ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ“Œ ์ž์ฃผ ์“ฐ๋Š” ๋„คํŠธ์›Œํฌ API

ํด๋ž˜์Šค ์—ญํ• 
Socket ํด๋ผ์ด์–ธํŠธ ์—ญํ•  (์„œ๋ฒ„์— ์—ฐ๊ฒฐ)
ServerSocket ์„œ๋ฒ„ ์—ญํ•  (ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ˆ˜๋ฝ)
InetAddress IP ์ฃผ์†Œ ๊ด€๋ จ ์ •๋ณด ์ฒ˜๋ฆฌ

44. ๊ฐ„๋‹จํ•œ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ (ServerSocket)

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

public class SimpleServer {
    public static void main(String[] args) {
        try {
            ServerSocket server = new ServerSocket(12345);
            System.out.println("์„œ๋ฒ„๊ฐ€ 12345๋ฒˆ ํฌํŠธ์—์„œ ์‹คํ–‰ ์ค‘...");

            Socket socket = server.accept();
            System.out.println("ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ๋จ!");

            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message = input.readLine();
            System.out.println("ํด๋ผ์ด์–ธํŠธ: " + message);

            input.close();
            socket.close();
            server.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

โœ… ServerSocket(12345) โ†’ 12345๋ฒˆ ํฌํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ๋Œ€๊ธฐ

โœ… accept() โ†’ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ํ—ˆ์šฉ

โœ… readLine() โ†’ ํด๋ผ์ด์–ธํŠธ ๋ฉ”์‹œ์ง€ ์ฝ๊ธฐ


45. ๊ฐ„๋‹จํ•œ ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ (Socket)

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

public class SimpleClient {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 12345);
            System.out.println("์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!");

            BufferedWriter output = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            output.write("์•ˆ๋…•ํ•˜์„ธ์š”, ์„œ๋ฒ„!\n");
            output.flush();

            output.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

โœ… Socket("localhost", 12345) โ†’ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ

โœ… write("๋ฉ”์‹œ์ง€") โ†’ ์„œ๋ฒ„์— ๋ฉ”์‹œ์ง€ ์ „์†ก


46. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ(Multithreading)์ด๋ž€?

๐Ÿ“Œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ(Multithreading)์€ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๊ธฐ์ˆ ์ด์—์š”.

โœ… ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ(Single Thread): ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์‹คํ–‰ (์ˆœ์ฐจ์  ์‹คํ–‰)

โœ… ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ(Multi Thread): ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ (๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ)

๐Ÿ’ก ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ:


47. Java์—์„œ ์Šค๋ ˆ๋“œ(Thread) ์ƒ์„ฑ ๋ฐฉ๋ฒ•

Java์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์š”.

  1. Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ธฐ
  2. Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ (์ถ”์ฒœ)

1) Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ๋ฐฉ๋ฒ•

class MyThread extends Thread {
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(getName() + " ์‹คํ–‰ ์ค‘: " + i);
            try {
                Thread.sleep(1000); // 1์ดˆ ๋Œ€๊ธฐ
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class ThreadExample {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();

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

๐Ÿ”น ์‹คํ–‰ ๊ฒฐ๊ณผ (์˜ˆ์‹œ, ์‹คํ–‰๋งˆ๋‹ค ๋‹ค๋ฆ„)

Thread-0 ์‹คํ–‰ ์ค‘: 1
Thread-1 ์‹คํ–‰ ์ค‘: 1
Thread-0 ์‹คํ–‰ ์ค‘: 2
Thread-1 ์‹คํ–‰ ์ค‘: 2

โœ… start() โ†’ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ (์ž๋™์œผ๋กœ run() ํ˜ธ์ถœ)

โœ… sleep(1000) โ†’ 1์ดˆ ๋™์•ˆ ๋ฉˆ์ถค

โœ… getName() โ†’ ์Šค๋ ˆ๋“œ ์ด๋ฆ„ ์ถœ๋ ฅ


2) Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• (์ถ”์ฒœ)

Runnable์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„๋ฅผ ๋” ์œ ์—ฐํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

class MyRunnable implements Runnable {
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + " ์‹คํ–‰ ์ค‘: " + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class RunnableExample {
    public static void main(String[] args) {
        Thread t1 = new Thread(new MyRunnable());
        Thread t2 = new Thread(new MyRunnable());

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

โœ… Runnable์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์ค‘ ์ƒ์† ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์–ด ๋” ์œ ์—ฐํ•จ


48. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ (๋™๊ธฐํ™” ๋ฌธ์ œ)

์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”.

class Counter {
    private int count = 0;

    public void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}

public class RaceConditionExample {
    public static void main(String[] args) {
        Counter counter = new Counter();

        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) counter.increment();
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) counter.increment();
        });

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

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("์ตœ์ข… ์นด์šดํŠธ: " + counter.getCount()); // ์˜ˆ์ƒ: 2000, ์‹ค์ œ: ???
    }
}

๐Ÿ”น ๋ฌธ์ œ์ 


49. synchronized๋ฅผ ์‚ฌ์šฉํ•ด ๋™๊ธฐํ™” ๋ฌธ์ œ ํ•ด๊ฒฐ

class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

โœ… synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ


50. ExecutorService๋ฅผ ์ด์šฉํ•œ ์Šค๋ ˆ๋“œ ํ’€(Thread Pool)

์Šค๋ ˆ๋“œ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋ฉด ์ž์› ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”.

๊ทธ๋ž˜์„œ Java์—์„œ๋Š” ExecutorService๋ฅผ ์‚ฌ์šฉํ•ด ์Šค๋ ˆ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(3); // ์Šค๋ ˆ๋“œ 3๊ฐœ

        for (int i = 1; i <= 10; i++) {
            final int taskNumber = i;
            executor.execute(() -> {
                System.out.println("์ž‘์—… " + taskNumber + " ์‹คํ–‰ (์Šค๋ ˆ๋“œ: " + Thread.currentThread().getName() + ")");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        executor.shutdown(); // ์ž‘์—… ์™„๋ฃŒ ํ›„ ์ข…๋ฃŒ
    }
}

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

์ž‘์—… 1 ์‹คํ–‰ (์Šค๋ ˆ๋“œ: pool-1-thread-1)
์ž‘์—… 2 ์‹คํ–‰ (์Šค๋ ˆ๋“œ: pool-1-thread-2)
์ž‘์—… 3 ์‹คํ–‰ (์Šค๋ ˆ๋“œ: pool-1-thread-3)
...

โœ… Executors.newFixedThreadPool(3) โ†’ ์Šค๋ ˆ๋“œ 3๊ฐœ๋งŒ ์‚ฌ์šฉ

โœ… execute() โ†’ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์Šค๋ ˆ๋“œ์— ์ „๋‹ฌ

โœ… shutdown() โ†’ ๋ชจ๋“  ์ž‘์—… ์™„๋ฃŒ ํ›„ ์ข…๋ฃŒ


51. Java ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์š”์•ฝ

๊ฐœ๋… ์„ค๋ช…
Thread ์ง์ ‘ ์ƒ์†ํ•˜์—ฌ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ
Runnable ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ (์ถ”์ฒœ)
synchronized ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ (๊ฒฝ์Ÿ ์กฐ๊ฑด ํ•ด๊ฒฐ)
ExecutorService ์Šค๋ ˆ๋“œ ํ’€ ์‚ฌ์šฉ (์ž์› ํšจ์œจ์  ์‚ฌ์šฉ)


52. JDBC(Java Database Connectivity)๋ž€?

๐Ÿ“Œ JDBC๋Š” Java์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๋Š” ํ‘œ์ค€ API

โœ… ๋ฐ์ดํ„ฐ ์กฐํšŒ(SELECT)

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

โœ… ๋ฐ์ดํ„ฐ ์ˆ˜์ •(UPDATE)

โœ… ๋ฐ์ดํ„ฐ ์‚ญ์ œ(DELETE)


53. JDBC ์„ค์ •ํ•˜๊ธฐ (MySQL ์—ฐ๋™)

MySQL๊ณผ Java๋ฅผ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด JDBC ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํ•„์š”ํ•ด์š”.

1) MySQL JDBC ๋“œ๋ผ์ด๋ฒ„ ๋‹ค์šด๋กœ๋“œ

๐Ÿ‘‰ MySQL Connector/J ๋‹ค์šด๋กœ๋“œ

2) JDBC ๋“œ๋ผ์ด๋ฒ„ ์ถ”๊ฐ€ (Maven ํ”„๋กœ์ ํŠธ)

pom.xml ํŒŒ์ผ์— MySQL JDBC ๋“œ๋ผ์ด๋ฒ„ ์ถ”๊ฐ€

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>  <!-- ์ตœ์‹  ๋ฒ„์ „ ํ™•์ธ -->
    </dependency>
</dependencies>

3) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด

MySQL์— ์—ฐ๊ฒฐํ•  ๋•Œ ํ•„์š”ํ•œ ์ •๋ณด:

JDBC URL: jdbc:mysql://localhost:3306/mydatabase
์‚ฌ์šฉ์ž ์ด๋ฆ„: root
๋น„๋ฐ€๋ฒˆํ˜ธ: 1234

54. Java์—์„œ MySQL ์—ฐ๊ฒฐํ•˜๊ธฐ

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

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

        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println("๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ฑ๊ณต!");
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

โœ… DriverManager.getConnection() โ†’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ

โœ… conn.close() โ†’ ์—ฐ๊ฒฐ ์ข…๋ฃŒ


55. ๋ฐ์ดํ„ฐ ์กฐํšŒ(SELECT)

import java.sql.*;

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

        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            String sql = "SELECT * FROM users";
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);

            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String email = rs.getString("email");
                System.out.println("ID: " + id + ", ์ด๋ฆ„: " + name + ", ์ด๋ฉ”์ผ: " + email);
            }

            rs.close();
            stmt.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

โœ… executeQuery(sql) โ†’ SELECT ์‹คํ–‰

โœ… rs.next() โ†’ ๊ฒฐ๊ณผ ํ–‰์„ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์˜ค๊ธฐ

โœ… getInt("id") / getString("name") โ†’ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ


56. ๋ฐ์ดํ„ฐ ์‚ฝ์ž…(INSERT)

import java.sql.*;

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

        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
            PreparedStatement pstmt = conn.prepareStatement(sql);

            pstmt.setString(1, "ํ™๊ธธ๋™");
            pstmt.setString(2, "hong@example.com");

            int rows = pstmt.executeUpdate();
            if (rows > 0) {
                System.out.println("๋ฐ์ดํ„ฐ ์‚ฝ์ž… ์„ฑ๊ณต!");
            }

            pstmt.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

โœ… PreparedStatement โ†’ SQL ์ธ์ ์…˜ ๋ฐฉ์ง€ (๋ณด์•ˆ ๊ฐ•ํ™”)

โœ… executeUpdate() โ†’ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ(INSERT, UPDATE, DELETE) ์ˆ˜ํ–‰


57. ๋ฐ์ดํ„ฐ ์ˆ˜์ •(UPDATE)

String sql = "UPDATE users SET email = ? WHERE name = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "hong_new@example.com");
pstmt.setString(2, "ํ™๊ธธ๋™");

โœ… ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์ด๋ฉ”์ผ์„ ๋ณ€๊ฒฝ


58. ๋ฐ์ดํ„ฐ ์‚ญ์ œ(DELETE)

String sql = "DELETE FROM users WHERE name = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "ํ™๊ธธ๋™");

โœ… ํŠน์ • ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ


59. ํŠธ๋žœ์žญ์…˜(Transaction) ์ฒ˜๋ฆฌ

ํŠธ๋žœ์žญ์…˜์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ SQL ์ž‘์—…์„ ํ•˜๋‚˜์˜ ์ž‘์—…์ฒ˜๋Ÿผ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด์—์š”.

conn.setAutoCommit(false);  // ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘

try {
    String sql1 = "UPDATE accounts SET balance = balance - 500 WHERE id = 1";
    String sql2 = "UPDATE accounts SET balance = balance + 500 WHERE id = 2";

    Statement stmt = conn.createStatement();
    stmt.executeUpdate(sql1);
    stmt.executeUpdate(sql2);

    conn.commit();  // ๋ชจ๋“  ์ž‘์—… ์„ฑ๊ณต ์‹œ ์ €์žฅ
    System.out.println("์†ก๊ธˆ ์™„๋ฃŒ!");
} catch (SQLException e) {
    conn.rollback();  // ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์›๋ž˜ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ
    e.printStackTrace();
}

โœ… setAutoCommit(false) โ†’ ์ˆ˜๋™ ์ปค๋ฐ‹ ๋ชจ๋“œ ์„ค์ •

โœ… commit() โ†’ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ €์žฅ

โœ… rollback() โ†’ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์›๋ž˜ ์ƒํƒœ๋กœ ๋ณต๊ตฌ


60. JDBC + DAO ํŒจํ„ด ์‚ฌ์šฉ (๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)

DAO(Data Access Object)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.

1) UserDAO ํด๋ž˜์Šค (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ฐ ์ฟผ๋ฆฌ ์‹คํ–‰)

import java.sql.*;

public class UserDAO {
    private Connection conn;

    public UserDAO() throws SQLException {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String user = "root";
        String password = "1234";
        conn = DriverManager.getConnection(url, user, password);
    }

    public void addUser(String name, String email) throws SQLException {
        String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
        PreparedStatement pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, name);
        pstmt.setString(2, email);
        pstmt.executeUpdate();
        pstmt.close();
    }

    public void close() throws SQLException {
        conn.close();
    }
}

2) Main ํด๋ž˜์Šค (์‹ค์ œ ์‚ฌ์šฉ)

public class Main {
    public static void main(String[] args) {
        try {
            UserDAO dao = new UserDAO();
            dao.addUser("์ด์ˆœ์‹ ", "lee@example.com");
            System.out.println("์‚ฌ์šฉ์ž ์ถ”๊ฐ€ ์™„๋ฃŒ!");
            dao.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

โœ… DAO ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋” ๊น”๋”ํ•ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง



61. Spring Framework๋ž€?

๐Ÿ“Œ Spring์€ Java ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

โœ… ์›น ์„œ๋ฒ„ ๊ตฌ์ถ• ๊ฐ€๋Šฅ (Spring Boot)

โœ… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ๊ฐ€๋Šฅ (Spring Data JPA)

โœ… REST API ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ (Spring Web)

โœ… ์˜์กด์„ฑ ๊ด€๋ฆฌ ํŽธ๋ฆฌ (Spring Boot Starter)


62. Spring Boot ํ”„๋กœ์ ํŠธ ์„ค์ •

Spring Boot๋Š” Spring์„ ์‰ฝ๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์˜ˆ์š”.

๐Ÿ“Œ Spring Boot ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐฉ๋ฒ•

  1. Spring Initializr์—์„œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
  2. Spring Web, Spring Boot DevTools, Lombok, Spring Data JPA, MySQL Driver ์„ ํƒ
  3. ๋‹ค์šด๋กœ๋“œ ํ›„ Maven ํ”„๋กœ์ ํŠธ ์‹คํ–‰

๐Ÿ“Œ Maven pom.xml์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

<dependencies>
    <!-- Spring Boot ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (JPA + MySQL) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

๐Ÿ“Œ Spring Boot ์‹คํ–‰

ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด ์‹คํ–‰

mvn spring-boot:run

โœ… ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๋ฉด http://localhost:8080์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ


63. Spring Boot์—์„œ REST API ๋งŒ๋“ค๊ธฐ

REST API๋Š” ํด๋ผ์ด์–ธํŠธ(React, Vue, Android)์™€ ์„œ๋ฒ„(Spring Boot) ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ์‹์ด์—์š”.


1) Hello World API ๋งŒ๋“ค๊ธฐ

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class HelloController {

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

โœ… @RestController โ†’ REST API๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ

โœ… @RequestMapping("/api") โ†’ ๊ธฐ๋ณธ URL ์„ค์ •

โœ… @GetMapping("/hello") โ†’ GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” API

๐Ÿ“Œ ์‹คํ–‰ ํ›„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ™•์ธ

๐Ÿ‘‰ http://localhost:8080/api/hello

Hello, Spring Boot!

2) JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” API ๋งŒ๋“ค๊ธฐ

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/user")
    public Map<String, String> getUser() {
        Map<String, String> user = new HashMap<>();
        user.put("name", "ํ™๊ธธ๋™");
        user.put("email", "hong@example.com");
        return user;
    }
}

โœ… JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค๋ฉด Map ๋˜๋Š” DTO ๊ฐ์ฒด ์‚ฌ์šฉ

๐Ÿ“Œ ์‹คํ–‰ ํ›„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ™•์ธ

๐Ÿ‘‰ http://localhost:8080/api/user

{
    "name": "ํ™๊ธธ๋™",
    "email": "hong@example.com"
}

64. Spring Boot์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™

Spring Boot์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(MySQL)๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์•„์š”.

JPA๋Š” SQL ์—†์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ์ˆ ์ด์—์š”.


1) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ • (application.properties)

๐Ÿ“Œ src/main/resources/application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

โœ… ddl-auto=update โ†’ ์ž๋™์œผ๋กœ ํ…Œ์ด๋ธ” ์ƒ์„ฑ


2) ์—”ํ„ฐํ‹ฐ(Entity) ๋งŒ๋“ค๊ธฐ

import jakarta.persistence.*;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž & Getter/Setter
    public User() {}
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
    public Long getId() { return id; }
    public String getName() { return name; }
    public String getEmail() { return email; }
}

โœ… @Entity โ†’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘

โœ… @Id โ†’ ๊ธฐ๋ณธ ํ‚ค(PK) ์„ค์ •

โœ… @GeneratedValue โ†’ ์ž๋™ ์ฆ๊ฐ€(AUTO_INCREMENT)


3) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ €์žฅ์†Œ (Repository) ๋งŒ๋“ค๊ธฐ

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}

โœ… JpaRepository<User, Long> โ†’ ์ž๋™์œผ๋กœ CRUD ๊ธฐ๋Šฅ ์ œ๊ณต


4) REST API (์‚ฌ์šฉ์ž ์ถ”๊ฐ€ ๋ฐ ์กฐํšŒ)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api")
public class UserController {
    @Autowired
    private UserRepository userRepository;

    // ๋ชจ๋“  ์‚ฌ์šฉ์ž ์กฐํšŒ
    @GetMapping("/users")
    public List<User> getUsers() {
        return userRepository.findAll();
    }

    // ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์ถ”๊ฐ€
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }
}

โœ… @GetMapping("/users") โ†’ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์กฐํšŒ

โœ… @PostMapping("/users") โ†’ ์ƒˆ ์‚ฌ์šฉ์ž ์ถ”๊ฐ€

๐Ÿ“Œ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

  1. GET ์š”์ฒญ: ๋ชจ๋“  ์‚ฌ์šฉ์ž ์กฐํšŒ

    ๐Ÿ‘‰ http://localhost:8080/api/users

  2. POST ์š”์ฒญ: ์ƒˆ ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ (JSON ๋ฐ์ดํ„ฐ ์ „์†ก)

     {
         "name": "์ด์ˆœ์‹ ",
         "email": "lee@example.com"
     }
    

    ๐Ÿ‘‰ Postman ๋˜๋Š” cURL ์‚ฌ์šฉ


65. Spring Boot REST API ์ •๋ฆฌ

๊ธฐ๋Šฅ ์„ค๋ช…
@RestController REST API๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ
@RequestMapping("/api") ๊ธฐ๋ณธ URL ์„ค์ •
@GetMapping("/users") GET ์š”์ฒญ ์ฒ˜๋ฆฌ (์กฐํšŒ)
@PostMapping("/users") POST ์š”์ฒญ ์ฒ˜๋ฆฌ (๋ฐ์ดํ„ฐ ์ถ”๊ฐ€)
@Autowired ์˜์กด์„ฑ ์ฃผ์ž…
JpaRepository<User, Long> ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž๋™ ๊ด€๋ฆฌ

์ด์ œ Spring Boot๋ฅผ ํ™œ์šฉํ•œ REST API ๊ฐœ๋ฐœ์„ ์ž์œ ๋กญ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽ‰

๋‹ค์Œ์œผ๋กœ Spring Security(์ธ์ฆ & ๋กœ๊ทธ์ธ), OAuth, JWT, ๋ฐฐํฌ(Docker, AWS)๋„ ์„ค๋ช…ํ•ด ์ค„๊นŒ์š”? ๐Ÿš€