์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- ๋ฌธ์์ด
- ๋งต
- ๋ถํ ์ ๋ณต
- web
- ๋์ ํฉ
- ์๋ฎฌ๋ ์ด์
- ์์ ์ ๋ ฌ
- ๋ฐ์ดํฌ์คํธ๋ผ
- ์ต๋จ ๊ฒฝ๋ก
- JPA
- dfs
- error
- thymeleaf
- ์ด๋ถ ํ์
- OS
- CVE
- Reversing
- DP
- GCP
- ๊ตฌํ
- ๋ฐฑํธ๋ํน
- java
- ๊ทธ๋ฆฌ๋
- ์ฌ๊ท
- ์คํ
- BFS
- Spring
- dynamic debugging
- ์ฐ์ ์์ ํ
- c++
- Today
- Total
hades
[Java] ์๋ฐ ๊ธฐ์ด ๋ณธ๋ฌธ
๋ณธ ๊ธ์ ์๋ฐ๋ฅผ ํ์ตํ๋ฉด์, ํ ์ธ์ด์์ ์๊ณ ์๋ ๋ด์ฉ ์ด์ธ์ ์ถ๊ฐ๋ก ๊ธฐ์ตํ ์ฌํญ์ ์ ๋ฆฌํ์ฌ ์์ฑํ ๊ธ์ด๋ค. ์ฆ, ๋ชจ๋ ๋ด์ฉ์ ํฌํจํ๊ณ ์์ง๋ ์๋ค.
๋ณ์์ ํ์
๋ช ๋ช ๊ด๋ก
์ฝ๋๋ฅผ ์์ฑํ ๋, ์ฌ๋ฌ ๋จ์ด๋ฅผ ํผํฉํ์ฌ ๋ช ๋ช ํ๋ ๊ฒฝ์ฐ, camel case๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ธฐ๋ณธ์ผ๋ก ๋ค์ ์ํฉ์ ๋ฐ๋ผ ์ถ๊ฐํ๋ค.
์๋ฐ ์์ค ํ์ผ๋ช (ํด๋์ค๋ช )์ ๋๋ฌธ์๋ก ์์ํ๋ ๊ฒ์ด ๊ด๋ก์ด๋ค. ex) Member.java, Item.java
๋ณ์๋ช ์ ์๋ฌธ์๋ก ์์ํ๋ ๊ฒ์ด ๊ด๋ก์ด๋ค. ex) mathScore, uploadFile
๋ณ์ ์ ์ธ
๋ณ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ง์ ๋ถ์ฌ์ง ์ด๋ฆ์ด๋ค. ๋ณ์๋ฅผ ์ ์ธํ๋ค๊ณ ํด์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ ๊ฒ์ ์๋๋ค. ๋ณ์์ ๊ฐ์ ๋์ ํด์ผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ค.
int x = 3;
int y = 7;
int temp = x;
x = y;
y = temp;
System.out.println(x + " " + y); // 7 3
๋ฑํธ ์ค๋ฅธ์ชฝ์ ๊ฐ์ ์ผ์ชฝ์ ๋ณ์์ ์ ์ฅํ๋ค.
์๋ ํ์ ๋ณํ
์๋ ๊ฐ์ ๋ณด์กดํ๋ ๊ฒ์ ์ฐ์ ์ผ๋ก ํ์ฌ ํ์ ๋ณํ์ด ์ผ์ด๋๋ค. ์ฆ, ํ์ฉ ๋ฒ์๊ฐ ์์ ํ์ ์ด ํ์ฉ ๋ฒ์๊ฐ ํฐ ํ์ ์ผ๋ก ๋์ ๋ ๋, ๋ฐ์ํ๋ค. byte < short, char < int < long < float < double ์์ ๋ถ๋ฑํธ์ ์ผ์ชฝ์ ์๋ ๋ณ์์ ๊ฐ์ด ์ค๋ฅธ์ชฝ์ ์๋ ๋ณ์์ ๊ฐ์ ๋์ ๋ ๋ ๋ฐ์ํ๋ค.
๊ฐ์ ํ์ ๋ณํ
ํ์ฉ ๋ฒ์๊ฐ ํฐ ํ์ ์ ํ์ฉ ๋ฒ์๊ฐ ์์ ํ์ ์ ๋์ ํ ๊ฒฝ์ฐ, ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
int a = 3;
double b = 2.7;
a = b; // ์ค๋ฅ ๋ฐ์
์ด ๋๋ ๊ฐ์ ํ์ ๋ณํ์ด ํ์ํ๋ค. ๋ค๋ง, ์๋์ ๊ฒฝ์ฐ์ฒ๋ผ 8Byte ํฌ๊ธฐ๋ฅผ 4Byte์ ๋ฃ์ด์ผ ํ๋ฏ๋ก, ์๋ ๊ฐ์ด ๋ณด์กด๋์ง ์์ ์ ์๋ค.
int a = 3;
double b = 2.7;
a = (int)b;
์ฐ์ฐ์์์ ์๋ ํ์ ๋ณํ
int ํ์ ๋ณด๋ค ์์ byte, short ํ์ ์ ๊ฒฝ์ฐ, ์ฐ์ฐ ์ int๋ก ์๋ ํ์ ๋ณํ๋์ด ์ฐ์ฐ๋๋ค. ๋ฐ๋ผ์, ๊ฒฐ๊ณผ๊ฐ๋ int์ ์ ์ฅํด์ผ ํ๋ค. ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด, ์ ์ ์ฐ์ฐ์์ int ๋ณ์๋ก ์ ์ธํ๊ณ ์ฐ์ฐํ๋ ๊ฒ์ด ํ์ ๋ณํ์ด ์ผ์ด๋์ง ์๊ธฐ ๋๋ฌธ์ ์คํ ์ฑ๋ฅ์ ๋์์ด ๋๋ค.
์ ์์ ๊ฒฝ์ฐ์๋ ์ต์๊ฐ int, ์ค์์ธ ๊ฒฝ์ฐ์๋ ์ต์๊ฐ double์ด๋ฉฐ, ์ด์ธ์๋ ํฐ ๋ฒ์์ ํ์ ์ผ๋ก ์๋ ๋ณํ๋์ด ์ฐ์ฐ๋๋ค.
์ฐ์ฐ์ด ๋จผ์ ์ด๋ฃจ์ด์ง๊ณ , ๋์ ์ด ์ด๋ฃจ์ด์ง๋ค๋ ๊ฒ์ ์ ์ํด์ผ ํ๋ค.
int a = 1;
int b = 2;
double c = a / b;
System.out.println("c = " + c); // 0.0
+ ์ฐ์ฐ์๋ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค. ํผ์ฐ์ฐ์๊ฐ ๋ชจ๋ ์ซ์์ธ ๊ฒฝ์ฐ์๋ ๋ง์ ์ฐ์ฐ์ ์ํํ์ง๋ง, ๋ ์ค ํ๋๊ฐ ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ์๋ ๋๋จธ์ง ํผ์ฐ์ฐ์๊ฐ ๋ฌธ์์ด๋ก ๋ณํ๋์ด ๊ฒฐํฉ ์ฐ์ฐ์ ์ํํ๋ค. ๋จผ์ ์ํ๋ ์ฐ์ฐ์ด ๋ง์ ์ฐ์ฐ์ด๋ผ๋ฉด, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ + ์ฐ์ฐ์ ํ๋ค๋ ๊ฒ์ ์ ์ํด์ผ ํ๋ค.
String a = 1 + 2 + "3";
System.out.println("a = " + a); // 33
๋ฌธ์์ด์ ๊ธฐ๋ณธ ํ์ ์ผ๋ก ๋ณํ
๋ฌธ์์ด์ ๊ธฐ๋ณธ ํ์ ์ผ๋ก ๋ณํํ๊ณ ์ถ์ ๊ฒฝ์ฐ, TYPE.parseTYPE(str)์ ์ด์ฉํ๋ค.
String str = "1234";
int value = Integer.parseInt(str);
๊ธฐ๋ณธ ํ์ ์ ๋ฌธ์์ด๋ก ๋ฐ๊พธ๊ณ ์ถ์ ๊ฒฝ์ฐ, String.valueOf()๋ฅผ ์ด์ฉํ๋ค.
int value = 1234;
String str = String.valueOf(value);
์ฐธ์กฐ ํ์
๋ฐ์ดํฐ ํ์ ๋ถ๋ฅ
์๋ฐ์ ๋ฐ์ดํฐ ํ์ ์ ํฌ๊ฒ ๊ธฐ๋ณธ ํ์ (primitive type)๊ณผ ์ฐธ์กฐ ํ์ (reference type)์ผ๋ก ๋ถ๋ฅ๋๋ค.

