** ๐1๋จ๊ณ: java.lang
ํจํค์ง๋? **
๐ฆ ํจํค์ง๋?
์๋ฐ์์ ํจํค์ง(Package)๋ ์ฌ๋ฌ ๊ฐ์ ๊ด๋ จ๋ ํด๋์ค๋ค์ ๋ฌถ์ด๋๋ ํด๋ ๊ฐ์ ๊ฐ๋ ์ด์์!
์์: ํด๋ ์์ ๋ฌธ์ ํ์ผ๋ค์ด ์๋ ๊ฒ์ฒ๋ผ, ํจํค์ง ์์ ํด๋์ค๋ค์ด ๋ค์ด ์์ด์.
๐ java.lang
ํจํค์ง
- ์๋ฐ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์์ฃผ ์ค์ํ ํด๋์ค๋ค์ด ๋ชจ์ฌ ์๋ ํจํค์ง์์.
- ํน์ง:โ
import
์์ด๋ ์ฌ์ฉํ ์ ์์ด์! (์๋์ผ๋ก ํฌํจ๋จ)โObject
,String
,Math
,System
๊ฐ์ ํ์์ ์ธ ํด๋์ค๋ค์ด ๋ค์ด ์์ด์.
๐ 2๋จ๊ณ: Object
ํด๋์ค๋? ๐
๐ ๋ชจ๋ ํด๋์ค์ ๋ถ๋ชจ!
- ๋ชจ๋ ํด๋์ค๋
Object
ํด๋์ค๋ฅผ ์๋์ผ๋ก ์์๋ฐ์์.์ฆ,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)
โ ์ด์ ์ค์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ณ ์ทจ์ ์ค๋น๋ฅผ ํ๋ฉด ๋ผ์! ๐๐ฅ
๊ถ๊ธํ ์ ์ด ์์ผ๋ฉด ์ธ์ ๋ ์ง ์ง๋ฌธํด ์ฃผ์ธ์! ๐