** ๐1. ๋ ์ง์ ์๊ฐ์ ๋ค๋ฃจ๋ ์ด์ **
์ปดํจํฐ์์ ๋ ์ง์ ์๊ฐ์ ๋ค๋ฃจ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํด์. ์๋ฅผ ๋ค์ด:
โ ์ค๋ ๋ ์ง ์ถ๋ ฅํ๊ธฐ
โ ์์ผ ๊ณ์ฐํ๊ธฐ
โ ์์ฝ ์์คํ ์์ ๋ ์ง ๋น๊ตํ๊ธฐ
Java์์๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ผ๋ก ๋ ์ง๋ฅผ ๋ค๋ฃฐ ์ ์๋๋ฐ, ์ค๋์ Date
ํด๋์ค์ SimpleDateFormat
ํด๋์ค๋ฅผ ์ฌ์ฉํด์ ๋ ์ง๋ฅผ ์ถ๋ ฅํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณผ ๊ฑฐ์์! ๐
2. ๋ ์ง ์ถ๋ ฅํ๊ธฐ (Date ํด๋์ค)
Date
ํด๋์ค๋ ํ์ฌ ๋ ์ง์ ์๊ฐ์ ๊ฐ์ ธ์ค๋ ํด๋์ค์์.
Date now = new Date();
System.out.println(now);
๐น ์คํ ๊ฒฐ๊ณผ ์์
Thu Feb 15 12:30:45 KST 2024
์ฌ๊ธฐ์ ๊ฐ ๋ถ๋ถ์ ๋ค์์ ์๋ฏธํด์:
Thu
โ ์์ผ (๋ชฉ์์ผ)Feb
โ ์ (2์)15
โ ์ผ (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. ์ ๊ท ํํ์์ผ๋ก ๋น๋ฐ๋ฒํธ ์ ํจ์ฑ ๊ฒ์ฌ
๐ ์กฐ๊ฑด:
- ์ต์ 8์ ์ด์
- ํ๋ ์ด์์ ์ซ์ ํฌํจ
- ํ๋ ์ด์์ ๋๋ฌธ์ ํฌํจ
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)์ด๋?
๐ ํ์ผ ์ ์ถ๋ ฅ์?
- ์ ๋ ฅ(Input): ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๊ฒ
- ์ถ๋ ฅ(Output): ๋ฐ์ดํฐ๋ฅผ ํ์ผ์ ์ ์ฅํ๋ ๊ฒ
๐ ํ์ผ ์ ์ถ๋ ฅ ์ฃผ์ ํด๋์ค
ํด๋์ค | ๊ธฐ๋ฅ |
---|---|
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์์ ์ค๋ ๋๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ด์.
Thread
ํด๋์ค๋ฅผ ์์๋ฐ๊ธฐ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, ์ค์ : ???
}
}
๐น ๋ฌธ์ ์
count
๋ณ์๋ฅผ ๋ ๊ฐ์ ์ค๋ ๋๊ฐ ๋์์ ๋ณ๊ฒฝํ๋ฉด์ ๊ฐ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ฆ๊ฐํ์ง ์์ ์ ์์.
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 ํ๋ก์ ํธ ์์ฑ ๋ฐฉ๋ฒ
- Spring Initializr์์ ํ๋ก์ ํธ ์์ฑ
Spring Web
,Spring Boot DevTools
,Lombok
,Spring Data JPA
,MySQL Driver
์ ํ- ๋ค์ด๋ก๋ ํ 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")
โ ์ ์ฌ์ฉ์ ์ถ๊ฐ
๐ ํ ์คํธ ๋ฐฉ๋ฒ
-
GET ์์ฒญ: ๋ชจ๋ ์ฌ์ฉ์ ์กฐํ
๐ http://localhost:8080/api/users
-
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)๋ ์ค๋ช ํด ์ค๊น์? ๐