๊ธฐ๋ณธ ํ์ ์ผ๋ก ์ ์ธ๋ ๋ณ์๋ ๊ฐ ์์ฒด๋ฅผ ์ ์ฅํ์ง๋ง, ์ฐธ์กฐ ํ์ ์ผ๋ก ์ ์ธ๋ ๋ณ์๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฒ์ง๋ฅผ ์ ์ฅํ๋ค.
๋ณ์๋ค์ ๋ชจ๋ ์คํ์ด๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์์ฑ๋๊ณ , ์ฐธ์กฐ ํ์ ๋ณ์๋ ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ฐ์ฒด ๋ฒ์ง๋ฅผ ์ ์ฅํ์ฌ ์ฐธ์กฐํ๋ค.
์ฐธ์กฐ ํ์ ๋ณ์์ ==, != ์ฐ์ฐ
==, != ์ฐ์ฐ์๋ ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ด ๊ฐ์์ง, ์๋์ง๋ฅผ ์กฐ์ฌํ๋ค. ์ฐธ์กฐ ํ์ ๋ณ์์ ๊ฐ์ ์ฐธ์กฐํ๋ ๊ฐ์ฒด์ ๋ฒ์ง์ด๋ฏ๋ก, ๋ฒ์ง๋ฅผ ๋น๊ตํ๊ฒ ๋๋ค. ๋ฒ์ง๊ฐ ๊ฐ๋ค๋ฉด, ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด๊ณ , ๋ค๋ฅด๋ค๋ฉด ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด๋ค.
int[] arr1 = new int[]{1,2,3};
int[] arr2 = new int[]{1,2,3};
int[] arr3 = arr1;
System.out.println(arr1==arr2); // false
System.out.println(arr1==arr3); // true
null๊ณผ NullPointerException
์ฐธ์กฐ ํ์ ๋ณ์๊ฐ ์์ง ๋ฒ์ง๋ฅผ ์ ์ฅํ๊ณ ์์ง ์๋ค๋ ๋ป์ผ๋ก null์ ์ ์ฅํ ์ ์๋ค. ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ณ์๋ฅผ ๊ฐ๋ฅดํค์ง ์๊ณ , ์คํ์ ์ ์ฅ๋ ์ํ๋ก ์๋ค.
๋ฒ์ง๋ฅผ ์ ์ฅํ๊ณ ์์ง ์๊ณ , null์ด ์ ์ฅ๋ ์ฐธ์กฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด, NullPointerException์ด ๋ฐ์ํ๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด, ์๋ํ ๊ฐ์ ๋์ ํด์ฃผ์ด์ผ ํ๋ค.
๋ฒ์ง๋ฅผ ์ฐธ์กฐํ๋ ๋ณ์๊ฐ null์ด ๋์ ๋์ด ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์๋ ๊ฐ์ฒด๊ฐ ๋ ์ด์ ์ฌ์ฉ๋๊ณ ์๋ ๊ณณ์ด ์์ผ๋ฉด, ์๋ฐ๋ ์ด๋ฐ ๊ฐ์ฒด๋ฅผ ์ฐ๋ ๊ธฐ ์ทจ๊ธํ๊ณ , ์๋ ์ ๊ฑฐํ๋ค.
String hobby = "์ฌํ";
hobby = "์๋ฉด"; // "์ฌํ" ๊ฐ์ฒด๋ ์ฐ๋ ๊ธฐ ๊ฐ์ฒด๊ฐ ๋์ด ์ ๊ฑฐ๋๋ค.
๋ฌธ์์ด ํ์
๋ฌธ์์ด ๋น๊ต
์๋ฐ๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ด ๋์ผํ๋ค๋ฉด, ๊ฐ์ String ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๋๋ก ์ค๊ณ๋์ด ์๋ค.
String name1 = "์ ์งฑ๊ตฌ";
String name2 = "์ ์งฑ๊ตฌ";
System.out.println(name1 == name2); // true
new ์ฐ์ฐ์๋ก ์๋ก์ด String ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋์ ํ ์๋ ์๋ค. ์ด ๋๋ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ๊ณต์ ํ์ง ์๋๋ค.
String name1 = new String("์ ์งฑ๊ตฌ");
String name2 = new String("์ ์งฑ๊ตฌ");
System.out.println(name1 == name2); // false
์ฐธ์กฐ์ ์๊ด์์ด ๋ด๋ถ ๋ฌธ์์ด๋ง ๋น๊ตํ๋ ค๊ณ ํ ๋๋ equals() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค.
String name1 = new String("์ ์งฑ๊ตฌ");
String name2 = new String("์ ์งฑ๊ตฌ");
System.out.println(name1.equals(name2)); // true
๋ฌธ์ ์ถ์ถ
๋ฌธ์์ด์์ ํน์ ์์น์ ๋ฌธ์๋ฅผ ์ป๊ณ ์ถ์ ๋๋ charAt() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
String str = "์๋
ํ์ธ์~";
char charValue = str.charAt(2);
System.out.println("charValue = " + charValue);
๋ฌธ์์ด ๋์ฒด
๊ธฐ์กด ๋ฌธ์์ด์๋ ๋ณํจ์์ด ๋์ฒด๊ฐ ์ ์ฉ๋ ์๋ก์ด ๋ฌธ์์ด์ ๋ฐํํ๋ค.
String oldStr = "์๋ฐ์๋ฐ์๋ฐ";
String newStr = oldStr.replace("์๋ฐ", "JAVA");
System.out.println("newStr = " + newStr); // JAVAJAVAJAVA
๋ฌธ์์ด ์ฐพ๊ธฐ
๋ฌธ์์ด์์ ํน์ ๋ฌธ์์ด์ ์์น๋ฅผ ์ฐพ๊ณ ์ ํ ๋, indexOf() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค. ํน์ ๋ฌธ์์ด์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ, -1์ ๋ฐํํ๋ค.
String str = "์๋
ํ์ธ์. ๋ชจ๋ ๋ฐ๊ฐ์ต๋๋ค.";
int index = str.indexOf("๋ชจ๋");
System.out.println("index = " + index); // 7
๋ฌธ์์ด ๋ถ๋ฆฌ
ํน์ ๊ตฌ๋ถ์๋ฅผ ์ด์ฉํ์ฌ ๋ถ๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ, split() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค.
String str = "์๋
,๋ด์ผ,๋ณด์";
String[] arr = str.split(",");
for (String s : arr) {
System.out.println(s); // ์๋
\n๋ด์ผ\n๋ณด์
}
๋ฐฐ์ด ํ์
๋ฐฐ์ด์ ๊ด๋ก ์ ํ์ [] ๋ณ์; ํํ๋ก ์ ์ธํ๋ค.
๊ฐ์ด ์๋ ๋ฐฐ์ด๋ก ์ด๊ธฐํํ๊ณ ์ถ์ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค. ๋ฐฐ์ด ๋ณ์๋ฅผ ๋ฏธ๋ฆฌ ์ ์ธํ ํ์ ๋์ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
int[] arr = { 1, 2, 3, 4 };
๋ฐฐ์ด์ ์ ์ธํ ์์ ๊ณผ ๊ฐ ๋ชฉ๋ก์ด ๋์ ๋๋ ์์ ์ด ๋ค๋ฅด๋ค๋ฉด, new๋ฅผ ์ฌ์ฉํ๋ค.
int[] arr = new int[] { 1, 2, 3, 4 };
๋ฐฐ์ด ๋ณต์ฌ
๋ฐ๋ณต๋ฌธ์ ์ด์ฉํ ์๋ ์์ง๋ง, System.arraycopy(์๋ณธ ๋ฐฐ์ด, ์๋ณธ ๋ฐฐ์ด์์ ์ด๋ ์ธ๋ฑ์ค๋ถํฐ, ์ ๋ฐฐ์ด, ์ ๋ฐฐ์ด์์ ์ด๋ ์ธ๋ฑ์ค๋ถํฐ, ๊ฐ์)๋ฅผ ์ด์ฉํ ์ ์๋ค.
String[] oldStrArray = {"java", "array", "copy"};
String[] newStrArray = new String[5];
System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
for (String s : newStrArray) {
System.out.println(s);
}
๋ฐ๋ณต๋ฌธ ๋จ์ํ
for (int i=0; i<newStrArray.length; i++){
System.out.println(newStrArray[i]);
}
for (String s : newStrArray) {
System.out.println(s);
}
์ด๊ฑฐ(ENUM) ํ์
์ด๊ฑฐ ์์๋ค์ ๋ชจ๋ ๋๋ฌธ์๋ก ์ฐ๋ ๊ฒ์ด ๊ด๋ก์ด๋ค.
ํด๋์ค
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํน์ง
์บก์ํ
์บก์ํ๋ ๊ฐ์ฒด์ ๋ฐ์ดํฐ(ํ๋), ๋์(๋ฉ์๋)์ ํ๋๋ก ๋ฌถ๊ณ , ์ค์ ๊ตฌํ ๋ด์ฉ์ ์ธ๋ถ์ ๊ฐ์ถ๋ ๊ฒ์ ๋งํ๋ค. ์ธ๋ถ์์๋ ๊ฐ์ฒด ๋ด๋ถ์ ๊ตฌ์กฐ๋ฅผ ์์ง ๋ชปํ๊ณ , ๊ฐ์ฒด๊ฐ ๋ ธ์ถํด์ ์ ๊ณตํ๋ ํ๋์ ๋ฉ์๋๋ง ์ฌ์ฉํ ์ ์๋ค. ex) member1.setName("์ ์งฑ๊ตฌ");
์์
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ถ๋ชจ ์ญํ ์ ์์ ๊ฐ์ฒด์ ์์ ์ญํ ์ ํ์ ๊ฐ์ฒด๊ฐ ์๋ค. ๋ถ๋ชจ ๊ฐ์ฒด๋ ์๊ธฐ๊ฐ ๊ฐ์ง๊ณ ์๋ ํ๋์ ๋ฉ์๋๋ฅผ ์์ ๊ฐ์ฒด์๊ฒ ๋ฌผ๋ ค์ฃผ์ด ์์ ๊ฐ์ฒด๊ฐ ์ฌ์ฉํ ์ ์๋๋ก ํ๋๋ฐ ์ด๋ฅผ ์์์ด๋ผ๊ณ ํ๋ค.
์์์ ํ๋ฉด, ๋ถ๋ชจ ๊ฐ์ฒด์ ํ๋์ ๋ฉ์๋๋ฅผ ์์ ๊ฐ์ฒด๊ฐ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ด ์ค๋ณต ์ฝ๋ฉ์ ํ์ง ์์๋ ๋๋ค. ๋ํ, ๋ถ๋ชจ ๊ฐ์ฒด์ ํ๋์ ๋ฉ์๋๋ฅผ ์์ ํ๋ฉด, ๋ชจ๋ ์์ ๊ฐ์ฒด๋ค์ ํ๋์ ๋ฉ์๋๋ ์์ ๋๋ฏ๋ก ์ ์ง ๋ณด์ ์ธก๋ฉด์์ ์ข๋ค.
๋คํ์ฑ
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋์ผํ์ง๋ง, ์คํ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๋์ค๋ ์ฑ์ง์ ๋งํ๋ค.
๊ฐ์ฒด์ ํด๋์ค
ํด๋์ค๋ ์งฑ๊ตฌ๋ ๋ชป๋ง๋ ค ์ผ๋ฐ ๊ทน์ฅํ์์ ๋์๋ ๊ณค์ฝ ์ธ๊ฐ ํ์ด๊ณ , ๊ฐ์ฒด๋ ๊ทธ ํ๋ก๋ถํฐ ์์ฑ๋ ๊ณค์ฝ ์ธ๊ฐ์ด๋ค.
ํด๋์ค ์ ์ธ
ํด๋์ค๋ฅผ ์ํ ์์ค ํ์ผ์ ์์ฑํ๋ฉด, ๊ณต๊ฐ ํด๋์ค๊ฐ ์์ฑ๋๋ค. ๊ณต๊ฐ ํด๋์ค๋ ์ด๋ ์์น์ ์๋ ์ง ํจํค์ง์ ์๊ด์์ด ์ฌ์ฉํ ์ ์๋ ํด๋์ค์ด๋ค. ํ๋์ ํด๋์ค ํ์ผ์๋ ๋ณต์ ๊ฐ์ ํด๋์ค๊ฐ ์์ง๋ง, ์์ค ํ์ผ๊ณผ ์ด๋ฆ์ด ๊ฐ์ ํด๋์ค๋ง ๊ณต๊ฐ ํด๋์ค๋ก ์ ์ธํ ์ ์๋ค.
public class SportsCar {
}
class Tire {
}
๋ณ๋ค๋ฅธ ์ด์ ๊ฐ ์๋ค๋ฉด, ์์ค ํ์ผ ํ๋ ๋น ํด๋์ค๋ฅผ ํ๋๋ง ์ ์ธํ๋ ๊ฒ์ด ์ข๋ค.
๊ฐ์ฒด ์์ฑ๊ณผ ํด๋์ค ๋ณ์
ํด๋์ค ๋ณ์ = new ํด๋์ค();
์์ฑ์ ์ ์ธ๊ณผ ํธ์ถ
๊ธฐ๋ณธ ์์ฑ์
ํด๋์ค์ ์์ฑ์ ์ ์ธ์ด ์์ผ๋ฉด, ๋งค๊ฐ๋ณ์๋ฅผ ํ์๋ก ํ์ง ์๋ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ค.
์์ฑ์ ์ค๋ฒ๋ก๋ฉ
public class Car {
String company = "Hyundai";
String model;
String color;
int maxSpeed;
Car() {}
Car(String model) {
this.model = model;
this.color = "silver";
this.maxSpeed = 250;
}
Car(String model, String color) {
this.model = model;
this.color = color;
this.maxSpeed = 250;
}
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
๋งค๊ฐ๋ณ์์ ํ์ ์ด๋ ๊ฐ์๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ, ์์ฑ์ ์ค๋ฒ๋ก๋ฉ์ด๋ผ๊ณ ํ๋ค. ์ ๋ฌ๋ ๋งค๊ฐ๋ณ์์ ์ผ์นํ๋ ์์ฑ์๋ฅผ ์ด์ฉํ์ฌ ์์ฑํ๋ค. ํ์ง๋ง, ์์ ๊ฒฝ์ฐ ์ค๋ณต ์ฝ๋๊ฐ ๋ง๋ค. ์ด๋ฅผ ์๋์ ๊ฐ์ด ๊ณ ์น ์ ์๋ค.
public class Car {
String company = "Hyundai";
String model;
String color;
int maxSpeed;
Car() {}
Car(String model) {
this(model, "silver", 250);
}
Car(String model, String color) {
this(model, color, 250);
}
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
๋ฉ์๋ ์ ์ธ๊ณผ ํธ์ถ
๋ฉ์๋ ๋ช ๋ช
๋ฉ์๋๋ช ์ ์ฒซ ๋ฌธ์๋ฅผ ์๋ฌธ์๋ก ์์ํ๊ณ , camel case๋ก ์์ฑํ๋ ๊ฒ์ด ๊ด๋ก์ด๋ค.
๊ฐ๋ณ๊ธธ์ด ๋งค๊ฐ๋ณ์
int sum(int ... values){
int sum = 0;
for (int value : values){
sum += value;
}
return sum;
}
ํ์ ... ๋ณ์๋ช ์ผ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ฉด, ๋ณ์๋ช ์ ๊ฐ์ง ๋ฐฐ์ด๋ก ์๋ ๋ณํ๋์ด ๋ฉ์๋์์ ์ฌ์ฉํ ์ ์๋ค.
์ธ์คํด์ค ๋ฉค๋ฒ
ํ๋์ ๋ฉ์๋๋ ์ ์ธ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ์ธ์คํด์ค ๋ฉค๋ฒ์ ์ ์ ๋ฉค๋ฒ๋ก ๊ตฌ๋ถํ ์ ์๋ค. ์ธ์คํด์ค ๋ฉค๋ฒ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์ ์ฌ์ฉํ ์ ์๊ณ , ์ ์ ๋ฉค๋ฒ๋ ๊ฐ์ฒด ์์ฑ ์์ด๋ ์ฌ์ฉํ ์ ์๋ค.
public class Car {
int gas;
public void setGas(int gas) {
this.gas = gas;
}
}
์ ํด๋์ค์์ gas ํ๋๋ ๊ฐ์ฒด๋ง๋ค ๋ฐ๋ก ์กด์ฌํ์ง๋ง, setGas ๋ฉ์๋๋ ๋ฉ์๋ ์์ญ์ด๋ผ๋ ๊ณณ์ ์ ์ฅ๋๊ณ ๊ณต์ ๋๋ค.
์ ์ ๋ฉค๋ฒ
์๋ฐ๋ ํด๋์ค ๋ก๋๋ฅผ ์ด์ฉํด์ ํด๋์ค๋ฅผ ๋ฉ์๋ ์์ญ์ ์ ์ฅํ๊ณ ์ฌ์ฉํ๋ค. ์ ์ ๋ฉค๋ฒ๋ ๋ฉ์๋ ์์ญ์ ํด๋์ค์ ๊ณ ์ ์ ์ผ๋ก ์์นํ๋ ๋ฉค๋ฒ๋ฅผ ๋งํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์์์ด ํด๋์ค๋ฅผ ํตํด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ ์ ๋ฉค๋ฒ๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
๊ฐ์ฒด๋ง๋ค ๊ฐ์ง๊ณ ์์ ํ์์ฑ์ด ์๋ ๊ณต์ฉ์ ์ธ ํ๋๋ ์ ์ ํ๋๋ก ์ ์ธํ๋ ๊ฒ์ด ์ข๋ค. ์ ์ ํ๋๋ ์ด๊น๊ฐ์ ์ฃผ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
public class Calculator {
String price;
static double pi = 3.141592;
}
๊ฒ์ฐ๊ธฐ๋ง๋ค ๊ฐ๊ฒฉ์ ๋ค๋ฅผ ์ ์๊ธฐ์ ์ธ์คํด์ค ๋ฉค๋ฒ๋ก ์ ์ธํ๊ณ , ๊ณ์ฐ๊ธฐ๊ฐ ์ฌ์ฉํ๋ pi๋ ๊ฐ์ฒด๋ง๋ค ๊ฐ์ง๊ณ ์์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ์ ๋ฉค๋ฒ๋ก ์ ์ธํ๋ค.
์ธ์คํด์ค ํ๋๋ฅผ ์ด์ฉํ์ง ์๋ ๋ฉ์๋๋ ์ ์ ๋ฉ์๋๋ก ์ ์ธํ๋ ๊ฒ์ด ์ข๋ค.
public class Calculator {
int price;
public void setPrice(int price) {
this.price = price;
}
static int plus(int x, int y){ return x + y; }
static int minus(int x, int y){ return x - y; }
}
setPrice() ๋ฉ์๋๋ ์ธ์คํด์ค ํ๋๋ฅผ ์ด์ฉํ๋ฏ๋ก ์ธ์คํด์ค ๋ฉ์๋๋ก ์ ์ธํ๊ณ , ์ธ์คํด์ค ํ๋๋ฅผ ์ฌ์ฉํ์ง ์๋ plus(), minus() ๋ฉ์๋๋ ์ ์ ๋ฉ์๋๋ก ์ ์ธํ๋ค.
์ ์ ๋ฉค๋ฒ ์ฌ์ฉ
์ ์ ๋ฉค๋ฒ๋ ํด๋์ค ์ด๋ฆ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ด ์ ์์ด๋ค.
int result1 = Calculator.plus(2, 3);
int result2 = Calculator.minus(10, 2);
์ธ์คํด์ค ๋ฉค๋ฒ ์ฌ์ฉ ๋ถ๊ฐ
์ ์ ๋ฉ์๋์ ์ ์ ๋ธ๋ก์ ๊ฐ์ฒด๊ฐ ์์ด๋ ์คํ๋๋ค๋ ํน์ง ๋๋ฌธ์ ๋ด๋ถ์ ์ธ์คํด์ค ํ๋๋ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ํ, ๊ฐ์ฒด ์์ ์ ์ฐธ์กฐ์ธ this๋ ์ฌ์ฉํ ์ ์๋ค.
final ํ๋์ ์์
์ธ์คํด์ค ํ๋์ ์ ์ ํ๋๋ ์ธ์ ๋ ์ง ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค. ํ์ง๋ง, ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ง๊ณ ์ฝ๊ธฐ๋ง ํ์ฉํด์ผ ํ ๋๊ฐ ์๋ค. ์ด ๋, final ํ๋์ ์์๋ฅผ ์ ์ธํด์ ์ฌ์ฉํ๋ค.
final ํ๋์ ์ด๊ธฐ๊ฐ์ ์ค ์ ์๋ ๋ฐฉ๋ฒ์ ํ๋๋ฅผ ์ ์ธํ ๋ ์ด๊ธฐ๊ฐ์ ๋์ ํ๊ฑฐ๋ ์์ฑ์์์ ์ด๊ธฐ๊ฐ์ ๋์ ํ๋ ๊ฒฝ์ฐ ๋ฐ์ ์๋ค.
์์๋ ๋ณดํต ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ๋ค.
static final double PI = 3.141592;
Getter์ Setter
์ธ๋ถ์์ ์ง์ ์ ์ผ๋ก ํ๋์ ์ ๊ทผํ๋ ๊ฒ์ ๋ง๊ณ , ๊ทธ ๋์ ๋ฉ์๋๋ฅผ ํตํด ํ๋์ ์ ๊ทผํ๋ ๊ฒ์ ์ ํธํ๋ค. Setter๋ฅผ ํตํด์ ๊ฐ์ ๋ณ๊ฒฝํ ๋, ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํด์ ์ ํจํ ๊ฐ์ ํ๋์ ์ ์ฅํ ์ ์๋ค.
์ ๊ทผ ์ ํ์
์ ๊ทผ ์ ํ์ | ์ ํ ๋์ | ์ ํ ๋ฒ์ |
public | ํด๋์ค, ํ๋, ์์ฑ์, ๋ฉ์๋ | ์์ |
protected | ํ๋, ์์ฑ์, ๋ฉ์๋ | ๊ฐ์ ํจํค์ง์ด๊ฑฐ๋ ์์ ๊ฐ์ฒด๋ง ์ฌ์ฉ ๊ฐ๋ฅ |
(default) | ํด๋์ค, ํ๋, ์์ฑ์, ๋ฉ์๋ | ๊ฐ์ ํจํค์ง |
private | ํ๋, ์์ฑ์, ๋ฉ์๋ | ๊ฐ์ฒด ๋ด๋ถ |
์ฑ๊ธํค ํจํด
์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๋จ ํ ๊ฐ์ ๊ฐ์ฒด๋ง ์์ฑํด์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ์ฑ๊ธํค ํจํด์ ์ ์ฉํ ์ ์๋ค. ์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ ๋๋ ์์ฑ์๋ฅผ private๋ก ์ ๊ทผ ์ ํํ์ฌ ์ธ๋ถ์์ ์์ฑ๋์ง ๋ชปํ๊ฒ ํด์ผ ํ๋ค.
public class Calculator {
private static Calculator calculator = new Calculator();
private Calculator() {};
public static Calculator getInstance() {
return calculator;
}
}
Calculator cal1 = Calculator.getInstance();
Calculator cal2 = Calculator.getInstance();
System.out.println(cal1 == cal2); // true
์์
์์ ๊ฐ๋
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋จ์์๋ ๋ถ๋ชจ ํด๋์ค์ ํ๋์ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค์๊ฒ ๋ฌผ๋ ค์ฃผ๋ ํ์๋ฅผ ๋งํ๋ค.
ํด๋์ค ์์
ํ๋ก๊ทธ๋๋ฐ์์๋ ์์ ํด๋์ค๊ฐ ์ด๋ค ๋ถ๋ชจ๋ก๋ถํฐ ์์๋ฐ์ ๊ฒ์ธ์ง๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ฒฐ์ ํ๋ค.
public class ์์ํด๋์ค extends ๋ถ๋ชจํด๋์ค {
}
๋ค๋ฅธ ์ธ์ด์ ๋ค๋ฅด๊ฒ ์๋ฐ๋ ๋ค์ค ์์์ ํ์ฉํ์ง ์๋๋ค. extends ๋ค์๋ ๋จ ํ๋์ ๋ถ๋ชจ ํด๋์ค๋ง์ด ์ฌ ์ ์๋ค.
๋ถ๋ชจ ์์ฑ์ ํธ์ถ
์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด, ์์ ์์ฑ์๊ฐ ์คํ๋๋๋ฐ, ๋งจ ์์ ์จ์ด ์๋ ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ณธ ์์ฑ์๊ฐ super()์ ์ํด์ ๋จผ์ ์คํ๋๋ค.
์์ํด๋์ค ๋ณ์ = new ์์ํด๋์ค();
public ์์ํด๋์ค() {
super(); // ์๋ต ๊ฐ๋ฅ
...
}
๋ง์ฝ, ๋ถ๋ชจ ํด๋์ค์์ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์๋ค๋ฉด, ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ด ๋๋ ๋ถ๋ชจ ํด๋์ค์ ์๋ ์์ฑ์์ ๋ง๊ฒ super์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฃ์ด ์ง์ ๋ช ์ํด์ฃผ์ด์ผ ํ๋ค.
public ์์ํด๋์ค() {
super(๋งค๊ฐ๋ณ์1, ๋งค๊ฐ๋ณ์2);
...
}
๋ฉ์๋ ์ฌ์ ์
๋ถ๋ชจ ํด๋์ค์์ ์ ์ํ ๋ชจ๋ ๋ฉ์๋๊ฐ ์์ ํด๋์ค์ ๋ง๊ฒ ์ค๊ณ๋์ด ์๋ค๋ฉด ๊ฐ์ฅ ์ด์์ ์ธ ์์์ด์ง๋ง, ์ด๋ค ๋ฉ์๋๋ ์์ ํด๋์ค๊ฐ ์ฌ์ฉํ๊ธฐ์ ์ ํฉํ์ง ์๋ค. ์ด๋ฌํ ๋ฉ์๋๋ ์์ ํด๋์ค์์ ์ฌ์ ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค. ์ด๊ฒ์ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ด๋ผ๊ณ ํ๋ค.
๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ
๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ์์๋ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค์์ ์ฌ์ ์ํ๋ ๊ฒ์ ๋งํ๋ค. ๋ฉ์๋๊ฐ ์ค๋ฒ๋ผ์ด๋ฉ๋์๋ค๋ฉด, ํด๋น ๋ถ๋ชจ ๋ฉ์๋๋ ์จ๊ฒจ์ง๊ณ , ์์ ๋ฉ์๋๊ฐ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ ๋๋ ๋ค์ ๊ท์น๋ค์ ์ฃผ์ํด์ ์์ฑํด์ผ ํ๋ค.
- ๋ถ๋ชจ ๋ฉ์๋์ ์ ์ธ๋ถ(๋ฆฌํด ํ์ , ๋ฉ์๋ ์ด๋ฆ, ๋งค๊ฐ๋ณ์)์ ๋์ผํด์ผ ํ๋ค.
- ์ ๊ทผ ์ ํ์ ๋ ๊ฐํ๊ฒ ํ ์ ์๋ค.(public์ private๋ก ๋ณ๊ฒฝ ๋ถ๊ฐ)
- ์๋ก์ด ์์ธ๋ฅผ throwsํ ์ ์๋ค.
public class Calculator {
public double areaCircle(double r){
return 3.14 * r * r;
}
}
public class Computer extends Calculator {
@Override
public double areaCircle(double r){
return Math.PI * r * r;
}
}
Calculartor์์์ ์์ ๋์ด ๊ณ์ฐ์ ์ ํ๋๊ฐ ๋ถ์กฑํ์ฌ Computer์์ ์ ํ๋๋ฅผ ๋์ธ ๋ฉ์๋๋ฅผ ์ค๋ฐ๋ผ์ด๋ฉํ์ฌ ๊ตฌํํ์๋ค. @Override๋ ์ปดํ์ผ ์ ์ ํํ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋์๋์ง ์ฒดํฌํด์ฃผ๋ ์ญํ ์ ํ๋ฉฐ ์๋ต ๊ฐ๋ฅํ๋ค.
๋ถ๋ชจ ๋ฉ์๋ ํธ์ถ
๋ฉ์๋๋ฅผ ์ ์ํ๋ฉด, ๋ถ๋ชจ ๋ฉ์๋๋ ์จ๊ฒจ์ง๊ณ ์์ ๋ฉ์๋๋ง ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋น๋ก ๋ถ๋ชจ ๋ฉ์๋์์ ์ผ๋ถ๋ง ์ถ๊ฐํ ๊ฒ์ด๋ผ๋ ์์ ๋ฉ์๋๊ฐ ๋ถ๋ชจ ๋ฉ์๋๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. ์ด๋ ๊ฒ ํ์ ๋, ์ค๋ณต ์ฝ๋๊ฐ ๋งค์ฐ ๋ง์์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ด ๋ฌธ์ ๋ ์์ ๋ฉ์๋ ๋ด์์ ๋ถ๋ชจ ๋ฉ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
public class Airplane {
public void takeOff(){
System.out.println("์ด๋ฅ");
}
public void fly(){
System.out.println("์ผ๋ฐ ๋นํ");
}
public void land(){
System.out.println("์ฐฉ๋ฅ");
}
}
public class SupersonicAirplane extends Airplane{
public static final int NORMAL = 1;
public static final int SUPERSONIC = 2;
public int flyMode = NORMAL;
@Override
public void fly() {
if (flyMode == NORMAL){
super.fly();
}
else if (flyMode == SUPERSONIC){
System.out.println("์ด์์ ๋นํ");
}
}
}
final ํด๋์ค
๋ถ๋ชจ ํด๋์ค์ class ์์ final์ ๋ถ์ด๋ฉด, ์์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
final ๋ฉ์๋
๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋ ์์ final์ ๋ถ์ด๋ฉด, ์์ ํด๋์ค์์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ ์ ์๋ค.
ํ์ ๋ณํ
์๋ ํ์ ๋ณํ
๋ถ๋ชจํ์
๋ณ์ = ์์ํ์
๊ฐ์ฒด;
์์ ๊ฐ์ฒด๋ ๋ถ๋ชจ์ ํน์ง๊ณผ ๊ธฐ๋ฅ์ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ์ ๋์ผํ๊ฒ ์ทจ๊ธ๋ ์ ์๋ค.
Cat cat = new Cat();
Animal animal = cat;
cat๊ณผ animal ๋ชจ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.
๋ค๋ง, ๋ถ๋ชจ ํ์ ์ผ๋ก ์๋ ํ์ ๋ณํ๋ ํ์๋ ๋ถ๋ชจ ํด๋์ค์ ์ ์ธ๋ ํ๋์ ๋ฉ์๋๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ์ฆ, ์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ธด ํ์ง๋ง, ์ฌ์ฉ์ด ์ ํ๋๋ค.
๊ทธ๋ฌ๋ ์์ ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ฉ๋ ๋ฉ์๋๊ฐ ์๋ค๋ฉด ๋ถ๋ชจ ๋ฉ์๋ ๋์ ์ค๋ฒ๋ผ์ด๋ฉ๋ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
๊ฐ์ ํ์ ๋ณํ
๋ถ๋ชจ ๋ณ์์ ์์ ๊ฐ์ฒด๋ฅผ ๋์ ํ์ ๋, ์์ ํ์ ์ ๋ถ๋ชจ ํ์ ์ผ๋ก ์๋ ๋ณํ๋์ง๋ง, ๋ฐ๋๋ก ๋ถ๋ชจ ํ์ ์ ์์ ํ์ ์ผ๋ก ์๋ ๋ณํ๋์ง ์๋๋ค. ์บ์คํ ์ฐ์ฐ์๋ก ๊ฐ์ ํ์ ๋ณํ์ ํด์ผ ํ๋ค. ๋จ, ์์ ๊ฐ์ฒด๊ฐ ๋ถ๋ชจ ํ์ ์ผ๋ก ์๋ ๋ณํ๋ ํ ๋ค์ ์์ ํ์ ์ผ๋ก ๋ณํํ ๋, ๊ฐ์ ํ์ ๋ณํ์ ์ฌ์ฉํ ์ ์๋ค. ์ฆ, ์๋ ์์ ํ์ ์ด์์ด์ผ ํ๋ค.
Parent parent = new Child();
Child child = (Child) parnet;
๋คํ์ฑ
๋คํ์ฑ์ด๋ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋์ผํ์ง๋ง ์คํ ๊ฒฐ๊ณผ๊ฐ ๋ค์ํ๊ฒ ๋์ค๋ ์ฑ์ง์ ๋งํ๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ๋์ผํ๋ค๋ ๊ฒ์ ๋์ผํ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ์๋ฏธ์ด๋ค.
ํ๋ ๋คํ์ฑ
ํ๋ ๋คํ์ฑ์ ํ๋ ํ์ ์ ๋์ผํ์ง๋ง, ๋์ ๋๋ ๊ฐ์ฒด๊ฐ ๋ฌ๋ผ์ ธ์ ์คํ๊ฒฐ๊ณผ๊ฐ ๋ค์ํ๊ฒ ๋์ฌ ์ ์๋ ๊ฒ์ ๋งํ๋ค.
๋งค๊ฐ๋ณ์ ๋คํ์ฑ
๋งค๊ฐ๋ณ์ ๋คํ์ฑ์ ๋ฉ์๋๊ฐ ํด๋์ค ํ์ ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์์ ๊ฒฝ์ฐ, ํธ์ถํ ๋, ๋งค๊ฐ๋ณ์ ํ์ ์ ๋ง๋ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ ์์ด์ง๋ง, ์์ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ์ฌ ๋ฐ์ํ๋ค. ์ด ๊ฒฝ์ฐ, ์์ ๊ฐ์ฒด์์ ์ค๋ฒ๋ผ์ด๋ฉ๋ ๋ฉ์๋๊ฐ ์คํ๋๋ค.
public class Driver {
public void drive(Vehicle vehicle){
vehicle.run();
}
}
public class Vehicle {
public void run(){
System.out.println("์ฐจ๋์ด ๋ฌ๋ฆฐ๋ค.");
}
}
public class Bus extends Vehicle {
@Override
public void run() {
System.out.println("๋ฒ์ค๊ฐ ๋ฌ๋ฆฐ๋ค.");
}
}
public class Taxi extends Vehicle {
@Override
public void run() {
System.out.println("ํ์๊ฐ ๋ฌ๋ฆฐ๋ค.");
}
}
public class Main {
public static void main(String[] args) {
Driver driver = new Driver();
Bus bus = new Bus();
driver.drive(bus); // ๋ฒ์ค๊ฐ ๋ฌ๋ฆฐ๋ค.
Taxi taxi = new Taxi();
driver.drive(taxi); // ํ์๊ฐ ๋ฌ๋ฆฐ๋ค.
}
}
๊ฐ์ฒด ํ์ ํ์ธ
๋ณ์๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด์ ํ์ ์ ํ์ธํ๊ณ ์ ํ ๋, instanceof ์ฐ์ฐ์๋ฅผ ์ด์ฉํ ์ ์๋ค.
boolean result = ๊ฐ์ฒด instance of ํ์
instanceof ์ฐ์ฐ์์ ์ขํญ์๋ ๊ฐ์ฒด๊ฐ ์ค๊ณ ์ฐํญ์๋ ํ์ ์ด ์ค๋๋ฐ, ์ขํญ์ ๊ฐ์ฒด๊ฐ ์ฐํญ์ ํ์ ์ด๋ฉด true, ๊ทธ๋ ์ง ์์ผ๋ฉด, false๋ฅผ ๋ฐํํ๋ค.
public void method(Parent parent){
if (parent instanceof Child) {
Child child = (Child) parent;
}
}
๋งค๊ฐ๋ณ์ parent์ Child๋ฅผ ์ฐธ์กฐํ๋์ง ํ์ธํ๊ณ , ์ฐธ์กฐํ๋ค๋ฉด, ๊ฐ์ ํ์ ๋ณํ์ ํ๋ค.
Java 12๋ถํฐ๋ instanceof ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ true์ธ ๊ฒฝ์ฐ, ์ฐ์ธก ํ์ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ํ์ ๋ณํ์ด ํ์์๋ค.
if (parent instanceof Child child){
// ๋ฐ๋ก child ์ฌ์ฉ ๊ฐ๋ฅ
}
์ถ์ ํด๋์ค
์ถ์ ํด๋์ค๋?
๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ ํด๋์ค๋ฅผ ์ค์ฒด ํด๋์ค๋ผ๊ณ ํ๋ค๋ฉด, ์ด ํด๋์ค๋ค์ ๊ณตํต์ ์ธ ํ๋๋ ๋ฉ์๋๋ฅผ ์ถ์ถํด์ ์ ์ธํ ํด๋์ค๋ฅผ ์ถ์ ํด๋์ค๋ผ๊ณ ํ๋ค. ์ถ์ ํด๋์ค๋ ์ค์ฒด ํด๋์ค์ ๋ถ๋ชจ ์ญํ ์ ํ๋ค. ๋ฐ๋ผ์ ์ค์ฒด ํด๋์ค๋ ์ถ์ ํด๋์ค๋ฅผ ์์ํด์ ๊ณตํต์ ์ธ ํ๋๋ ๋ฉ์๋๋ฅผ ๋ฌผ๋ ค๋ฐ์ ์ ์๋ค.
์๋ฅผ ๋ค์ด, Bird, Insect, Fish์ ๊ฐ์ ์ค์ฒด ํด๋์ค์์ ๊ณตํต๋๋ ํ๋์ ๋ฉ์๋๋ฅผ ๋ฐ๋ก ์ ์ธํ Animal ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๊ณ , ์ด๊ฒ์ ์์ํด์ ์ค์ฒด ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค. ์ฆ, Animal์ ์ค์ ๋ก ์์ฑํด์ ์ฌ์ฉํ์ง ์๊ณ , ์์์ ์ํ ๋ถ๋ชจ ํด๋์ค ์ญํ ๋ง ํ๊ธฐ ๋๋ฌธ์ ์ถ์ ํด๋์ค๋ก ์ ์ธํ๋ค. ๋ฐ๋ผ์, ์ถ์ ํด๋์ค๋ extends ๋ค์๋ง ์ฌ ์ ์๋ค.
์ถ์ ํด๋์ค ์ ์ธ
ํด๋์ค ์ ์ธ์ abstract ํค์๋๋ฅผ ๋ถ์ด๋ฉด ์ถ์ ํด๋์ค ์ ์ธ์ด ๋๋ค. ์ถ์ ํด๋์ค๋ new ์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ง ๋ชปํ๊ณ , ์์์ ํตํด ์์ ํด๋์ค๋ฅผ ์์ฑํ๋ ๋ฐ๋ง ์ด์ฉ๋๋ค.
public abstract class ํด๋์ค๋ช
{
//ํ๋
//์์ฑ์
//๋ฉ์๋
}
public class Phone {
String owner;
Phone(String owner){
this.owner = owner;
}
public void turnOn(){
System.out.println("์ ์์ด ์ผ์ง๋๋ค.");
}
public void turnOff(){
System.out.println("์ ์์ด ๊บผ์ง๋๋ค.");
}
}
public class SmartPhone extends Phone {
public SmartPhone(String owner) {
super(owner);
}
public void internetSearch(){
System.out.println("์ธํฐ๋ท ๊ฒ์์ ํฉ๋๋ค.");
}
}
์ถ์ ๋ฉ์๋์ ์ฌ์ ์
์์ ํด๋์ค๋ค์ด ๊ฐ์ง๊ณ ์๋ ๊ณตํต ๋ฉ์๋๋ฅผ ๋ฝ์๋ด์ด ์ถ์ ํด๋์ค๋ก ์์ฑํ ๋, ๋ฉ์๋ ์ ์ธ๋ถ(๋ฆฌํดํ์ , ๋ฉ์๋๋ช , ๋งค๊ฐ๋ณ์)๋ง ๋์ผํ๊ณ ์คํ ๋ด์ฉ์ ์์ ํด๋์ค๋ง๋ค ๋ฌ๋ผ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด, Animal ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์๋ฐ์ ์์ ํด๋์ค๋ค์ ์ธ์์๋ฆฌ ๋ฉ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์ด๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ํด์ ์ถ์ ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ์ ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๋ค.
abstract ๋ฆฌํดํ์
๋ฉ์๋๋ช
(๋งค๊ฐ๋ณ์, );
์ถ์ ๋ฉ์๋๋ ์์ ํด๋์ค์์ ๋ฐ๋์ ์ฌ์ ์ํด์ ์คํ ๋ด์ฉ์ ์ฑ์์ผ ํ๋ค.
public abstract class Animal {
public void breathe(){
System.out.println("์จ์ ์ฐ๋ค.");
}
public abstract void sound();
}
public class Dog extends Animal{
@Override
public void sound() {
System.out.println("๋ฉ๋ฉ");
}
}
public class Cat extends Animal {
@Override
public void sound() {
System.out.println("์ผ์น");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.sound();
Cat cat = new Cat();
cat.sound();
animalSound(dog);
animalSound(cat);
}
public static void animalSound(Animal animal){
animal.sound();
}
}
์ธํฐํ์ด์ค
์ธํฐํ์ด์ค์ ์ญํ
์ธํฐํ์ด์ค๋ ๋ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ ์ญํ ์ ํ๋ค.

๊ฐ๋ฐ ์ฝ๋๋ฅผ ๊ฐ์ฒดA๋ผ๊ณ ํ ๋, ๊ฐ์ฒดA๊ฐ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, ์ธํฐํ์ด์ค๊ฐ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ๋ฆฌํด๊ฐ์ ๋ฐ์ ๊ฐ์ฒดA์ ์ ๋ฌํ๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๊ฐ์ฒดA๋ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ง ์ฌ์ฉํ๋ฏ๋ก, ์ธํฐํ์ด์ค๊ฐ ํธ์ถํ๋ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํด๋ ๊ฐ์ฒดA์ ๋ํด์๋ ๋ณํจ์ด ์๋ค. ๋ง์ฝ, ๊ฐ์ฒดA๊ฐ ๊ฐ์ฒด๋ฅผ ์ง์ ์ฌ์ฉํ๋ค๋ฉด, ๊ฐ์ฒดA์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ๊ฒ์ด๋ค.
์ด ํน์ง์ผ๋ก ์ธํด ์ธํฐํ์ด์ค๋ ๋คํ์ฑ ๊ตฌํ์ ์ฃผ๋ก ์ด์ฉํ๋ค. ์์์ ์ด์ฉํด์ ๋คํ์ฑ์ ๊ตฌํํ ์๋ ์์ง๋ง, ์ธํฐํ์ด์ค๋ฅผ ํตํด์ ๋คํ์ฑ์ ๊ตฌํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง๋ค.
์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค ์ ์ธ
์์์ ๊ฐ์ฒดA๊ฐ ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์คํํ๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค์ ์ ์ธ๋ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ๋งค์๋๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
public interface RemoteControl {
public void turnOn();
}
public class Television implements RemoteControl{
@Override
public void turnOn() {
System.out.println("TV๋ฅผ ์ผญ๋๋ค.");
}
}
public class Audio implements RemoteControl{
@Override
public void turnOn() {
System.out.println("Audio๋ฅผ ์ผญ๋๋ค.");
}
}
๋ณ์ ์ ์ธ๊ณผ ๊ตฌํ ๊ฐ์ฒด ๋์
์ธํฐํ์ด์ค๋ ํ๋์ ํ์ ์ด๋ฏ๋ก ๋ณ์์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ์ธํฐํ์ด์ค๋ ์ฐธ์กฐ ํ์ ์ ์ํ๋ฏ๋ก ์ธํฐํ์ด์ค ๋ณ์์๋ ๋ฒ์ง๋ฅผ ์ ์ฅํ ์ ์๋๋ฐ, ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์์ง ์๋ค๋ ๋ป์ผ๋ก null์ ๋์ ํ ์ ์๋ค.
์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, ์ธํฐํ์ด์ค ๋ณ์์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ํด์ผ ํ๋ค.
public class RemoteControlExample {
public static void main(String[] args) {
RemoteControl rc = new Television();
rc.turnOn();
rc = new Audio();
rc.turnOn();
}
}
์์ ํ๋
์ธํฐํ์ด์ค์ ์ ์ธ๋ ํ๋๋ ๋ชจ๋ public static final ํน์ฑ์ ๊ฐ๊ธฐ ๋๋ฌธ์ ์๋ตํ๋๋ผ๋ ์ปดํ์ผ ๊ณผ์ ์์ ๋ถ๊ฒ ๋๋ค. ์์๋ช ์ ๋๋ฌธ์๋ก ์์ฑํ๋, ์๋ก ๋ค๋ฅธ ๋จ์ด๋ก ๊ตฌ์ฑ๋์ด ์์ ๊ฒฝ์ฐ์๋ ์ธ๋๋ฐ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ด ๊ด๋ก์ด๋ค.
public interface RemoteControl {
int MAX_VOLUME = 100;
int MIN_VOLUME = 0;
}
public class RemoteControlExample {
public static void main(String[] args) {
System.out.println("๋ฆฌ๋ชจ์ฝ ์ต๋ ๋ณผ๋ฅจ " + RemoteControl.MAX_VOLUME);
System.out.println("๋ฆฌ๋ชจ์ฝ ์ต์ ๋ณผ๋ฅจ " + RemoteControl.MIN_VOLUME);
}
}
์ถ์ ๋ฉ์๋
์ธํฐํ์ด์ค์์ ์ถ์ ๋ฉ์๋๋ ๋ฆฌํด ํ์ , ๋ฉ์๋๋ช , ๋งค๊ฐ๋ณ์๋ง ๊ธฐ์ ๋๊ณ , ์ค๊ดํธ๋ฅผ ๋ถ์ด์ง ์๋ ๋ฉ์๋๋ฅผ ๋งํ๋ค. ๊ตฌํ ํด๋์ค์์ ๋ฐ๋์ ์ฌ์ ์ํด์ผ ํ๋ค. public abstract๋ฅผ ์๋ตํ๋๋ผ๋ ์ปดํ์ผ ๊ณผ์ ์์ ์๋์ผ๋ก ๋ถ๊ฒ ๋๋ค.
public interface RemoteControl {
int MAX_VOLUME = 100;
int MIN_VOLUME = 0;
void turnOn();
void turnOff();
void setVolume(int volume);
}
public class Television implements RemoteControl{
private int volume;
@Override
public void turnOn() {
System.out.println("TV๋ฅผ ์ผญ๋๋ค.");
}
@Override
public void turnOff() {
System.out.println("TV๋ฅผ ๋๋๋ค.");
}
@Override
public void setVolume(int volume) {
if (volume > RemoteControl.MAX_VOLUME){
this.volume = RemoteControl.MAX_VOLUME;
}
else if (volume < RemoteControl.MIN_VOLUME){
this.volume = RemoteControl.MIN_VOLUME;
}
else{
this.volume = volume;
}
System.out.println("ํ์ฌ TV์ ๋ณผ๋ฅจ์ " + this.volume);
}
}
public class Audio implements RemoteControl{
private int volume;
@Override
public void turnOn() {
System.out.println("Audio๋ฅผ ์ผญ๋๋ค.");
}
@Override
public void turnOff() {
System.out.println("Audio๋ฅผ ๋๋๋ค.");
}
@Override
public void setVolume(int volume) {
if (volume > RemoteControl.MAX_VOLUME){
this.volume = RemoteControl.MAX_VOLUME;
}
else if (volume < RemoteControl.MIN_VOLUME){
this.volume = RemoteControl.MIN_VOLUME;
}
else{
this.volume = volume;
}
System.out.println("ํ์ฌ Audio์ ๋ณผ๋ฅจ์ " + this.volume);
}
}
๋ํดํธ ๋ฉ์๋
์ธํฐํ์ด์ค์๋ ์์ ํ ์คํ ์ฝ๋๋ฅผ ๊ฐ์ง ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๋ค. ์ถ์ ๋ฉ์๋๋ ์คํ๋ถ๊ฐ ์์ง๋ง, ๋ํดํธ ๋ฉ์๋๋ ์คํ๋ถ๊ฐ ์๋ค. ์์ default๋ฅผ ๋ถ์ฌ์ผ ํ๋ค. ๋ํดํธ ๋ฉ์๋ ์ธํฐํ์ด์ค์ ์์ ํ๋๋ฅผ ์ฝ๊ฑฐ๋ ์ถ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
public interface RemoteControl {
int MAX_VOLUME = 100;
int MIN_VOLUME = 0;
void turnOn();
void turnOff();
void setVolume(int volume);
default void setMute(boolean mute){
if (mute){
System.out.println("๋ฌด์ ์ฒ๋ฆฌ");
setVolume(0);
}
else{
System.out.println("๋ฌด์ ํด์ ");
}
}
}
๋ํดํธ ๋ฉ์๋๊ฐ ์ถ์ ๋ฉ์๋๋ฅผ ์ด์ฉํ๊ธฐ ๋๋ฌธ์, ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ธํฐํ์ด์ค ๋ณ์์ ๋์ ํ๊ณ ๋์ ํธ์ถํด์ผ ํ๋ค.
๊ตฌํ ํด๋์ค๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ ์์ ์๊ฒ ๋ง๊ฒ ์์ ํ ์๋ ์๋ค.
public class Audio implements RemoteControl{
private int volume;
@Override
public void turnOn() {
System.out.println("Audio๋ฅผ ์ผญ๋๋ค.");
}
@Override
public void turnOff() {
System.out.println("Audio๋ฅผ ๋๋๋ค.");
}
@Override
public void setVolume(int volume) {
if (volume > RemoteControl.MAX_VOLUME){
this.volume = RemoteControl.MAX_VOLUME;
}
else if (volume < RemoteControl.MIN_VOLUME){
this.volume = RemoteControl.MIN_VOLUME;
}
else{
this.volume = volume;
}
System.out.println("ํ์ฌ Audio์ ๋ณผ๋ฅจ์ " + this.volume);
}
private int memoryVolume;
@Override
public void setMute(boolean mute) {
if (mute){
this.memoryVolume = this.volume;
System.out.println("๋ฌด์ ์ฒ๋ฆฌ");
setVolume(RemoteControl.MIN_VOLUME);
}
else{
System.out.println("๋ฌด์ ํด์ ");
setVolume(this.memoryVolume);
}
}
}
์ ์ ๋ฉ์๋
๊ตฌํ ๊ฐ์ฒด๋ฅผ ์๊ตฌํ๋ ์ถ์ ๋ฉ์๋์ ๋ํดํธ ๋ฉ์๋์๋ ๋ฌ๋ฆฌ, ์ ์ ๋ฉ์๋๋ ์ธํฐํ์ด์ค๋ง์ผ๋ก ํธ์ถํ ์ ์๋ค. ์ ์ธ ๋ฐฉ๋ฒ์ ํด๋์ค์ ์ ์ ๋ฉ์๋์ ๋์ผํ์ง๋ง, public์ ์๋ตํ๋๋ผ๋ ์๋์ผ๋ก ์ปดํ์ผ ๊ณผ์ ์์ ๋ถ๋๋ค.
๋ค์ค ์ธํฐํ์ด์ค ๊ตฌํ
๊ตฌํ ๊ฐ์ฒด๋ ์ฌ๋ฌ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ implements ํ ์ ์๋ค. ๊ตฌํ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์คA, ์ธํฐํ์ด์คB๋ฅผ ๊ตฌํํ๊ณ ์๋ค๋ฉด, ๊ฐ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋จ, ์ธํฐํ์ด์ค์ ์ ์ธ๋ ๋ถ๋ถ๋ง ํธ์ถํ ์ ์๋ค.
์ธํฐํ์ด์ค ์์
์ธํฐํ์ด์ค๋ ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ์์ํ ์ ์์ผ๋ฉฐ, ํด๋์ค์๋ ๋ฌ๋ฆฌ ๋ค์ค ์์์ ํ์ฉํ๋ค.
public interface ์์์ธํฐํ์ด์ค extends ๋ถ๋ชจ์ธํฐํ์ด์ค1, ๋ถ๋ชจ์ธํฐํ์ด์ค2 {}
์์ ์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค๋ ์์ ์ธํฐํ์ด์ค์ ๋ฉ์๋ ๋ฟ๋ง ์๋๋ผ ๋ถ๋ชจ ์ธํฐํ์ด์ค์ ๋ชจ๋ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ , ๊ตฌํ ํด๋์ค๋ ์์ ๋ฐ ๋ถ๋ชจ ์ธํฐํ์ด์ค์ ๋ณ์์ ๋์ ๋ ์ ์๋ค. ๋ฌผ๋ก ํด๋น ์ธํฐํ์ด์ค์์ ํธ์ถ ๊ฐ๋ฅํ ๋ถ๋ถ๋ง ํธ์ถํ ์ ์๋ค.
ํ์ ๋ณํ
์ธํฐํ์ด์ค์ ํ์ ๋ณํ์ ์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค ๊ฐ์ ๋ฐ์ํ๋ค. ์ธํฐํ์ด์ค ๋ณ์์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ํ๋ฉด, ๊ตฌํ ๊ฐ์ฒด๋ ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ์๋์ผ๋ก ํ์ ๋ณํ๋๋ค. ๋ฐ๋๋ก ์ธํฐํ์ด์ค ํ์ ์ ๊ตฌํ ํด๋์ค ํ์ ์ผ๋ก ๋ณํ์ํฌ ๋๋ ๊ฐ์ ํ์ ๋ณํ์ด ํ์ํ๋ค.
์๋ ํ์ ๋ณํ
๊ตฌํ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ์๋ ๋ณํ๋๋ฉด, ์ธํฐํ์ด์ค์ ์ ์ธ๋ ๋ฉ์๋๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ธํฐํ์ด์ค ๋ณ์ = ๊ตฌํ ๊ฐ์ฒด;
๊ฐ์ ํ์ ๋ณํ
์๋ ๊ตฌํ ๊ฐ์ฒด์๋ ๊ฒ์ ์๋ ํ์ ๋ณํํ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๊ตฌํ ๊ฐ์ฒด๋ก ๋๋๋ฆฌ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
๊ตฌํํด๋์ค ๋ณ์ = (๊ตฌํํด๋์ค) ์ธํฐํ์ด์ค๋ณ์;
๋คํ์ฑ
์์์ ๋คํ์ฑ ๋ถ๋ถ๊ณผ ๊ฐ๋ค.
๊ฐ์ฒด ํ์ ํ์ธ
์์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก instanceof๋ฅผ ์ฌ์ฉํ๋ค.
์์ธ ์ฒ๋ฆฌ
์์ธ์ ์์ธ ํด๋์ค
์์ธ์๋ ๋ ๊ฐ์ง๊ฐ ์๋๋ฐ, ์ปดํ์ผ๋ฌ๊ฐ ๊ฒ์ฌํ๋ Exception๊ณผ ์ปดํ์ผ๋ฌ๊ฐ ์ปด์ฌํ์ง ์๋ Runtime Exception์ด ์๋ค.
์๋ฐ๋ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์์ธ ํด๋์ค๋ก๋ถํฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ด ๊ฐ์ฒด๋ ์์ธ ์ฒ๋ฆฌ ์์ ์ฌ์ฉ๋๋ค.
์๋ฐ์ ๋ชจ๋ ์๋ฌ์ ์์ธ ํด๋์ค๋ Throwable์ ์์๋ฐ์ ๋ง๋ค์ด์ง๊ณ , ์ถ๊ฐ์ ์ผ๋ก ์์ธ ํด๋์ค๋ java.lang.Exception ํด๋์ค๋ฅผ ์์๋ฐ๋๋ค. ์คํ ์์ธ๋ RuntimeException๊ณผ ๊ทธ ์์ ํด๋์ค์ ํด๋นํ๋ค. ๊ทธ ๋ฐ์ ์์ธ ํด๋์ค๋ ๋ชจ๋ ์ผ๋ฐ ์์ธ์ด๋ค.

์์ธ ์ฒ๋ฆฌ ์ฝ๋
์์ธ ์ฒ๋ฆฌ ์ฝ๋๋ try-catch-finally ๋ธ๋ก์ผ๋ก ๊ตฌ์ฑ๋๊ณ , ์์ฑ์ ๋ด๋ถ ๋๋ ๋ฉ์๋ ๋ด๋ถ์์ ์์ฑ๋๋ค. try ๋ธ๋ก์์ ๋ค์ํ ์ข ๋ฅ์ ์์ธ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ค์ค catch๋ฅผ ์ฌ์ฉํ์ฌ, ๋ฐ์ํ๋ ์์ธ์ ๋ฐ๋ผ ์์ธ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ๋ค๋ฅด๊ฒ ์์ฑํ ์ ์๋ค.
try {
์์ธ ๋ฐ์ ์ฝ๋
}
catch (์์ธํด๋์ค1 e1) {
์์ธ ์ฒ๋ฆฌ
}
catch (์์ธํด๋์ค2 e2) {
์์ธ ์ฒ๋ฆฌ
}
finally {
ํญ์ ์คํ ์ฝ๋
}
catch ๋ธ๋ก์ด ์ฌ๋ฌ ๊ฐ๋ผ ํ ์ง๋ผ๋ ๊ฐ์ฅ ๋จผ์ ๋ฐ์ํ ์๋ฌ์ ๋ํ catch ๋ธ๋ก ์ฝ๋ ๋จ ํ๋๋ง ์คํ๋๋ค. ์ฒ๋ฆฌํด์ผํ ์์ธ ํด๋์ค๋ค์ด ์์ ๊ด๊ณ์ ์์ ๋๋ ํ์ ํด๋์ค catch ๋ธ๋ก์ ์์ฑํ๊ณ ์์ ํด๋์ค catch ๋ธ๋ก์ ๋์ค์ ์์ฑํด์ผ ํ๋ค. ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, catch ๋ธ๋ก์ ์์์๋ถํฐ ์ฐจ๋ก๋๋ก ๊ฒ์ฌํ๋๋ฐ, ํ์ ํด๋์ค ์์ธ๋ ์์ ํด๋์ค ์์ธ๊ฐ ๋๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
๋ ๊ฐ ์ด์์ ์์ธ๋ฅผ ํ๋์ catch ๋ธ๋ก์ผ๋ก ๋์ผํ๊ฒ ์์ธ ์ฒ๋ฆฌํ๊ณ ์ถ์ ๋๋ |๋ฅผ ์ด์ฉํ๋ค.
try {
์์ธ ๋ฐ์ ์ฝ๋
}
catch (์์ธํด๋์ค1 | ์์ธ ํด๋์ค2 e) {
์์ธ ์ฒ๋ฆฌ
}
finally {
ํญ์ ์คํ ์ฝ๋
}
์์ธ ๋ ๋๊ธฐ๊ธฐ
๋ฉ์๋ ๋ด๋ถ์์ ์์ธ๊ฐ ๋ฐ์ํ ๋, try-catch ๋ธ๋ก์ผ๋ก ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ด์ง๋ง, throws๋ฅผ ํตํด ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ณณ์ผ๋ก ์์ธ๋ฅผ ๋ ๋๊ธธ ์๋ ์๋ค.
public static void main(String[] args) {
try{
findClass();
}
catch (ClassNotFoundException e){
System.out.println(e.toString());
}
}
public static void findClass() throws ClassNotFoundException{
Class.forName("java.lang.String2");
}
findClass() ๋ฉ์๋์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง๋ง, findClass() ๋ฉ์๋ ๋ด๋ถ์์ ์ฒ๋ฆฌํ์ง ์๊ณ , ํธ์ถํ main์์ ์ฒ๋ฆฌํ๋๋ก ํ๋ค.
๋์ดํด์ผํ ์์ธ ํด๋์ค๊ฐ ๋ง์ ๊ฒฝ์ฐ์๋ throws Exception์ด๋ throws Throwable ๋ง์ผ๋ก ๋ชจ๋ ์์ธ๋ฅผ ๊ฐ๋จํ ๋ ๋๊ธธ ์๋ ์๋ค.
์ฌ์ฉ์ ์ ์ ์์ธ
์ฌ์ฉ์ ์ ์ ์์ธ๋?
์ํ ํ๋ก๊ทธ๋จ์์ ์๊ณ ๋ณด๋ค ๋ ๋ง์ ์ถ๊ธ ์์ฒญ์ด ๋ค์ด์จ ๊ฒฝ์ฐ, ์๊ณ ๋ถ์กฑ ์์ธ๋ฅผ ๋ฐ์์์ผ์ผ ํ๋ค. ํ์ง๋ง, ์๊ณ ๋ถ์กฑ ์์ธ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ง์ ์์ธ ํด๋์ค๋ฅผ ์ ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค. ์ด๋ฅผ ์ฌ์ฉ์ ์ ์ ์์ธ๋ผ๊ณ ํ๋ค.
์ฌ์ฉ์ ์ ์ ์์ธ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ฒดํฌํ๋ ์ผ๋ฐ ์์ธ๋ก ์ ์ธํ ์๋ ์๊ณ , ์ปดํ์ผ๋ฌ๊ฐ ์ฒดํฌํ์ง ์๋ ์คํ ์์ธ๋ก ์ ์ธํ ์๋ ์๋ค. ํต์์ ์ผ๋ก ์ผ๋ฐ ์์ธ๋ Exception ํด๋์ค์ ์์ ํด๋์ค๋ก ์ ์ธํ๊ณ , ์คํ ์์ธ๋ RuntimeException ํด๋์ค์ ์์ ํด๋์ค๋ก ์ ์ธํ๋ค.
public class XXXException extends [Exception | RuntimeException] {
public XXXException() {}
public XXXException(String message) {
super(message);
}
}
์ฌ์ฉ์ ์ ์ ์์ธ ํด๋์ค์๋ ๊ธฐ๋ณธ ์์ฑ์์ ์์ธ ๋ฉ์ธ์ง๋ฅผ ์ ๋ ฅ๋ฐ๋ ์์ฑ์๋ฅผ ์ ์ธํด ์ค๋ค. ์์ธ ๋ฉ์ธ์ง๋ ๋ถ๋ชจ ์์ฑ์์ ๋งค๊ฐ๊ฐ์ผ๋ก ๋๊ฒจ์ฃผ๋๋ฐ, ๊ทธ ์ด์ ๋ ์์ธ ๊ฐ์ฒด์ ๊ณตํต ๋ฉ์๋์ธ getMessage()์ ๋ฆฌํด๊ฐ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์์ด๋ค.
์์ธ ๋ฐ์์ํค๊ธฐ
์๋ฐ์์ ์ ๊ณตํ๋ ์์ธ ๋ฟ๋ง ์๋๋ผ ์ฌ์ฉ์ ์ ์ ์์ธ๋ฅผ ์ง์ ์ฝ๋์์ ๋ฐ์์ํค๋ ค๋ฉด throw ํค์๋์ ํจ๊ป ์์ธ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ฉด ๋๋ค. ์์ธ์ ์์ธ์ ํด๋นํ๋ ๋ฉ์ธ์ง๋ฅผ ์ง์ ์ ๊ณตํ๊ณ ์ถ๋ค๋ฉด, ์์ฑ์ ๋งค๊ฐ๊ฐ์ผ๋ก ์ ๋ฌํ๋ค.
public class Account {
private long balance;
public long getBalance() {
return balance;
}
public void deposit(int money){
this.balance += money;
}
public void withdraw(int money) throws InsufficentException {
if (balance < money){
throw new InsufficentException("์๊ณ ๊ฐ ๋ถ์กฑํฉ๋๋ค. ๋ถ์กฑํ ๊ธ์ก์ "+(money-balance)+"์
๋๋ค.");
}
this.balance -= money;
}
}
public class InsufficentException extends Exception {
public InsufficentException(){};
public InsufficentException(String message){
super(message);
};
}
public class AccountExample {
public static void main(String[] args) {
Account account = new Account();
account.deposit(5000);
System.out.println("ํ์ฌ ์๊ณ ์ " + account.getBalance() + "์์ด ์์ต๋๋ค.");
try{
account.withdraw(10000);
}
catch (InsufficentException e) {
System.out.println(e.getMessage());
}
}
}
java.base ๋ชจ๋
Object ํด๋์ค
ํด๋์ค๋ฅผ ์ ์ธํ ๋, extends ํค์๋๋ก ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์ํ์ง ์์ผ๋ฉด, ์์์ ์ผ๋ก java.lang.Object ํด๋์ค๋ฅผ ์์ํ๊ฒ ๋๋ค. ์๋ฐ์ ๋ชจ๋ ํด๋์ค๋ Object์ ์์์ด๋ ์์ ํด๋์ค์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฐ์ฒด์์ Object ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. Object ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
๊ฐ์ฒด ๋๋ฑ ๋น๊ต
Object์ equals() ๋ฉ์๋๋ ๊ฐ์ฒด์ ๋ฒ์ง๋ฅผ ๋น๊ตํ๊ณ , boolean ๊ฐ์ ๋ฆฌํดํ๋ค. equals() ๋ฉ์๋๋ ๋น๊ต ์ฐ์ฐ์์ธ ==๊ณผ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ค. ์ฆ, ==๋ ๊ฐ์ฒด์ ๋ฒ์ง๋ฅผ ๋น๊ตํ๋ค๋ ๋ป์ด๋ค.
boolean result = obj1.equals(obj2);
boolean result = (obj1 == obj2);
์ผ๋ฐ์ ์ผ๋ก, Object์ equals() ๋ฉ์๋๋ ์ฌ์ ์ํด์ ๋๋ฑ ๋น๊ต์ฉ์ผ๋ก ์ฌ์ฉํ๋ค. ๋๋ฑ ๋น๊ต๋ ๊ฐ์ฒด๊ฐ ๋ฌ๋ผ๋ ๋ด๋ถ์ ๋ฐ์ดํฐ๊ฐ ๊ฐ์์ง ๋น๊ตํ๋ ๊ฒ์ ๋งํ๋ค. ์๋ฅผ ๋ค์ด, String์ equals() ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ ๋ด๋ถ ๋ฌธ์์ด์ด ๊ฐ์์ง๋ฅผ ๋น๊ตํ๋ค.
public class Member {
public String id;
public Member(String id){
this.id = id;
}
@Override
public boolean equals(Object object) {
if (object instanceof Member target){
if (id.equals(target.id)){
return true;
}
}
return false;
}
}
๊ฐ์ฒด ํด์์ฝ๋
๊ฐ์ฒด ํด์์ฝ๋๋ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ ์ ์๋ฅผ ๋งํ๋ค. Object์ hashCode() ๋งค์๋๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ง๋ฅผ ์ด์ฉํด์ ํด์์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๋ง๋ค ๋ค๋ฅธ ์ ์๊ฐ์ ๋ฆฌํดํ๋ค. hashCode() ๋ํ eqauls()์ ๋น์ทํ๊ฒ ๋ ๊ฐ์ฒด๊ฐ ๋๋ฑํ์ง ๋น๊ตํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
์๋ฐ์์ ๋ ๊ฐ์ฒด๊ฐ ๋๋ฑํจ์ ๋น๊ตํ ๋, hashCode()์ equals() ๋ฉ์๋๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ฐ์ hashCode()๊ฐ ๋ฆฌํดํ๋ ์ ์๊ฐ์ด ๊ฐ์์ง๋ฅผ ํ์ธํ๊ณ , ๊ทธ ๋ค์ eqauls() ๋ฉ์๋๊ฐ true์์ ํ์ธํ์ฌ ๋๋ฑ ๊ฐ์ฒด์์ ํ๋จํ๋ค.
public class Student {
private int no;
private String name;
public Student(int no, String name) {
this.no = no;
this.name = name;
}
public int getNo() {
return no;
}
public String getName() {
return name;
}
@Override
public boolean equals(Object object) {
if (object instanceof Student target){
if (no == target.getNo() && name.equals(target.getName())){
return true;
}
}
return false;
}
@Override
public int hashCode() {
int hashCode = no + name.hashCode();
return hashCode;
}
}
public class HashCodeExample {
public static void main(String[] args) {
Student student1 = new Student(1, "์ ์งฑ๊ตฌ");
Student student2 = new Student(1, "์ ์งฑ๊ตฌ");
if (student1.hashCode() == student2.hashCode()){
if (student1.equals(student2)){
System.out.println("๋์ผํ ๊ฐ์ฒด์
๋๋ค.");
}
else{
System.out.println("๋ฐ์ดํฐ๊ฐ ๋ค๋ฅด๋ฏ๋ก ๋๋ฑ ๊ฐ์ฒด๊ฐ ์๋๋๋ค.");
}
}
else{
System.out.println("ํด์์ฝ๋๊ฐ ๋ค๋ฅด๋ฏ๋ก ๋๋ฑ ๊ฐ์ฒด๊ฐ ์๋๋๋ค.");
}
}
}
๊ฐ์ฒด ๋ฌธ์ ์ ๋ณด
Object์ toString() ๋ฉ์๋๋ ๊ฐ์ฒด์ ๋ฌธ์ ์ ๋ณด๋ฅผ ๋ฆฌํดํ๋ค. ๊ฐ์ฒด์ ๋ฌธ์ ์ ๋ณด๋ ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ํํํ ๊ฐ์ ๋งํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Object์ toString() ๋ฉ์๋๋ ํด๋์ค๋ช @16์ง์ํด์์ฝ๋๋ก ๊ตฌ์ฑ๋ ๋ฌธ์์ด์ ๋ฆฌํดํ๋ค. ์ด ๋ํ ์ ์ ์ํด์ ๊ฐ๊ฒฐํ๊ณ ์ ์ตํ ์ ๋ณด๋ฅผ ๋ฆฌํดํ๋๋ก ํด์ผ ํ๋ค.
String ํด๋์ค
String ํด๋์ค๋ ๋ฌธ์์ด์ ์ ์ฅํ๊ณ ์กฐ์ํ ๋ ์ฌ์ฉํ๋ค. ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์๋์ผ๋ก String ๊ฐ์ฒด๋ก ์์ฑ๋๋ค.
ํฌ์ฅ ํด๋์ค
์๋ฐ๋ ๊ธฐ๋ณธ ํ์ (byte, char, short, int, long, float, double, boolean)์ ๊ฐ์ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค. ์ด๋ฐ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ํฌ์ฅํ๊ณ ์๋ค๊ณ ํด์ ํฌ์ฅ ๊ฐ์ฒด๋ผ๊ณ ํ๋ค.
ํฌ์ฅ ๊ฐ์ฒด๋ ํฌ์ฅํ๊ณ ์๋ ๊ธฐ๋ณธ ํ์ ์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ณ , ๋จ์ง ๊ฐ์ฒด๋ก ์์ฑํ๋ ๋ฐ ๋ชฉ์ ์ด ์๋ค. ์ด๋ฐ ๊ฐ์ฒด๊ฐ ํ์ํ ์ด์ ๋ ์ปฌ๋ ์ ๊ฐ์ฒด ๋๋ฌธ์ด๋ค. ์ปฌ๋ ์ ๊ฐ์ฒด๋ ๊ธฐ๋ณธ ํ์ ์ ๊ฐ์ ์ ์ฅํ ์ ์๊ณ , ๊ฐ์ฒด๋ง ์ ์ฅํ ์ ์๋ค.
๋ฐ์ฑ๊ณผ ์ธ๋ฐ์ฑ
๊ธฐ๋ณธ ํ์ ์ ๊ฐ์ ํฌ์ฅ ๊ฐ์ฒด๋ก ๋ง๋๋ ๊ณผ์ ์ ๋ฐ์ฑ์ด๋ผ๊ณ ํ๊ณ , ๋ฐ๋๋ก ํฌ์ฅ ๊ฐ์ฒด์์ ๊ธฐ๋ณธ ํ์ ์ ๊ฐ์ ์ป์ด๋ด๋ ๊ณผ์ ์ ์ธ๋ฐ์ฑ์ด๋ผ๊ณ ํ๋ค. ๋ฐ์ฑ์ ํฌ์ฅ ํด๋์ค์ ๋ณ์์ ๊ธฐ๋ณธ ํ์ ๊ฐ์ด ๋์ ๋ ๋ ๋ฐ์ํ๋ค. ๋ฐ๋๋ก ์ธ๋ฐ์ฑ์ ๊ธฐ๋ณธ ํ์ ๋ณ์์ ํฌ์ฅ ๊ฐ์ฒด๊ฐ ๋์ ๋ ๋, ๊ธฐ๋ณธ ํ์ ๊ณผ์ ์ฐ์ฐ ๊ณผ์ ์์ ๋ฐ์ํ๋ค.
public class BoxingUnBoxingExample {
public static void main(String[] args) {
Integer obj = 100;
System.out.println("value = " + obj.intValue());
int value = obj;
System.out.println("value = " + value);
int result = obj + 200;
System.out.println("result = " + result);
}
}
ใ
ํฌ์ฅ ๊ฐ ๋น๊ต
ํฌ์ฅ ํด๋์ค์ equals() ๋ฉ์๋๋ ๋ด๋ถ์ ๊ฐ์ ๋น๊ตํ๋๋ก ์ฌ์ ์๋์ด ์๋ค.
์ ๋ค๋ฆญ
์ ๋ค๋ฆญ์ด๋?
๊ฒฐ์ ๋์ง ์์ ํ์ ์ ํ๋ผ๋ฏธํฐ๋ก ์ฒ๋ฆฌํ๊ณ , ์ค์ ์ฌ์ฉํ ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ตฌ์ฒด์ ์ธ ํ์ ์ผ๋ก ๋์ฒด์ํค๋ ๊ธฐ๋ฅ์ ๋งํ๋ค.
public class Box<T> {
public T content;
}
Box<String> stringBox = new Box<String>();
stringBox.content = "์๋
ํ์ธ์.";
Box<Integer> integerBox = new Box<>();
integerBox.content = 1000;
T๋ ๋จ์ง ์ด๋ฆ์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ํ๋ฒณ์ ์ฌ์ฉํด๋ ์ข๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋๋ฌธ์ ์ํ๋ฒณ ํ ๊ธ์๋ก ํํํ๋ค. ํ์ง๋ง, ์ฃผ์ํ ์ ์ ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋์ฒดํ๋ ํ์ ์ ํด๋์ค ๋ฐ ์ธํฐํ์ด์ค์ด์ด์ผ ํ๋ค. ๊ธฐ๋ณธ ํ์ ์ ๋์ฒด ํ์ ์ด ๋ ์ ์๋ค. ์ ๋ค๋ฆญ ํ์ ์ ์ง์ ํ์ง ์์ผ๋ฉด, ์๋ฌต์ ์ผ๋ก Object ํ์ ์ด ์ฌ์ฉ๋๋ค.
๋ณ์ ์ ์ธ๊ณผ ๋์ผํ๊ฒ ํ๊ณ ์ถ์ผ๋ฉด, <> ์์ ์๋ตํด๋ ๋๋ค.
์ ๋ค๋ฆญ ํ์
์์์ ์ค๋ช ํ ๋๋ก ์ ๋ค๋ฆญ+ํด๋์ค ๋๋ ์ธํฐํ์ด์ค๊ฐ ์ ๋ค๋ฆญ ํ์ ์ด๋ค.
์ ๋ค๋ฆญ ๋ฉ์๋
์ ๋ค๋ฆญ ๋ฉ์๋๋ ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฉ์๋๋ฅผ ๋งํ๋ค. ํ์ ํ๋ผ๋ฏธํฐ๊ฐ ๋ฉ์๋ ์ ์ธ๋ถ์ ์ ์๋๋ค๋ ์ ์์ ์ ๋ค๋ฆญ ํ์ ๊ณผ ์ฐจ์ด๊ฐ ์๋ค.
public ํ์
ํ๋ผ๋ฏธํฐ์ ์ ๋ฆฌํดํ์
๋ฉ์๋๋ช
(๋งค๊ฐ๋ณ์.. ) { ... }
public class Box<T>{
public T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public class GenericExample {
public static void main(String[] args) {
Box<Integer> box1 = boxing(100);
int intValue = box1.getT();
System.out.println(intValue);
Box<String> box2 = boxing("์ ์งฑ๊ตฌ");
String stringValue = box2.getT();
System.out.println(stringValue);
}
public static <T> Box<T> boxing(T t){
Box<T> box = new Box<>();
box.setT(t);
return box;
}
}
์ปฌ๋ ์ ์๋ฃ๊ตฌ์กฐ
์ปฌ๋ ์ ํ๋ ์์ํฌ
์๋ฐ๋ ๋๋ฆฌ ์๋ ค์ ธ ์๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ์ฒด๋ค์ ํจ์จ์ ์ผ๋ก ์ถ๊ฐ, ์ญ์ , ๊ฒ์ํ ์ ์๋๋ก ๊ด๋ จ๋ ์ธํฐํ์ด์ค์ ํด๋์ค๋ค์ java.util ํจํค์ง์ ํฌํจ์์ผ ๋์๋๋ฐ, ์ด๊ฒ์ ์ด์นญํด์ ์ปฌ๋ ์ ํ๋ ์์ํฌ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ปฌ๋ ์ ํ๋ ์์ํฌ๋ ๋ช ๊ฐ์ง ์ธํฐํ์ด์ค๋ฅผ ํตํด์ ๋ค์ํ ์ปฌ๋ ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๋์ด ์๋ค. ์ฃผ์ ์ธํฐํ์ด์ค๋ก๋ List, Set, Map์ด ์๋ค.

List, Set์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ, ์ญ์ ํ๋ ๋ฐฉ๋ฒ์ ์์ด์ ๊ณตํต์ ์ด ์๊ธฐ ๋๋ฌธ์ ๊ณตํต๋ ๋ฉ์๋๋ง ๋ฐ๋ก ๋ชจ์ Collection ์ธํฐํ์ด์ค๋ก ์ ์ํด๋๊ณ , ์ด๋ฅผ ์์ํ๊ณ ์๋ค. Map์ ํค์ ๊ฐ์ ํ๋์ ์์ผ๋ก ๋ฌถ์ด์ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ก ๋์ด ์์ด ์ด๋ค๊ณผ๋ ๋ค๋ฅด๋ค.
์ธํฐํ์ด์ค ๋ถ๋ฅ | ํน์ง |
List | - ์์๋ฅผ ์ ์งํ๊ณ ์ ์ฅ - ์ค๋ณต ์ ์ฅ ๊ฐ๋ฅ |
Set | - ์์๋ฅผ ์ ์งํ์ง ์๊ณ ์ ์ฅ - ์ค๋ณต ์ ์ฅ ์๋จ |
Map | - ํค์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ์ํธ๋ฆฌ ์ ์ฅ - ํค๋ ์ค๋ณต ์ ์ฅ ์๋จ |
List ์ปฌ๋ ์
List ์ปฌ๋ ์ ์ ๊ฐ์ฒด๋ฅผ ์ธ๋ฑ์ค๋ก ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ฉด ์ธ๋ฑ์ค๊ฐ ๋ถ์ฌ๋๊ณ ์ธ๋ฑ์ค๋ก ๊ฐ์ฒด๋ฅผ ๊ฒ์, ์ญ์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
List ์ปฌ๋ ์ ์ ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฒด์ ๋ฒ์ง๋ฅผ ์ ์ฅํ๋ค. ๋ํ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ค๋ณตํด์ ์ ์ฅํ ์ ์๋๋ฐ, ์ด ๊ฒฝ์ฐ์๋ ๋์ผํ ๋ฒ์ง๊ฐ ์ ์ฅ๋๋ค. null ๋ํ ์ ์ฅ์ด ๊ฐ๋ฅํ๋ค.
ArrayList
ArrayList๋ List ์ปฌ๋ ์ ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ์ปฌ๋ ์ ์ด๋ค. ArrayList์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋ฉด ๋ด๋ถ ๋ฐฐ์ด์ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ฉฐ, ์ผ๋ฐ ๋ฐฐ์ด๊ณผ์ ์ฐจ์ด์ ์ ์ ํ ์์ด ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
List<T> list = new ArrayList<>();
์ค๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฝ์ ํ๋ฉด, ๋ค๋ก ํ๋์ฉ ๋ฐ๋ฆฌ๊ณ , ์ค๊ฐ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ฉด, ์์ผ๋ก ํ๋์ฉ ๋น๊ฒจ์ง๋ค. ๋ฐ๋ผ์ ๋น๋ฒํ ๊ฐ์ฒด ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ์ผ์ด๋๋ ๊ณณ์์๋ ArrayList ๋์ LinkedList๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
Vector
Vector๋ ArrayList์ ๋์ผํ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ฐจ์ด์ ์ Vector๋ ๋๊ธฐํ๋ ๋ฉ์๋๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฉํฐ ์ค๋ ๋๊ฐ ๋์์ Vector ๋ฉ์๋๋ฅผ ์คํํ ์ ์์ด์ ์์ ํ๊ฒ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ ๋๋ ์ญ์ ํ ์ ์๋ค.
LinkedList
LinkedList๋ ArrayList์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋์ผํ์ง๋ง ๋ด๋ถ ๊ตฌ์กฐ๋ ์์ ํ ๋ค๋ฅด๋ค. ArrayList๋ ๋ด๋ถ ๋ฐฐ์ด์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ์ง๋ง, LinkedList๋ ์ธ์ ๊ฐ์ฒด๋ฅผ ์ฒด์ธ์ฒ๋ผ ์ฐ๊ฒฐํด์ ๊ด๋ฆฌํ๋ค.
Set ์ปฌ๋ ์
Set ์ปฌ๋ ์ ์ ์ ์ฅ ์์๊ฐ ์ ์ง๋์ง ์๊ณ , ์ค๋ณตํด์ ์ ์ฅํ ์ ์๋ค.
HashSet
Set ์ปฌ๋ ์ ์ค์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๊ฒ์ด HashSet์ด๋ค.
Set<E> set = new HashSet<>();
HashSet์ ๋์ผํ ๊ฐ์ฒด๋ ์ค๋ณต ์ ์ฅํ์ง ์๋๋ค. ์ฌ๊ธฐ์ ๋์ผํ ๊ฐ์ฒด๋ ๋๋ฑ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค. hashCode() ๋ฉ์๋์ ๋ฆฌํด๊ฐ์ด ๊ฐ์์ง ๋น๊ตํ๊ณ , equals() ๋ฉ์๋๊ฐ true๋ฅผ ๋ฆฌํดํ๋ฉด ๋์ผํ ๊ฐ์ฒด๋ผ๊ณ ํ๋จํ๊ณ ์ค๋ณต ์ ์ฅํ์ง ์๋๋ค.
๋ฌธ์์ด์ HashSet์ ์ ์ฅํ ๊ฒฝ์ฐ, ๊ฐ์ ๋ฌธ์์ด์ ๊ฐ๋ String ๊ฐ์ฒด๋ ์ค๋ณต ์ ์ฅ๋์ง ์๋๋ค. ๊ฐ์ ๋ฌธ์์ด์ ๊ฐ์ง๋ String ๊ฐ์ฒด๋ hashCode()์ ๋ฆฌํด๊ฐ์ด ๊ฐ๊ณ , equals()์ ๋ฆฌํด๊ฐ์ด true์ด๊ธฐ ๋๋ฌธ์ด๋ค.
String์ด ์๋ ๋ค๋ฅธ ํ์ ์ด๋ผ๋ฉด, hashCode()์ eqauls() ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
Set ์ปฌ๋ ์ ์ ์์๊ฐ ์์ผ๋ฏ๋ก, ์ธ๋ฑ์ค๋ก ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. ๋ฐ๋ผ์ ํ๋์ฉ ๋ฐ๋ณตํด์ ๊ฐ์ ธ์์ผ ํ๋๋ฐ iterator๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
public class HashSetExample {
public static void main(String[] args) {
Set<String> set= new HashSet<>();
set.add("์ ์งฑ๊ตฌ");
set.add("๊น์ฒ ์");
set.add("์ดํ์ด");
set.add("๋งน๊ตฌ");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String element = iterator.next();
System.out.println(element);
}
for (String element : set){
System.out.println(element);
}
}
}
Map ์ปฌ๋ ์
Map ์ปฌ๋ ์ ์ ํค์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ์ํธ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ค. ์ฌ๊ธฐ์ ํค์ ๊ฐ์ ๋ชจ๋ ๊ฐ์ฒด์ด๋ค. ํค๋ ์ค๋ณต ์ ์ฅํ ์ ์๊ณ , ๊ฐ์ ์ค๋ณต ์ ์ฅํ ์ ์๋ค. ๊ธฐ์กด์ ์ ์ฅ๋ ํค์ ๋์ผํ ํค๋ก ๊ฐ์ ์ ์ฅํ๋ฉด ๊ธฐ์กด์ ๊ฐ์ ์์ด์ง๊ณ ์๋ก์ด ๊ฐ์ผ๋ก ๋์ฒด๋๋ค.
HashMap
Map<String, Integer> map = new HashMap<>();
HashMap๋ HashSet์ฒ๋ผ ๋์ผํ ๊ฐ์ฒด๋ ์ค๋ณต ์ ์ฅํ์ง ์๋๋ค. ์ฌ๊ธฐ์ ๋์ผํ ๊ฐ์ฒด๋ ๋๋ฑ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค. hashCode() ๋ฉ์๋์ ๋ฆฌํด๊ฐ์ด ๊ฐ์์ง ๋น๊ตํ๊ณ , equals() ๋ฉ์๋๊ฐ true๋ฅผ ๋ฆฌํดํ๋ฉด ๋์ผํ ๊ฐ์ฒด๋ผ๊ณ ํ๋จํ๊ณ ์ค๋ณต ์ ์ฅํ์ง ์๋๋ค.
Hashtable
Hashtable์ HashMap๊ณผ ๋์ผํ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ฐจ์ด์ ์ Hashtable์ ๋๊ธฐํ๋ ๋ฉ์๋๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฉํฐ ์ค๋ ๋๊ฐ ๋์์ Hashtable ๋ฉ์๋๋ฅผ ์คํํ ์ ์์ด์ ์์ ํ๊ฒ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ ๋๋ ์ญ์ ํ ์ ์๋ค.
LIFO์ FIFO ์ปฌ๋ ์
Stack
Stack<String> stack = new Stack<>();
Queue
Queue<String> queue = new LinkedList<>();
๋๊ธฐํ๋ ์ปฌ๋ ์
์ปฌ๋ ์ ํ๋ ์์ํฌ์ ๋๋ถ๋ถ์ ํด๋์ค๋ค์ ์ฑ๊ธ ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๋์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ปฌ๋ ์ ์ ์ ๊ทผํ๋ค๋ฉด ์๋์น ์๊ฒ ์์๊ฐ ๋ณ๊ฒฝ๋ ์ ์๋ ๋ถ์์ ํ ์ํ๊ฐ ๋๋ค.
Vector์ Hashtable์ ๋๊ธฐํ๋ ๋ฉ์๋๋ก ๊ตฌ์ฑ๋์ด ์์ด ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ๊ฒ ์์๋ฅผ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ๋๋จธ์ง๋ ๊ทธ๋ ์ง ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด์ ์ปฌ๋ ์ ํ๋ ์์ํฌ๋ ๋น๋๊ธฐํ๋ ๋ฉ์๋๋ฅผ ๋๊ธฐํ๋ ๋ฉ์๋๋ก ๋ํํ๋ Collections์ synchronizedXXX() ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
List<T> list = Collections.synchronizedList(new ArrayList<>());
๋๋ค์
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด๋ ํจ์๋ฅผ ์ ์ํ๊ณ , ์ด ํจ์๋ฅผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ถ๋ก ๋ณด๋ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ์ ๋งํ๋ค. ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ถ์์๋ ๋ฐ์ดํฐ๋ง ๊ฐ์ง๊ณ ์์ ๋ฟ, ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ด ์ ํด์ ธ ์์ง ์์ ์ธ๋ถ์์ ์ ๊ณต๋ ํจ์์ ์์กดํ๋ค.
๋๋ค์์ ๋ค์๊ณผ ๊ฐ์ ํํ์ด๋ค.
(๋งค๊ฐ๋ณ์, ...) -> { ์ฒ๋ฆฌ ๋ด์ฉ }
์๋ฐ๋ ๋๋ค์์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ ์ต๋ช ๊ตฌํ ๊ฐ์ฒด๋ก ๋ฐํํ๋ค. ์ต๋ช ๊ตฌํ ๊ฐ์ฒด๋ ์ด๋ฆ์ด ์์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.
@FunctionalInterface
public interface Calculable {
void calculate(int x, int y);
}
new Calculable() {
@Override
public void calculate(int x, int y) { ์ฒ๋ฆฌ๋ด์ฉ }
}
// ์ ์ฝ๋๋ฅผ ๋๋ค์์ผ๋ก ํํํ๋ฉด ์๋์ ๊ฐ๋ค.
(x, y) -> { ์ฒ๋ฆฌ๋ด์ฉ }
๋๋ค์์ ์ธํฐํ์ด์ค์ ์ต๋ช ๊ตฌํ ๊ฐ์ฒด์ด๋ฏ๋ก ์ธํฐํ์ด์ค ํ์ ์ ๋งค๊ฐ๋ณ์์ ๋์ ๋ ์ ์๋ค.
public class CalculableExample {
public static void main(String[] args) {
action((x, y) -> {
int result = x+y;
System.out.println(result);
});
action((x, y) -> {
int result = x-y;
System.out.println(result);
});
}
public static void action(Calculable calculable){
int x = 10;
int y = 5;
calculable.calculate(x, y);
}
}
์ธํฐํ์ด์ค์ ์ต๋ช ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋๋ค์์ผ๋ก ํํํ๋ ค๋ฉด ์ธํฐํ์ด์ค๊ฐ ๋จ ํ๋์ ์ถ์ ๋ฉ์๋๋ง ๊ฐ์ ธ์ผ ํ๋ค.
@FunctionalInterface
public interface Workable {
void work();
}
public class Person {
public void action(Workable workable){
workable.work();
}
}
public class LambdaExample {
public static void main(String[] args) {
Person person = new Person();
person.action(() -> {
System.out.println("์ถ๊ทผ");
System.out.println("์ด์ผ");
System.out.println("ํด๊ทผ");
});
person.action(() -> {
System.out.println("์ค๋์ ์ฌ๋ ๋ ");
});
}
}
๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋๋ค์
@FunctionalInterface
public interface Workable {
void work(String name, String job);
}
@FunctionalInterface
public interface Speakable {
void speak(String content);
}
public class Person {
public void action1(Workable workable){
workable.work("์ ์งฑ๊ตฌ", "์๋ฆฌ");
}
public void action2(Speakable speakable){
speakable.speak("๋งน๊ตฌ์ผ ๋์");
}
}
public class Person {
public void action1(Workable workable){
workable.work("์ ์งฑ๊ตฌ", "์๋ฆฌ");
}
public void action2(Speakable speakable){
speakable.speak("๋งน๊ตฌ์ผ ๋์");
}
}
๋ฆฌํด๊ฐ์ด ์๋ ๋๋ค์
@FunctionalInterface
public interface Calculable {
int calculate(int x, int y);
}
public class Person {
public void action(Calculable calculable){
int result = calculable.calculate(10, 5);
System.out.println(result);
}
}
public class LambdaExample {
public static void main(String[] args) {
Person person = new Person();
person.action((x, y) -> {
return x+y;
});
}
}
์คํธ๋ฆผ
์ง๊ธ๊น์ง ์ปฌ๋ ์ ๋ฐ ๋ฐฐ์ด์ ์ ์ฅ๋ ์์๋ฅผ ๋ฐ๋ณต ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ for ๋ฌธ์ ์ด์ฉํ๊ฑฐ๋ iterator๋ฅผ ์ฌ์ฉํ๋ค. Java 8๋ถํฐ๋ ์คํธ๋ฆผ์ ์ฌ์ฉํ ์ ์๋ค.
public class StreamExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("์ ์งฑ๊ตฌ");
list.add("๊น์ฒ ์");
list.add("๋งน๊ตฌ");
Stream<String> stream = list.stream();
stream.forEach(item -> System.out.println(item));
}
}
Stream๊ณผ Iterator์ ์ฐจ์ด
๋ด๋ถ ๋ฐ๋ณต์
for ๋ฌธ๊ณผ iterator๋ ์ปฌ๋ ์ ์ ์์๋ฅผ ์ปฌ๋ ์ ๋ฐ๊นฅ์ชฝ์ผ๋ก ๋ฐ๋ณตํด์ ๊ฐ์ ธ์ ์ฒ๋ฆฌํ๋๋ฐ, ์ด๊ฒ์ ์ธ๋ถ ๋ฐ๋ณต์๋ผ๊ณ ํ๋ค. ๋ฐ๋ฉด ์คํธ๋ฆผ์ ์ปฌ๋ ์ ๋ด๋ถ์์ ๋ฐ๋ณต ์ฒ๋ฆฌํ๋๋ฐ ์ด๋ฅผ ๋ด๋ถ ๋ฐ๋ณต์๋ผ๊ณ ํ๋ค.

๋ด๋ถ ๋ฐ๋ณต์๋ ๋ฉํฐ ์ฝ์ด CPU๋ฅผ ํ์ฉํ๊ธฐ ์ํด ์์๋ค์ ๋ถ๋ฐฐ์์ผ ๋ณ๋ ฌ ์์ ์ ํ ์ ์๋ค. ํ๋์ฉ ์ฒ๋ฆฌํ๋ ์์ฐจ์ ์ธ๋ถ ๋ฐ๋ณต์๋ณด๋ค๋ ํจ์จ์ ์ผ๋ก ์์๋ฅผ ๋ฐ๋ณต์ํฌ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
public class LambdaExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("์ ์งฑ๊ตฌ");
list.add("๊น์ฒ ์");
list.add("๋งน๊ตฌ");
Stream<String> parallelStream = list.parallelStream();
parallelStream.forEach(item -> System.out.println(item + " : " + Thread.currentThread().getName()));
}
}
์ค๊ฐ ์ฒ๋ฆฌ์ ์ต์ข ์ฒ๋ฆฌ
์คํธ๋ฆผ์ ํ๋ ์ด์ ์ฐ๊ฒฐ๋ ์ ์๋ค. ์ค๋ฆฌ์ง๋ ์คํธ๋ฆผ์์ ๋ค๋ฅธ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ ์ ์๋ค๋ ์๋ฏธ์ด๋ค. ์ค๋ฆฌ์ง๋ ์คํธ๋ฆผ ๋ค์ ํํฐ๋ง ์ค๊ฐ ์คํธ๋ฆผ์ด ์ฐ๊ฒฐ๋ ์ ์๊ณ , ๊ทธ ๋ค์ ๋งคํ ์ค๊ฐ ์คํธ๋ฆผ์ด ์ฐ๊ฒฐ๋ ์ ์๋ค. ์ด์ ๊ฐ์ด ์คํธ๋ฆผ์ด ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ์ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ด๋ผ๊ณ ํ๋ค.
public class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
}
public class StreamPipeLineExample {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student("์ ์งฑ๊ตฌ", 100));
list.add(new Student("๊น์ฒ ์", 50));
list.add(new Student("์ดํ์ด", 0));
double avg = list.stream()
.mapToInt(student -> student.getScore())
.average()
.getAsDouble();
System.out.println("avg = " + avg);
}
}
์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ผ๋ก ๊ตฌ์ฑํ ๋ ์ฃผ์ํ ์ ์ ํ์ดํ๋ผ์ธ์ ๋งจ ๋์๋ ๋ฐ๋์ ์ต์ข ์ฒ๋ฆฌ ๋ถ๋ถ์ด ์์ด์ผ ํ๋ค. ์ต์ข ์ฒ๋ฆฌ๊ฐ ์๋ค๋ฉด ์ค๋ฆฌ์ง๋ ๋ฐ ์ค๊ฐ ์ฒ๋ฆฌ ์คํธ๋ฆผ์ ๋์ํ์ง ์๋๋ค.
๋ค์ํ ๋ฆฌ์์ค๋ก๋ถํฐ ์คํธ๋ฆผ ์ป๊ธฐ
์ฐธ๊ณ ํ์ฌ ํด๊ฒฐํ์.
์์ ๊ฑธ๋ฌ๋ด๊ธฐ(ํํฐ๋ง)
ํํฐ๋ง์ ์์๋ฅผ ๊ฑธ๋ฌ๋ด๋ ์ค๊ฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ด๋ค. ํํฐ๋ง ๋ฉ์๋์๋ ์ค๋ณต์ ์ ๊ฑฐํ๋ distinct()์ ๋๋ค์์ผ๋ก ์กฐ๊ฑด ํํฐ๋ง์ด ๊ฐ๋ฅํ filter()๊ฐ ์๋ค.
public class FilteringExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("์ ์งฑ๊ตฌ");
list.add("๋งน๊ตฌ");
list.add("์ดํ์ด");
list.add("์ดํ์ด");
list.add("ํ์ ๋ฆฌ");
list.add("๊น์ฒ ์");
list.stream().distinct().forEach(name -> System.out.println(name));
System.out.println();
list.stream().filter(name -> name.startsWith("์ ")).forEach(name -> System.out.println(name));
}
}
์์ ๋ณํ(๋งคํ)
๋งคํ์ ์คํธ๋ฆผ์ ์์๋ฅผ ๋ค๋ฅธ ์์๋ก ๋ณํํ๋ ์ค๊ฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ด๋ค.
์์๋ฅผ ๋ค๋ฅธ ์์๋ก ๋ณํ
mapXxx() ๋ฉ์๋๋ ์์๋ฅผ ๋ค๋ฅธ ์์๋ก ๋ณํํ ์๋ก์ด ์คํธ๋ฆผ์ ๋ฆฌํดํ๋ค.
public class MapExample {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student("์ ์งฑ๊ตฌ", 100));
list.add(new Student("๊น์ฒ ์", 50));
list.add(new Student("์ดํ์ด", 0));
list.stream()
.mapToInt(student -> student.getScore())
.forEach(score -> System.out.println(score));
}
}
public class MapExample {
public static void main(String[] args) {
int[] intArray = { 1, 2, 3, 4, 5 };
IntStream intStream = Arrays.stream(intArray);
intStream.asDoubleStream()
.forEach(value -> System.out.println(value));
intStream = Arrays.stream(intArray);
Stream<Integer> boxedStream = intStream.boxed();
boxedStream.forEach(obj -> System.out.println(obj.intValue()));
}
}
์์๋ฅผ ๋ณต์ ๊ฐ์ ์์๋ก ๋ณํ
flatMapXxx() ๋ฉ์๋๋ ํ๋์ ์์๋ฅผ ๋ณต์ ๊ฐ์ ์์๋ค๋ก ๋ณํํ ์๋ก์ด ์คํธ๋ฆผ์ ๋ฆฌํดํ๋ค.
public class FlatMappingExample {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("i am sherlock");
list1.add("my friend is watson");
list1.stream().
flatMap(data -> Arrays.stream(data.split(" ")))
.forEach(word -> System.out.println(word));
}
}
์์ ์ ๋ ฌ
์คํธ๋ฆผ์ ์์๊ฐ ๊ฐ์ฒด์ผ ๊ฒฝ์ฐ, ๊ฐ์ฒด๊ฐ Comparable์ ๊ตฌํํ๊ณ ์์ด์ผ๋ง stream์์ sorted() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฌํ ์ ์๋ค. ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ ์ถ์ผ๋ฉด, sorted() ๋ฉ์๋ ๋ด๋ถ์ Comparator.reverseOrder()๋ฅผ ์ถ๊ฐํ๋ค.
public class Student implements Comparable<Student> {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
@Override
public int compareTo(Student o) {
return Integer.compare(score, o.score);
}
}
public class SortingExample {
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
studentList.add(new Student("์ ์งฑ๊ตฌ", 100));
studentList.add(new Student("๊น์ฒ ์", 50));
studentList.add(new Student("์ดํ์ด", 0));
studentList.stream().sorted().forEach(student -> System.out.println(student.getName()));
System.out.println();
studentList.stream().sorted(Comparator.reverseOrder()).forEach(student -> System.out.println(student.getName()));
}
}
๊ฐ์ฒด๊ฐ Comparable์ ๊ตฌํํ๊ณ ์์ง ์๋ค๋ฉด, ๋น๊ต์๋ฅผ ์ ๊ณตํ์ฌ ๋๋ค์์ผ๋ก ์์ฑํ์ฌ ํด๊ฒฐํ ์๋ ์๋ค.
public class SortingExample {
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
studentList.add(new Student("์ ์งฑ๊ตฌ", 100));
studentList.add(new Student("๊น์ฒ ์", 50));
studentList.add(new Student("์ดํ์ด", 0));
studentList.stream()
.sorted((s1, s2)->Integer.compare(s1.getScore(), s2.getScore()))
.forEach(student -> System.out.println(student.getName()));
System.out.println();
studentList.stream()
.sorted((s1, s2)->Integer.compare(s2.getScore(), s1.getScore()))
.forEach(student -> System.out.println(student.getName()));
}
}
์์ ์กฐ๊ฑด ๋ง์กฑ ์ฌ๋ถ(๋งค์นญ)
๋งค์นญ์ ์์๋ค์ด ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ์ฌ๋ถ๋ฅผ ์กฐ์ฌํ๋ ์ต์ข ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ด๋ค. ๋งค์นญ๊ณผ ๊ด๋ จ๋ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
๋ฆฌํด ํ์ | ๋ฉ์๋ | ์กฐ์ฌ ๋ด์ฉ |
boolean | allMatch | ๋ชจ๋ ์์๊ฐ ๋ง์กฑํ๋์ง ์ฌ๋ถ |
boolean | anyMatch | ์ต์ํ ํ๋์ ์์๊ฐ ๋ง์กฑํ๋์ง ์ฌ๋ถ |
boolean | noneMatch | ๋ชจ๋ ์์๊ฐ ๋ง์กฑํ์ง ์๋์ง ์ฌ๋ถ |
public class MatchingExample {
public static void main(String[] args) {
int[] intArr = { 2, 4, 6 };
boolean result = Arrays.stream(intArr)
.allMatch(a->a%2==0);
System.out.println("๋ชจ๋ ์ง์์ธ๊ฐ? : " + result);
}
}
์์ ๊ธฐ๋ณธ ์ง๊ณ
์ง๊ณ๋ ์ต์ข ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ผ๋ก ์์๋ค์ ์ฒ๋ฆฌํด์ ์นด์ดํ (๊ฐ์ ์ธ๊ธฐ), ํฉ๊ณ, ํ๊ท ๊ฐ, ์ต๋๊ฐ, ์ต์๊ฐ ๋ฑ๊ณผ ๊ฐ์ด ํ๋์ ๊ฐ์ผ๋ก ์ฐ์ถํ๋ ๊ฒ์ ๋งํ๋ค. ์ฆ, ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํด์ ํ๋์ ๊ฐ์ผ๋ก ์ถ์ํ๋ ๋ฆฌ๋์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๋ฆฌํด ํ์ | ๋ฉ์๋(๋งค๊ฐ๋ณ์) | ์ค๋ช |
long | count() | ์์ ๊ฐ์ |
OptionalXXX | findFirst() | ์ฒซ ๋ฒ์งธ ์์ |
Optional<T> OptionalXXX |
max(Comparator<T>) max() |
์ต๋ ์์ |
Optional OptionalXXX |
min(Comparator<T>) min() |
์ต์ ์์ |
OptionalDouble | average() | ์์ ํ๊ท |
int, long, double | sum() | ์์ ์ดํฉ |
public class AggregateExample {
public static void main(String[] args) {
int[] intArr = { 1, 2, 3, 4, 5 };
long count = Arrays.stream(intArr).count();
System.out.println("count = " + count);
int sum = Arrays.stream(intArr).sum();
System.out.println("sum = " + sum);
double avg = Arrays.stream(intArr).average().getAsDouble();
System.out.println("avg = " + avg);
}
}
Optional ํด๋์ค
Optional, OptionalDouble, OptionalInt, OptionalLong ํด๋์ค๋ ๋จ์ํ ์ง๊ณ๊ฐ๋ง ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ ์ง๊ณ๊ฐ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ, ๋ํดํธ ๊ฐ์ ์ค์ ํ๊ฑฐ๋ ์ง๊ณ๊ฐ์ ์ฒ๋ฆฌํ๋ Consumer๋ฅผ ๋ฑ๋กํ ์ ์๋ค. ๋ค์์ Optional ํด๋์ค๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋์ด๋ค.
๋ฆฌํด ํ์ | ๋ฉ์๋ | ์ค๋ช |
boolean | isPresent() | ์ง๊ณ๊ฐ์ด ์๋์ง ์ฌ๋ถ |
T double int long |
orElse(T) orElse(double) orElse(int) orElse(long) |
์ง๊ณ๊ฐ์ด ์์ ๊ฒฝ์ฐ, ๋ํดํธ ๊ฐ ์ค์ |
void | ifPresent(๋๋ค์) | ์ง๊ณ๊ฐ์ด ์์ ๊ฒฝ์ฐ, ๋๋ค์ ์คํ |
public class OptionalExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
OptionalDouble optional = list.stream().mapToInt(Integer::intValue).average();
if (optional.isPresent()){
System.out.println(optional.getAsDouble());
}
else{
System.out.println(0.0);
}
list.stream().mapToInt(Integer::intValue).average().ifPresent(avg-> System.out.println(avg));
list.stream().mapToInt(Integer::intValue).average().orElse(0.0);
}
}
์์ ์์ง
์คํธ๋ฆผ์ ์์๋ค์ ํํฐ๋ง ๋๋ ๋งคํํ ํ ์์๋ค์ ์์งํ๋ ์ต์ข ์ฒ๋ฆฌ ๋ฉ์๋์ธ collect()๋ฅผ ์ ๊ณตํ๋ค. ์ด ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ํ์ํ ์์๋ง ์ปฌ๋ ์ ์ ๋ด์ ์ ์๊ณ , ์์๋ค์ ๊ทธ๋ฃนํํ ํ์ ์ง๊ณ๋ ํ ์ ์๋ค.
public class CollectExample {
public static void main(String[] args) {
List<Student> totalList = new ArrayList<>();
totalList.add(new Student("์ ์งฑ๊ตฌ", "๋จ",100));
totalList.add(new Student("๊น์ฒ ์", "๋จ",54));
totalList.add(new Student("ํ์ ๋ฆฌ", "์ฌ",80));
List<Student> maleList = totalList.stream().filter(s -> s.getSex().equals("๋จ")).toList();
maleList.stream().forEach(s-> System.out.println(s.getName()));
System.out.println();
Map<String, Integer> map = totalList.stream().collect(
Collectors.toMap(
s -> s.getName(),
s -> s.getScore()
)
);
System.out.println(map);
}
}
'๐๐ปโโ๏ธ ๊ธฐ๋ณธํ๋ จ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ชจ๋ ์๋ฐ ์ธ ์ก์ ] ๋๋ค ํํ์ (0) | 2024.09.04 |
---|---|
[๋ชจ๋ ์๋ฐ ์ธ ์ก์ ] ๋์ ํ๋ผ๋ฏธํฐํ ์ฝ๋ ์ ๋ฌํ๊ธฐ (0) | 2024.09.03 |
[JPA] ์๋ช ์ฃผ๊ธฐ ์ผ์น ์ ์ฐธ์กฐ ๋ณ๊ฒฝ์ ์ํ์ฑ (0) | 2024.08.19 |
[JPA] JPA ๊ธฐ์ด (0) | 2024.08.02 |
[JPA] not connection (0) | 2024.07.28 |