1. Java 8์˜ ํ˜์‹ : ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

Java 8์ด ์ถœ์‹œ๋˜๋ฉด์„œ ์ด ์–ธ์–ด๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ง€์›์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค . ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ์˜ค๋žซ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์˜จ ์ง€์›์„ ์–ป์—ˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์› ์ง€๋งŒ ์ฝ”๋”ฉ์€ ๋” ๋นจ๋ผ์กŒ์Šต๋‹ˆ๋‹ค ๐Ÿ™‚

Java๋กœ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์šฐ๊ธฐ ์ „์— ๋‹ค์Œ ์„ธ ๊ฐ€์ง€๋ฅผ ์ž˜ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  1. OOP, ์ƒ์† ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค( Java Core ํ€˜์ŠคํŠธ์˜ ๋ ˆ๋ฒจ 1-2 ).
  2. ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„ .
  3. ๋‚ด๋ถ€ ๋ฐ ์ต๋ช… ํด๋ž˜์Šค .

์ข‹์€ ์†Œ์‹์€ Java์—์„œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ชจ๋“  ๊ฒƒ์„ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์œ ์†Œ์‹์€ ์ต๋ช…์˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ฐฐ์—ด๋˜๊ณ  ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ ˆ์Šจ์—์„œ๋Š” ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด ์—†์ด Java์˜ ๊ธฐ๋Šฅ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•œ์ง€์— ์ค‘์ ์„ ๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Java์—์„œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ชจ๋“  ๋‰˜์•™์Šค๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋ช‡ ๋‹ฌ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋ช‡ ์‹œ๊ฐ„ ์•ˆ์— ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž‘๊ฒŒ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. I/O ์ŠคํŠธ๋ฆผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.


2. I/O ์ŠคํŠธ๋ฆผ: ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ

์˜›๋‚  ์˜›์ ์— I/O ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•ด ๋ฐฐ์šด ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹ญ๋‹ˆ๊นŒ: , InputStream, OutputStream๋“ฑ ?ReaderWriter

์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์ŠคํŠธ๋ฆผ ํด๋ž˜์Šค๊ฐ€ ์žˆ์—ˆ๊ณ  ๋ฐ ์™€ FileInputSteam๊ฐ™์€ ๋‹ค๋ฅธ ์ŠคํŠธ๋ฆผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค .InputStreamReaderBufferedReader

์ด๋Ÿฌํ•œ ์ŠคํŠธ๋ฆผ์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

FileInputStream input = new FileInputStream("c:\\readme.txt");
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buff = new BufferedReader(reader);

String text = buff.readLine();

์ฝ”๋“œ์˜ ์ฒ˜์Œ ๋ช‡ ์ค„์—์„œ Stream๊ฐ์ฒด ์ฒด์ธ์„ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์•„์ง ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ต๊ณผํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฆ‰์‹œ buff.readLine()๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ฐœ์ฒด ๋Š” ๊ฐœ์ฒด ์˜ ๋ฉ”์„œ๋“œ๋ฅผ BufferedReaderํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.read()InputStreamReader
  2. ๊ฐœ์ฒด ๋Š” ๊ฐœ์ฒด ์˜ ๋ฉ”์„œ๋“œ๋ฅผ InputStreamReaderํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.read()FileInputStream
  3. ๊ฐœ์ฒด ๊ฐ€ ํŒŒ์ผ์—์„œFileInputStream ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, read()๋˜๋Š” ๊ฐ™์€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์‹œ์ž‘ํ•  ๋•Œ๊นŒ์ง€ ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค readLine(). ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋‹จ์ˆœํ•œ ๊ตฌ์„ฑ์€ ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ ์ž์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ์„œ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.

์ปฌ๋ ‰์…˜ ๋ฐ ์ŠคํŠธ๋ฆผ

Java 8๋ถ€ํ„ฐ ์ปฌ๋ ‰์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์ŠคํŠธ๋ฆผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์ปฌ๋ ‰์…˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ). ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ์ฒด์ธ์„ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์ด์ „์— 5-10์ค„์ด ๊ฑธ๋ ธ๋˜ ์ฝ”๋“œ๋ฅผ ์ด์ œ 1-2์ค„๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ๋ชฉ๋ก์—์„œ ๊ฐ€์žฅ ๊ธด ๋ฌธ์ž์—ด์„ ์ฐพ๋Š” ์˜ˆ:

๊ฐ€์žฅ ๊ธด ๋ฌธ์ž์—ด ์ฐพ๊ธฐ
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max((s1, s2)-> s1.length()-s2.length()).get();
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> optional = stream.max((s1, s2)-> s1.length()-s2.length());
String max = optional.get();

3. Stream์ธํ„ฐํŽ˜์ด์Šค

์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ Java 8์˜ ํ™•์žฅ๋œ ์ง€์›์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค Stream<T>. ์—ฌ๊ธฐ์„œ T๋Š” ์ŠคํŠธ๋ฆผ์—์„œ ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ด๋Š” ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ŠคํŠธ๋ฆผ์€ ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜•๊ณผ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.

์ปฌ๋ ‰์…˜ ์—์„œ ์ŠคํŠธ๋ฆผ ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค stream(). ์ฝ”๋“œ๋Š” ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Stream<Type> name = collection.stream();
์ปฌ๋ ‰์…˜์—์„œ ์ŠคํŠธ๋ฆผ ๊ฐ€์ ธ์˜ค๊ธฐ

์ด ๊ฒฝ์šฐ ์ปฌ๋ ‰์…˜์€ ์ŠคํŠธ๋ฆผ์˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ๊ฐ„์ฃผ๋˜๋ฉฐ Stream<Type>๊ฐœ์ฒด๋Š” ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์˜ ํ˜•ํƒœ๋กœ ์ปฌ๋ ‰์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋„๊ตฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์ปฌ๋ ‰์…˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐฐ์—ด ์—์„œ๋„ ์ŠคํŠธ๋ฆผ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์ด๋ ‡๊ฒŒํ•˜๋ ค๋ฉด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค . ์˜ˆ๋ฅผ ๋“ค์–ด:Arrays.stream()

Stream<Type> name = Arrays.stream(array);
๋ฐฐ์—ด์—์„œ ์ŠคํŠธ๋ฆผ ๊ฐ€์ ธ์˜ค๊ธฐ

์ด ๊ฒฝ์šฐ ์–ด๋ ˆ์ด๋Š” ๋ผ๋Š” ์ŠคํŠธ๋ฆผ ์˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค name.

Integer[] array = {1, 2, 3};
Stream<Integer> stream = Arrays.stream(array);

๊ฐœ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋™๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค Stream<Type>. ์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์ŠคํŠธ๋ฆผ ๊ฐœ์ฒด๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.