hades

[Java] ์ž๋ฐ” ๊ธฐ์ดˆ ๋ณธ๋ฌธ

๐Ÿƒ๐Ÿปโ€โ™‚๏ธ ๊ธฐ๋ณธํ›ˆ๋ จ/Java

[Java] ์ž๋ฐ” ๊ธฐ์ดˆ

hades1 2024. 8. 27. 15:31

๋ณธ ๊ธ€์€ ์ž๋ฐ”๋ฅผ ํ•™์Šตํ•˜๋ฉด์„œ, ํƒ€ ์–ธ์–ด์—์„œ ์•Œ๊ณ  ์žˆ๋˜ ๋‚ด์šฉ ์ด์™ธ์— ์ถ”๊ฐ€๋กœ ๊ธฐ์–ตํ•  ์‚ฌํ•ญ์„ ์ •๋ฆฌํ•˜์—ฌ ์ž‘์„ฑํ•œ ๊ธ€์ด๋‹ค. ์ฆ‰, ๋ชจ๋“  ๋‚ด์šฉ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€๋Š” ์•Š๋‹ค.

 

๋ณ€์ˆ˜์™€ ํƒ€์ž…

๋ช…๋ช… ๊ด€๋ก€

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ์—ฌ๋Ÿฌ ๋‹จ์–ด๋ฅผ ํ˜ผํ•ฉํ•˜์—ฌ ๋ช…๋ช…ํ•˜๋Š” ๊ฒฝ์šฐ, 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);
    }
}