DevLog ๐ถ
[๋ชจ๋์๋ฐ์ธ์ก์ ] ์๋ฐ 8๋ก ์ค๋ฉด์ ์๊ธด ์ผ ๋ณธ๋ฌธ
[๋ชจ๋์๋ฐ์ธ์ก์ ] ์๋ฐ 8๋ก ์ค๋ฉด์ ์๊ธด ์ผ
dolmeng2 2023. 2. 23. 22:31๐ฌ ๋ชจ๋ ์๋ฐ ์ธ ์ก์ ์ฑํฐ 1์ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
โ๏ธ ์๋ฐ ํจ์
์๋ฐ์์ ํํ 'ํจ์', ๊ทธ๋ฆฌ๊ณ '๋ฉ์๋'๋ผ๋ ์ด๋ฆ์ ๋ง์ด ๋ค์ ์ ์๋ค.
์คํฐ๋์์ ํฌ๋ฃจ๋ถ์ด ํจ์์ ๋ฉ์๋์ ๋ํด์ ์ ์๋ฅผ ํด์ฃผ์ จ๋๋ฐ, ํฌ๊ฒ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ ์ ์๋ค.
๋จ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ 'ํจ์'๋ '๋ฉ์๋'์ ๋์ผํ ์๋ฏธ๋ก ์ฐ์ผ ์ ์์ผ๋ฉฐ, ํนํ static method์ ๋ํด์ ๊ฐ์ ์๋ฏธ๋ก ์ฌ์ฉ๋๋ค. ๊ทธ๋ฌ๋, ์๋ฐ์์ ํจ์๋ '์ํ์ ์ธ ํจ์'๋ก, ๋ถ์์ฉ์ ์ผ์ผํค์ง ์๋ ํจ์๋ฅผ ๋งํ ์ ์๋ค.
๊ทธ ์ธ์ ํจ์๋ '๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ฉฐ, ํ๋์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ก ๊ตฌ์ฑํ ๊ฒ'์ด๋ฉฐ, ๋ฉ์๋๋ 'ํด๋์ค ๋ด๋ถ์ ์ ์๋์ด, ๊ฐ์ฒด์ ์์ฑ์ ๋ค๋ฃจ๊ธฐ ์ํ ํ์'๋ผ๊ณ ๋ ํ๋๋ฐ ๋ ๋ฆฝ์ ์ธ์ง, ์ข ์์ ์ธ์ง์ ๋ฐ๋ฅธ๋ค๊ณ ๋ณผ ์ ์๋ค.
โ๏ธ ์ผ๊ธ ๊ฐ์ฒด (First-class)
์ฐ๋ฆฌ๋ ๋ณดํต ํ๋ก๊ทธ๋๋ฐ์ ํ ๋, '์ผ๊ธ ๊ฐ์ฒด'๋ผ๋ ๋ง์ ๋ค์ด๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค. ์ผ๊ธ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ๋ํด '์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํ ์ฐ์ฐ์ ๋ชจ๋ ์ง์ํ๋ ๊ฐ์ฒด'๋ฅผ ์๋ฏธํ๋ค. ๋จ์ํ ์ด ๋ฌธ์ฅ์ ๋ณด๋ฉด ๋ฌด์จ ์๋ฆฌ์ธ์ง ์ดํดํ๊ธฐ ์ด๋ ต๋ค. ์ฌ๊ธฐ์ ๋งํ๋ '์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํ ์ฐ์ฐ'์ด๋ผ๋ ๊ฒ ๋ฌด์์๊น?
1. ๋ณ์๋ ๋ฐ์ดํฐ์ ๊ฐ์ ํ ๋นํ ์ ์์ด์ผ ํ๋ค.
2. ๊ฐ์ฒด์ ์ธ์๋ก ๋๊ธธ ์ ์์ด์ผ ํ๋ค.
3. ๊ฐ์ฒด์ ๋ฆฌํด๊ฐ์ผ๋ก ๋ฆฌํดํ ์ ์์ด์ผ ํ๋ค.
๊ทธ๋ผ, ๊ฐ๊ฐ์ ์์๋ค์ ๋ํด์ ์ ์๊ฐํด๋ณด์. ์๋ฐ์ ๋ฉ์๋๋ ์ ์ผ๊ธ ๊ฐ์ฒด๋ผ๊ณ ํ ์ ์์๊น?
public class Test {
public static void main(String[] args) {
// ๋ฉ์๋๋ฅผ ๋ณ์์ ํ ๋นํ ์ ์๋ค.
Object value = sample;
}
public static void sample() {
System.out.println("I'm Sample!");
}
}
์๋ฐ์์ ๋ฉ์๋ ๊ทธ ์์ฒด๋ฅผ ๋ณ์ ์์ฒด์ ํ ๋นํ๋ ๊ฒ์ ๋ณธ ์ ์์ ๊ฒ์ด๋ค. ๋ฉ์๋์ ๋ฆฌํด ๊ฐ์ด ์๋, ๋ฉ์๋ ๊ทธ ์์ฒด๋ฅผ ํ ๋นํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
public class Test {
public static void main(String[] args) {
// ๋ฉ์๋ ์์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ ์ ์๋ค.
hello((Object) sample);
}
public static String hello(Object method) {
...
}
public static void sample() {
System.out.println("I'm Sample!");
}
}
public class Test {
public static String hello() {
return sample;
}
public static String sample() {
return "Sample!";
}
}
๋ํ, ๋ฉ์๋ ๊ทธ ์์ฒด๋ฅผ ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ ์ ์์ผ๋ฉฐ, ๋ฉ์๋์ ๋ฆฌํด ๊ฐ์ผ๋ก ๋ฐ๋ก ๋ฐํํ ์๋ ์๋ค.
๊ทธ๋์ ๋ณดํต ์๋ฐ์ ๋ฉ์๋๋ ์ผ๊ธ ๊ฐ์ฒด๋ผ๊ณ ํ์ง ์๋๋ค. (๋ณดํต '์ด๊ธ ๊ฐ์ฒด, ์ด๊ธ ์๋ฏผ'์ด๋ผ๊ณ ํ๋ค) ํ์ง๋ง, ์๋ฐ์ ๋๋ค์์ด๋ ์ต๋ช ํด๋์ค๋ฅผ ํ์ฉํ๊ฒ ๋๋ฉด ๋ณ์๋ ๋งค๊ฐ๋ณ์์ ํ ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ ์ผ๊ธ ๊ฐ์ฒด์ ์๊ฑด์ ์ถฉ์กฑํ ์ ์๋ค. ๋ณธ ์ฑ ์์๋ ์๋ฐ 8์์ "ํจ์"๊ฐ ์๋ก ์ถ๊ฐ๋๋ฉฐ, ์ด๋ฌํ ์ผ๊ธ ๊ฐ์ฒด์ ํน์ฑ์ ๋ง์กฑํ ์ ์๋๋ก ํจ์ ์์ฒด๋ฅผ "๊ฐ"์ผ๋ก ์ทจ๊ธํ์ฌ ๋ง๋ค์ด ์ค๋ค.
์์ผ๋ก ๋ณธ ์ฑ ์ ํ์ตํ๋ฉด์ ๊ฐ๊ฐ์ ๋ํด ํ์ตํ ์์ ์ด๊ธฐ ๋๋ฌธ์, ์ฌ๊ธฐ์๋ ์ด์ ๋๋ง ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๊ณ ๋์ด๊ฐ๋๋ก ํ๊ฒ ๋ค ๐ฅน
โ๏ธ ์๋ฐ 8์์์ ์๋ก์ด ๊ธฐ๋ฅ
- ์๋ฐ 8์์๋ ๋ฉ์๋๋ฅผ ๊ฐ์ฒ๋ผ, ์ผ๊ธ ๊ฐ์ฒด๋ก ์ทจ๊ธํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ '๋ฉ์๋ ์ฐธ์กฐ'๋ผ๊ณ ํ๋ค.
File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isHidden();
}
});
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด, ๊ธฐ์กด์๋ ๋งค๊ฐ๋ณ์๋ก ๋ฉ์๋๋ฅผ ์ ๋ฌํด์ฃผ๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ด ๊ธด ๊ตฌํ์ฒด๋ฅผ ํจ๊ป ์ ์ธํด์ ๋ณด๋ด์ฃผ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ ์ฝ๋๋ฅผ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ํตํด์ ์์ ํด๋ณด์.
File[] hiddenFiles = new File(".").listFiles(File::isHidden);
๋ค์๊ณผ ๊ฐ์ด ::๋ฅผ ์ฌ์ฉํด์ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ๋ง์น '๊ฐ'์ ์ ๋ฌํ๋ ๊ฒ์ฒ๋ผ ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฌํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฆ, ::๋ ‘ํด๋น ๋ฉ์๋๋ฅผ ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ผ’๋ ์๋ฏธ๋ก ๋ณผ ์ ์๋ค.
๋ํ, ๋๋ค์์ ํ์ฉํ์ฌ ๋ฉ์๋๋ฅผ ๊ฐ์ฒ๋ผ ์ทจ๊ธํ ์ ์๋ค. ์ฌ์ฌ์ฉ์ฑ์ด ์๊ณ ๊ฐ๋จํ ์ฝ๋์ ๊ฒฝ์ฐ ๋๋ค๋ฅผ ํ์ฉํ์.
(int x) -> x + 1
โ๏ธ ๋์ ํ๋ผ๋ฏธํฐํ ์ดํดํ๊ธฐ
๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ์์๋ณด๊ธฐ ์ ์, ๊ฐ๋จํ ์์ ๋ฅผ ์ดํด๋ณด์. ์๋ ์์ ๋ ์ด๋ก์ ์ฌ๊ณผ์ ๋ํด์ ํํฐ๋ง์ ์งํํ๋ ์ฝ๋์ด๋ค.
public static List<Apple> filterGreenApples(List<Apple> inventory) {
List<Apple> result = new ArrayList<>();
for (Apple apple: inventory) {
if (GREEN.equals(apple.getColor())) {
result.add(apple);
}
} return result;
}
๋ฌผ๋ก , ์ด๋ ๊ฒ ํ๋ฉด ์ง๊ด์ ์ด๊ณ ์ ์์๋ณผ ์ ์๋ค. ํ์ง๋ง, ๋ญ๊ฐ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋ง ํ๊ณ ์ถ์ ์๋ง์ด ์๊ธด๋ค ๐ค
public static boolean isGreenApple(Apple apple) {
return GREEN.equals(apple.getColor());
}
public interface Predicate<T>{
boolean test(T t);
}
static List<Apple> filterApples(List<Apple> inventory,
Predicate<Apple> p) {
List<Apple> result = new ArrayList<>();
for (Apple apple: inventory) {
if (p.test(apple)) { // p์ ๋ํ ์กฐ๊ฑด ๊ฒ์ฆ
result.add(apple);
}
}
return result;
}
Predicate๋ฅผ ํ์ฉํด์ ๋ง์น, ์ ๋ต ํจํด์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ์ฃผ์ ์ ๋ฐ์์ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ ์ ์๋ค. ๋ณธ ์ฑ ์์๋ Predicate๋ฅผ
'์ธ์๋ก ๊ฐ์ ๋ฐ์ true ํน์ false๋ฅผ ๋ฐํํ๋ ํจ์'๋ผ๊ณ ํํํ์๋ค. ์ด ๋ด์ฉ์ Chapter 2์์ ์กฐ๊ธ ๋ ์์ธํ ๋ค๋ฃฐ ์์ ์ด๊ธฐ ๋๋ฌธ์ ์ง๊ธ์ ๊ทธ๋ฅ ์ด๋ฐ ๊ฒ๋ ์๊ตฌ๋... ๐ค ํ๊ณ ๋์ด๊ฐ๋ ์ข๋ค.
์๋ฌดํผ, ์ด๋ ๊ฒ ์ ์ธ์ ํด์ฃผ๊ฒ ๋๋ฉด, filterApples(inventory, Apple::isGreenApple)๊ณผ ๊ฐ์ ํ์์ผ๋ก ๋ฉ์๋๋ฅผ ์ผ๊ธ ๊ฐ์ฒด์ฒ๋ผ ๋๊ฒจ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
โ๏ธ ๋ฉ์๋ ๋ง๊ณ , ๋๋ค๋ก ํด๊ฒฐํด๋ณผ๋?
๋ฉ์๋๋ก ์ ๋ฌํด ์ฃผ๋ ค๋ฉด, ๊ฒฐ๊ตญ ๋ฉ์๋๋ฅผ ์ ์ธํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ํ์ง๋ง, ๋ฉ์๋๋ฅผ ์ ์ธํ๋ค๋ ๊ฒ์ ํด๋น ๋ฉ์๋์ ๋ค์ด๋ฐ๊ณผ ์์น๊น์ง ๊ณ ๋ คํด์ผ ํ๋ ๊ฒ ๋ง๋ค. ๊ท์ฐฎ๋ค๋ฉด! ์ต๋ช ํจ์ / ๋๋ค๋ฅผ ํ์ฉํ์ฌ ๋ฐ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ ์ํด์ค ์๋ ์๋ค.
filterApples(inventory, (Apple a) -> GREEN.equals(a.getColor());
์ด ๋ฉ์๋ ํ๋ ์์์ "์ฌ๊ณผ์ ์์์ด ์ด๋ก์์ธ ์ฌ๊ณผ๋ฅผ ํํฐ๋งํ๋ค"๊ฐ ๋ฐ๋ก ๋๋ฌ๋๋ ๊ฑธ ๋ณผ ์ ์๋ค. ๊ทธ๋ฌ๋, ๋ฌด๋ถ๋ณํ๊ฒ ์ฌ์ฉํ๋ ๊ฑด ์ข์ง ์๋ค. ๋๋ค ๋ด๋ถ์ ์์ด ๊ธธ์ด์ง๋ค๋ฉด ์คํ๋ ค ๋ณด๊ธฐ ํ๋ค๊ธฐ ๋๋ฌธ์ ๋ฉ์๋๋ก ์ ์ํด์ ๋ฉ์๋ ๋ค์ด๋ฐ์ ํตํด ํด๋น ๋ฉ์๋๊ฐ ํ๋ ์ผ์ ์ ์ ์ํ๊ณ , ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ์งํํ๋ ๊ฒ์ด ์ข๋ค.
โ๏ธ Stream ํ์ฉํ๊ธฐ
ํ์ง๋ง, ์ ์ฝ๋์์๋ ์ฌ์ ํ ๋ถํธํ ์ ์ด ์กด์ฌํ๋ค.
List<Apple> result = new ArrayList<>();
for (Apple apple: inventory) {
if (p.test(apple)) { // p์ ๋ํ ์กฐ๊ฑด ๊ฒ์ฆ
result.add(apple);
}
}
for-each๋ฅผ ํตํด ์ํ๋ฅผ ํ๊ฒ ๋๋ฉด, ๋ช ์์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฃ๊ธฐ ์ํ List ์ ์ธ๋ถํฐ ๋ฃ์ด์ฃผ๋ ๊ณผ์ ๊น์ง ์ง์ ์ ์ธํด์ค์ผ ํ๋ค. ํ์ง๋ง, ๊ฐ๋ฐ์๋ ๊ท์ฐฎ๋ค. ์ปฌ๋ ์ ์ for-each ๊ตฌ๋ฌธ์ผ๋ก ํตํด ๊ฐ ์์๋ฅผ ๋ฐ๋ณตํ๋ฉด์ ์์ ์ ์ํํ๋ (์ธ๋ถ ๋ฐ๋ณต) ํ์์์ ๋ฒ์ด๋, ์คํธ๋ฆผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก (๋ด๋ถ ๋ฐ๋ณต) ์งํํด๋ณด์.
// ์์ฐจ ์ฒ๋ฆฌ
import static java.util.stream.Collectors.toList;
List<Apple> heavyApples =
inventory.stream()
.filter((Apple a) -> a.getWeight() > 150)
.collect(toList());
// ๋ณ๋ ฌ ์ฒ๋ฆฌ
import static java.util.stream.Collectors.toList;
List<Apple> heavyApples =
inventory.parallelStream()
.filter((Apple a) -> a.getWeight() > 150)
.collect(toList());
์์ ๊ฐ์ด ์กฐ๊ฑด์ ์์ฑํ๊ณ , collect()๋ฅผ ํตํด์ ํด๋นํ๋ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ก ์ป์ด์ฌ ์ ์๋ค. ์ด์ , ๋ฆฌ์คํธ๋ฅผ ์ ์ธํ๊ณ add๋ฅผ ํตํด ์ง์ ์ด๊ณผํด์ฃผ์๋ ๊ณผ์ ์ด ์์ด์ ธ์ ํจ์ฌ ๊ฐ๊ฒฐํด์ก๋ค. ๋ํ, ์ปฌ๋ ์ ์์๋ ํฌ๊ธฐ๊ฐ ๋งค์ฐ ํฐ ๋ฆฌ์คํธ์ ๋ํด์ ๋จ์ํ for-each๋ฅผ ํตํด์ ์ฒ๋ฆฌํ๋ค๋ฉด ์๊ฐ์ด ๋ ๊ฑธ๋ฆด ํ ์ง๋ง, stream์ ๋ณ๋ ฌ์ฑ์ ์ฌ์ฉํ๋ฉด ๋ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
์ฌ๊ธฐ์, parallelStream์ ์ด๋ป๊ฒ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์งํํ ๊น? ์๋ฐ์์๋ ForkJoinPool ํ๋ ์์ํฌ๋ฅผ ํ์ฉํ์ฌ ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค.
ForkJoinPool์ ๋์ผํ ์์ ์ ์ฌ๋ฌ ๊ฐ์ ์๋ธ ํ์คํฌ๋ก ๋ถ๋ฆฌ(Fork)ํ์ฌ ์ฒ๋ฆฌํ๊ณ , ์ด๋ฅผ ์ต์ข ์ ์ผ๋ก ํฉ์ณ์(Join) ๊ฒฐ๊ณผ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค. ์คํธ๋ฆผ์์๋ ํ๋๋ ์๋ถ๋ถ์, ํ๋๋ ๋ท๋ถ๋ถ์ ์ฒ๋ฆฌํ๊ณ ๋ง์ง๋ง์ ๋ ๊ฐ๋ฅผ ํฉ์ณ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ณด๋ด๋ ํ์์ด๋ค. (๋ด๋ถ์ ์ผ๋ก Spliterator ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์ฌ ๋ถํ ์ ์งํํ๋ค)
๋ํ, ์คํธ๋ฆผ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๊ฐ๋ณ ๊ณต์ ๊ฐ์ฒด (=์ธ์คํด์ค ์์ฑ ์ดํ์, ๋ด๋ถ ์ํ๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ฒด. List, Map... etc)์ด๋๋ผ๋ ์๋ก ๋ ๋ฆฝ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ณ๋ ฌ์ฑ์ ์ฝ๊ฒ ๋๋ฆด ์ ์๋ค๋ ๊ฒ์ด ํฐ ์ฅ์ ์ด๋ค.
โ๏ธ ๋ํดํธ ๋ฉ์๋์ ์๋ฐ ๋ชจ๋
์ด์ ์๋ ์ธํฐํ์ด์ค(ex. List, Collection…)์ ๋ํด์ stream.filter๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ๋ฒ์ด ์ค๋ฅ๊ฐ ๋ฌ์๋ค. ๊ทธ๋ฌ๋, ์๋ฐ8์์๋ ๊ตฌํ ํด๋์ค์์ ๊ตฌํํ์ง ์์๋ ๋๋ ๋ฉ์๋๋ฅผ ์ธํฐํ์ด์ค์ ์ถ๊ฐํ ์ ์๋๋ก ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๋ง์ฝ, ๊ธฐ์กด์ Collection ์ธํฐํ์ด์ค์ stream()์ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด, ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ชจ๋ ๊ตฌํ์ฒด๋ค์ ๋ํด์ stream() ๋ฉ์๋๋ฅผ ๊ตฌํํ์ด์ผ ํ๋ค. ์ฆ, ๊ตฌํํ๋ ํด๋์ค๊ฐ ๋ง์์ง์๋ก ๋งค์ฐ๋งค์ฐ ๊ฐ๋ฐ์๋ ํ๋ค์ด์ก๋ ๊ฒ์ด๋ค ๐ฅน (๋ํ, 'OCP - ํ์ฅ์๋ ์ด๋ ค์์ง๋ง ๋ณ๊ฒฝ์๋ ๋ซํ์๋ ํํ'๋ฅผ ๋ง์กฑํ์ง ์๊ฒ ๋๋ค. ์ด๋ ํ์ฅ์ฑ์ด ๋งค์ฐ ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค.)
ํ์ง๋ง, ๋ํดํธ ๋ฉ์๋๊ฐ ๋์ค๋ฉด์ ์ธํฐํ์ด์ค์ ๋ณธ๋ฌธ(body)์ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋๋ก ์ถ๊ฐํ์์ผ๋ฉฐ, ๊ธฐ์กด์ ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ ์์ ๋กญ๊ฒ ์ค๊ณ๋ฅผ ํ์ฅํ ์ ์๋๋ก ๋ง๋ค์๋ค. ๋ํ, ๊ตฌํ ํด๋์ค์์ ์ํ๋ค๋ฉด ํด๋น ํด๋์ค๋ฅผ ๊ตฌํํ ์ ์๋๋ก ๋ง๋ค์ด์ ๋์ฑ ๋ ํ์ฅ์ฑ์๋ ์ค๊ณ๋ฅผ ๊ฐ๋ฅํ๋๋ก ๋ง๋ค์๋ค.
// List.java
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
์ ์ฝ๋๋ List<T> ์ธํฐํ์ด์ค์ default ๋ฉ์๋์ด๋ค. ์ด ๋๋ถ์ ์ฐ๋ฆฌ๋ ํํ ์ ๋ ฌ์ ์งํํ ๋ ๋ค์๊ณผ ๊ฐ์ด ์งํํ ์ ์๊ฒ ๋์๋ค.
List<Integer> list = new ArrayList<>();
list.sort(Integer::compareTo);
๋ํ, ArrayList ๋ด๋ถ๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ค๋ฒ๋ผ์ด๋ฉ์ ํตํด sort()๋ฅผ ์ฌ๊ตฌํํ ๊ฒ์ ๋ณผ ์ ์๋ค.
// ArrayList.java
@Override
@SuppressWarnings("unchecked")
public void sort(Comparator<? super E> c) {
final int expectedModCount = modCount;
Arrays.sort((E[]) elementData, 0, size, c);
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
modCount++;
}
๐ฌ ๊ทธ๋ ๋ค๋ฉด, ๋ง์ฝ ํ๋์ ํด๋์ค๊ฐ ์ฌ๋ฌ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์์, ํด๋น ์ธํฐํ์ด์ค์ ์๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ๋ ๋ค ๊ตฌํํ๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์ด๊ฒ ๊ณง ๋ค์ค ์์์ ํ์ฉํ๋ค๋ ๊ฒ์ด ์๋๊น?
// Grand.java
public interface Grand {
void hello();
}
// Mom.java
public interface Mom extends Grand{
@Override
default void hello() {
System.out.println("I'm your Mom.");
}
}
// Dad.java
public interface Dad extends Grand{
@Override
default void hello() {
System.out.println("I'm your Dad.");
}
}
๋ค์๊ณผ ๊ฐ์ ์ํฉ์ด ์์ ๋, Mom๊ณผ Dad ๋ชจ๋๋ฅผ ์์ํ๋ ํด๋์ค์ธ Child๊ฐ ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
class Child implements Mom, Dad{
}
๋ค์๊ณผ ๊ฐ์ด Mom๊ณผ Dad ๋ชจ๋์์ ๋ํดํธ ๋ฉ์๋๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์, ์ด๋ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ ์ง ์ ์๊ฐ ์์ด์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ , ์ด๋ฌํ ๋ฌธ์ ๋ฅผ '๋ค์ด์๋ชฌ๋ ์์ ๋ฌธ์ '๋ผ๊ณ ๋ถ๋ฅธ๋ค.
โ๏ธ Optional<T> ํด๋์ค
๋ง์ง๋ง์ผ๋ก, Optional์ ํตํด ๊ฐ์ ๊ฐ๊ฑฐ๋ ๊ฐ์ง์ง ์์ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ฉด NPE๋ฅผ ํผํ ์ ์์ผ๋ฉฐ, ๊ฐ์ด ์์ ๋ ์ด๋ค ์์ผ๋ก ์ฒ๋ฆฌํ ์ง ์ธ๋ถ์์ ๊ฒฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์กด์ฌํ๋ค.
์ฑํฐ 1์์๋ ์๋ฐ8๋ก ๋์ด์ค๋ฉด์ ๊ฐ๋ตํ๊ฒ ์ด๋ค ๊ธฐ๋ฅ๋ค์ด ์ถ๊ฐ๋์๋์ง ์์๋ดค๋ค.
์ถํ ์ฑํฐ๋ฅผ ์งํํ๋ฉด์ ํด๋น ๊ธฐ๋ฅ๋ค์ ๋ํด ๋ ์์ธํ๊ฒ ๊ณต๋ถํด๋ณด์ ๐
๐ก ์ ๋ฆฌ
- ์๋ฐ 8์์๋ ๋ฉ์๋๋ฅผ '์ผ๊ธ ๊ฐ์ฒด'์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ๋๋ค์ ์ต๋ช ํจ์๋ฅผ ํ์ฉํ์.
- ์คํธ๋ฆผ์ ํตํด์ ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์ค์ด๊ณ , ๋ณ๋ ฌ์ฑ์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
- ๋ํดํธ ๋ฉ์๋๋ฅผ ํตํด ์ธํฐํ์ด์ค์ ๋ํ ํ์ฅ์ ์ฝ๊ฒ ํ ์ ์๊ฒ ๋์๋ค.