DevLog ๐ถ
[๋ชจ๋์๋ฐ์ธ์ก์ ] ๋์ ํ๋ผ๋ฏธํฐํ : ๋์ ์์ฒด๋ฅผ ์ ๋ฌํด๋ณด์! ๋ณธ๋ฌธ
[๋ชจ๋์๋ฐ์ธ์ก์ ] ๋์ ํ๋ผ๋ฏธํฐํ : ๋์ ์์ฒด๋ฅผ ์ ๋ฌํด๋ณด์!
dolmeng2 2023. 2. 27. 01:13๐ฌ ๋ชจ๋ ์๋ฐ ์ธ ์ก์ ์ฑํฐ 2์ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
โ๏ธ ๋์ ํ๋ผ๋ฏธํฐํ
์ฌ๋์ ๋ง์์ ์ ๋ง ๊ฐ๋ ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ , ์๊ตฌ์ฌํญ์ ์๋น์์ ์ ์ฅ์์ ๋ ์๊ฐํ๊ฒ ๋๋ค. ์ฐ๋ฆฌ๋ ์ฝ๋๋ฅผ ์ง๋ ํ๋ก๊ทธ๋๋จธ์ง๋ง, ๊ฐ๋ ๊ฐ์ ์๋น์์ ๋ง์์ ๋ง์กฑ์ํค๊ธฐ ์ํด ์ต๋ํ ์ ๋์ ์ผ๋ก ๋์ํ ํ์๊ฐ ์๋ค.
์ด๋ ๋ , ํฌ๋น๊ฐ ์ฐํ ์ฝ ๊ณต์ง์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ ์๊ตฌ์ฌํญ์ ๋์ ธ์ฃผ์๋ค๊ณ ๊ฐ์ ํ์.
๐ฌ ๋ฐฑ์๋ ํฌ๋ฃจ ์ค์ 25์ด ์ดํ์ธ ํฌ๋ฃจ๋ง ๋ณด๊ณ ์ถ์๋ฐ, ๋ชจ์ฌ ์ฃผ์ธ์.
๊ทธ๋ฌ์ ๋ค์ค๊ฐ ์์ ๋งํ๋ค.
๐ฌ ์๋์์, ํ๋ก ํธ์๋ ํฌ๋ฃจ ์ค์์ 23์ด ์ด์์ธ ํฌ๋ฃจ๋ง ์์ฃผ์ธ์.
์ด๋ป๊ฒ ํ๋ฉด ์ฐ๋ฆฌ๋ ๋ณํํ๋ ์๊ตฌ์ฌํญ ์์์ ์ ๋์ ์ผ๋ก ๋์ํ ์ ์์๊น?
๊ฐ์ฅ ๋จผ์ , ๊ทธ๋ฅ ์๊ตฌ์ฌํญ์ ๋ง๋๋ก ๊ฐ๋ฅํ ๋ชจ๋ ์์ฑ์ ๋ํด์ ์ ๋ถ ์๋ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
1) ๋ฐฑ์๋ ํฌ๋ฃจ๋ฉด์ 25์ด ์ดํ์ธ ํฌ๋ฃจ ๋ชจ์ผ๊ธฐ
2) ํ๋ก ํธ์๋ ํฌ๋ฃจ๋ฉด์ 23์ด ์ดํ์ธ ํฌ๋ฃจ ๋ชจ์ผ๊ธฐ
3) ์๋๋ก์ด๋ ํฌ๋ฃจ๋ฉด์... (etc)
๋ฟ๋ฏํ ๋ง์์ผ๋ก ๋ชจ๋ ์กฐ๊ฑด์ ๋ํด์ ๋์์ ํ๋ค. ํ์ง๋ง, ์ด๋ ์ง๋๊ฐ๋ ๋ฆฌ์ฌ๊ฐ ์์ ๋ง์ ๊ฑด๋จ๋ค.
๐ฌ ์ด, ๋ด์ผ์ ๋ฐฑ์๋ ํฌ๋ฃจ ์ค์์ ์ด๋ฆ์ 'ใ '์ด ๋ค์ด๊ฐ๋ ํฌ๋ฃจ๋ค๋ง ๋ชจ์ฌ ์ฃผ์ธ์!
๊ฒฐ๊ตญ, ๋ด์ผ๋ ๋น์ทํ ๋ก์ง์ 100๊ฐ ์ฐ๋ฉด์ ์นผํด๋ฅผ ๋ชปํ๋ ์ํฉ์ด ๋ฐ์ํ๊ฒ ๋ ๊ฒ์ด๋ค ๐คฏ
๐ก ๋น์ทํ ์ฝ๋๊ฐ ๋ฐ๋ณตํด์ ์กด์ฌํ๋ค๋ฉด, ํด๋น ์ฝ๋๋ฅผ ์ถ์ํํ์.
ํ์ฌ์ ์๊ตฌ์ฌํญ์ ์๊ฐํด๋ณด์. ์ฐ์ , ์ฐ๋ฆฌ์ ๋์ฅ ํฌ๋น์ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ์๊ฐํ ์ ์๋ค.
1) ๋ฐฑ์๋ ํฌ๋ฃจ๋ผ๋ฉด ํต๊ณผ, ์๋๋ผ๋ฉด ๋ก!
2) 25์ด ์ดํ์ธ ํฌ๋ฃจ๋ผ๋ฉด ํต๊ณผ, ์๋๋ผ๋ฉด ๋ก!
์ฐ๋ฆฌ๋ ์ ๋ฌธ์ฅ์ ๋ณด๊ณ ๋ฌด์ธ๊ฐ ์ค๋ณต๋๋ ๊ฑธ ์ฐพ์ ์ ์๋ค. '~๋ผ๋ฉด ํต๊ณผ, ~๊ฐ ์๋๋ผ๋ฉด ๋ก!' ์ฆ, ๋ ์กฐ๊ฑด ๋ชจ๋ ์ฐธ๊ณผ ๊ฑฐ์ง์ ๋ํด์ ๋ฐํ์ ํ๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์ฐธ๊ณผ ๊ฑฐ์ง์ด๋ผ๊ณ ํ๋ฉด ๋ฌด์ธ๊ฐ๊ฐ ์๊ฐ๋๋ค. ๋ฐ๋ก, boolean ๊ฐ์ด๋ค. ๊ทธ๋ฆฌ๊ณ , ์๋ฐ์์๋ ์ฐธ/๊ฑฐ์ง์ ๋์ํ๊ธฐ ์ํด, ๊ฝค๋ ๋ฉ์ง ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
๋ฌผ๋ก , ์ด ์น๊ตฌ์ ๋ํด ์ง๊ธ์ ๋ชฐ๋ผ๋ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด ์น๊ตฌ๋ฅผ ๋ชจ๋ฐฉํด์ 'CrewPredicate'๋ผ๋ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ๊ฒ์ด๋ค. ์ฐ๋ฆฌ๋ ํ์ฌ 'ํฌ๋ฃจ'์ ๋ํด์ '๋ฌด์จ๋ฌด์จ ์กฐ๊ฑด์ผ๋ก ํํฐ๋ง!'์ ํ๊ณ ์ถ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ํฌ๋ฃจ๋ฅผ ์ธ์๋ก ๋ฐ์์ ํํฐ๋ง ์กฐ๊ฑด์ ๋ด๋ถ ๊ตฌํ์ฒด์๊ฒ ๋งก๊ธฐ๋ ๋ฐฉํฅ์ผ๋ก ์ค๊ณ๋ฅผ ์งํํ ๊ฒ์ด๋ค. ๊ทธ๋ผ, ๋ค์๊ณผ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ ์ ์๋ค.
public interface CrewPredicate {
boolean test (Crew crew);
}
์ด ์น๊ตฌ๋ ์ด์ , ์ธ์๋ก ๋ค์ด์จ Crew์ ๋ํด์ ํ๋จํ๊ณ , ๊ตฌํ ํด๋์ค๋ฅผ ํตํด์ ์ ํ ์กฐ๊ฑด์ ๋ํด ๊ตฌ์ฒดํ๋ฅผ ์งํํ ๊ฒ์ด๋ค. ์ฐ๋ฆฌ์ ํ์ฌ ์กฐ๊ฑด์ธ '๋ฐฑ์๋ ํฌ๋ฃจ'์ '25์ด ์ดํ์ธ ํฌ๋ฃจ'๋ฅผ ๋ฝ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๊ตฌํ ํด๋์ค๋ฅผ ์์ฑํ ์ ์๋ค.
// ๋ฐฑ์๋ ํฌ๋ฃจ๋ฅผ ๋ฝ๋ ํด๋์ค.
public class BackendCrewPredicate implements CrewPredicate {
public boolean test(Crew crew) {
return crew.getCourse.equals(BACKEND);
}
}
// 25์ด ์ดํ์ธ ํฌ๋ฃจ๋ฅผ ๋ฝ๋ ํด๋์ค.
public class AgeCrewPredicate implements CrewPredicate {
public boolean test(Crew crew) {
return crew.getAge() <= 25;
}
}
์ ์ํฉ์ ๋ง์ถฐ์ ๋ค์ํ ๋์์ ์คํํ๊ณ ์๋ค. "์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋์์ ์คํํด?" -> ๋ง๋ค, ์ ๋ต ํจํด์ด๋ค. ์ธํฐํ์ด์ค๋ฅผ ํตํด์ ์ฐ๋ฆฌ๋ '์กฐ๊ฑด์ ๋ชจ๋ฅด๊ฒ ๊ณ , ๊ทธ๋ฅ ๋ง๋์ง ์๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์ค ๊ฑฐ์ผ!'๋ผ๋ ๊ฒ๋ง ์ ์ธํด๋๊ณ , ๋ด๋ถ์ ์ธ ๋ก์ง์ ๊ตฌํ์ฒด์๊ฒ ์์ํ์ฌ ์ํฉ์ ๋ฐ๋ผ ๋ฐฑ์๋ ํฌ๋ฃจ๋ ๋ฝ๊ณ , 25์ด ์ดํ์ธ ํฌ๋ฃจ๋ ๋ฝ์ ์ ์๋๋ก '๊ฐ์๋ผ์ฐ๋' ๋ก์ง์ ๋ง๋ค์ด๋ธ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์กฐ๊ธ ๋ ๋ฉ์ง ๋ง๋ก ํํํ ์ ์๋ค.
๐ก ๊ฐ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ '์บก์ํ'ํ๋ ์๊ณ ๋ฆฌ์ฆ ํจ๋ฐ๋ฆฌ๋ฅผ ์ ์ํ๊ณ , ๋ฐํ์์ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ๊ฒ ๋ง๋ค์.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์บก์ํ๋ฅผ ์งํํ์ผ๋ฉฐ, CrewPredicate๊ฐ ์ผ์ข ์ ์๊ณ ๋ฆฌ์ฆ ํจ๋ฐ๋ฆฌ๋ค. ๊ทธ๋ฆฌ๊ณ BackendCrewPredicate / AgeCrewPredicate๊ฐ ์ผ์ข ์ ์ ๋ต์ด ๋๋ค.
์ฐ๋ฆฌ๋ ์ด์ , ์ด๋ฌํ ์ ๋ต์ ๋์ ์ผ๋ก ๋ฐ์์ ์คํํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
// ์ธ์๋ก ๋ค์ด์จ predicate์ ๊ตฌ์ฒด ํด๋์ค์ ๋ํด์ ํํฐ ์กฐ๊ฑด์ ๋ณ๊ฒฝํ ์ ์๋ค.
public List<Crew> filterCrews(List<Crew> crews, CrewPredicate p) {
List<Crew> resultCrews = new ArrayList<>();
for (Crew crew : crews) {
if (p.test(crew) {
resultCrews.add(crew);
}
}
}
์ฐ๋ฆฌ๋ ์ด์ , '๋ฐฑ์๋ ํฌ๋ฃจ๋ฅผ ๋ฝ๋ ๊ฒ', '25์ด ์ดํ์ธ ํฌ๋ฃจ๋ฅผ ๋ฝ๋ ๊ฒ' ๊ฐ์ ์ด๋ ํ '๋์' ์์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํด์ค ์ ์๊ฒ ๋์๋ค. ์ด๋, ํ๋ผ๋ฏธํฐ๋ก ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๊ฐ ์์ ๋กญ๊ฒ ๋ค์ด์์ ์ ๋ต์ ์ ํํ ์ ์๋๋ก ๋ง๋ ๊ฒ์ด๋ค.
ํ์ง๋ง, ์ ์ฝ๋๋ ๋ฌด์ธ๊ฐ ๋ถํธํ๋ค. ์ฐ๋ฆฌ๋ ์ง๊ธ ํฌ๋น์ ์๊ตฌ์ฌํญ๋ง ๋ง์กฑํ๋ ๊ตฌํ ํด๋์ค๋ฅผ ๋ง๋ค์์ ๋ฟ์ด๋ค. ๋ค์ค์ ์๊ตฌ์ฌํญ์ธ 'ํ๋ก ํธ์๋ ํฌ๋ฃจ'๋ '23์ด ์ด์์ ํฌ๋ฃจ', '์ด๋ฆ์ ใ ์ด ๋ค์ด๊ฐ๋ ํฌ๋ฃจ' ๋ฑ, ์๊ตฌ์ฌํญ์ด ๋ง์์ง๋ค๋ฉด ํด๋น ์๊ตฌ์ฌํญ ๊ฐ๊ฐ์ ๋ง๋ ๊ตฌํ ํด๋์ค๋ฅผ ๋ ๋ง๋ค์ด์ค์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ๊ท์ฐฎ์์ด ๋ง์ ๊ฐ๋ฐ์๋ ์ด๋ฅผ ์ฐธ์ ์ ์๋ค.
โ๏ธ ๋ฆฌํฉํฐ๋ง ์งํํ๊ธฐ - ์ต๋ช ํด๋์ค!
์ด๋ป๊ฒ ํ๋ฉด ์ด๋ฅผ ๊ฐ์ ํ ์ ์์๊น? ๊ตฌํ ํด๋์ค๋ฅผ ๋ง๋ค์ง ์๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์์๊น? ๋ฐ๋ก, ํด๋์ค์ ์ ์ธ๊ณผ ์ธ์คํด์คํ๋ฅผ ๋์์ ์งํํ ์ ์๋ '์ต๋ช ํด๋์ค'๋ฅผ ํ์ฉํ๋ ๊ฒ์ด๋ค. ์ต๋ช ํด๋์ค๋ ์ด๋ฆ์ด ์๋ ํด๋์ค์ด๋ค. ํด๋์ค๋ช ์ ๋ํ ๋ค์ด๋ฐ์ ๋ํด ๊ณ ๋ฏผํ ํ์๋ ์์ผ๋ฉฐ, ๋ค์ด๋ฐ์ด ์๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์์ ํธ์ถํ ์ ์์ด ๋ฑ 1๋ฒ๋ง ์ฌ์ฉํ๊ฒ ๋๋ค.
// ๋ฆฌํฉํฐ๋ง ์ด์ ์ ์ฝ๋, ๊ธฐ์กด์๋ ์ด๋ฐ ์์ผ๋ก ํด๋์ค๋ฅผ ์ ์ธํด์ฃผ์๋ค.
List<Crew> backendCrews = filterCrews(crews, new BackendCrewPredicate());
List<Crew> ageCrews = filterCrews(crews, new AgeCrewPredicate());
// ์ต๋ช
ํด๋์ค๋ฅผ ํ์ฉํด๋ณด์!
// CrewPredicate๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
List<Crew> backendCrews = filterCrews(crews, new CrewPredicate() {
@Override
public boolean test(Crew crew) {
return crew.getCourse.equals(BACKEND);
}
});
List<Crew> ageCrews = filterCrews(crews, new CrewPredicate() {
@Override
public boolean test(Crew crew) {
return crew.getAge() <= 25;
}
});
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด, CrewPredicate ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ๋ฐ๋ก ์ธ์ ๋ด์์ ๊ตฌํํ ๊ฒ์ ๋ณผ ์ ์๋ค. ๊ทธ๋ฌ๋, ์ ์ฝ๋ ์ญ์ ์ฌ์ ํ ๋ถํธํ๋ค. ์ฐ๋ฆฌ๊ฐ ํ์ํ ๊ฑด ๋ด๋ถ์ ํํฐ๋ง ์กฐ๊ฑด์ด์ง๋ง, public boolean test() {...} ๊ฐ์ด ๋ฉ์๋ ์ ์ธ์ ์ํ ์ฝ๋๊ฐ ๊ณ์ํด์ ๋ฐ๋ผ ๋ถ๋๋ค๋ ๊ฒ์ด๋ค. ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ฉด ๊ฐ๋ฐ์๋ ์ฝ๊ณ ์ถ์ง๊ฐ ์์์ง๋ค. ๋ํ, ์์ ๋งํ ๊ฒ์ฒ๋ผ ์ฌ์ฌ์ฉ๋ ๋์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
โ๏ธ ๋ฆฌํฉํฐ๋ง ์งํํ๊ธฐ - ๋๋ค
์ด๋ป๊ฒ ํ๋ฉด ๋ ์งง๊ฒ ์ค์ผ ์ ์์๊น? ์ฐ๋ฆฌ๋, ๋ค๋ฅธ ๊ฑด ๋ค ํ์์๊ณ ์ค์ง ์กฐ๊ฑด์ ๋ํ '๋์'๋ง ํ์ํ๋ค. test ๋ฉ์๋์ ๋ํ ๊ฑด ๋ณ๋ก ์๊ณ ์ถ์ง ์๊ณ , ๊ทธ๋ฅ 'crew.getAge() <= 25'๋ผ๋ ํํฐ๋ง ํ์๋ง ํ์ํ ๊ฒ์ด๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด '๋๋ค ํํ์'์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉํ ์ ์๋ค.
// ๋๋ค ์ฌ์ฉํ๊ธฐ
List<Crew> backendCrews = filterCrews(crews, (Crew crew) ->
crew.getCourse.equals(BACKEND)
);
List<Crew> ageCrews = filterCrews(crews, (Crew crew) ->
crew.getAge() <= 25
);
๋๋๊ฒ๋, ๋ถํ์ํ ์ฝ๋๊ฐ ์ ๊ฑฐ๋๊ณ ๋๋ ํฌ๋ฃจ์ ๋ํ ์กฐ๊ฑด์ด ๋ ๋ช ํํ๊ฒ ๋ณด์ด๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฐ๋ฆฌ๋ ํ์ฌ '๋์' ์ ๋ํด์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ค ๊ฒ์ด๋ค! ์ฐ๋ฆฌ๋ ์ด๋ฌํ '๋์ ํ๋ผ๋ฏธํฐํ'๋ฅผ ํตํด ์ ์ฐ์ฑ์ ๋์ด๊ณ , ๋๋ค๋ฅผ ํตํด์ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๋ ๋ฉ์ง ๊ฐ๋ฐ์๊ฐ ๋ ๊ฒ์ด๋ค.
โ๏ธ ์ ๋ค๋ฆญ ํ์ฉํ๊ธฐ
์ฐ๋ฆฌ๋ ์ด์ ๋์์ ๋ํ ๊ณ ๋ฏผ์ ๋๋ฌ๋ค. ํ์ง๋ง, ๋ง์ฝ ํฌ๋ฃจ๊ฐ ์๋ ์ฝ์น์ ๋ํ ์ ๋ณด๋ฅผ ํํฐ๋งํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํ๋ฉด ์ข์๊น? ๋์์ ๋์์ ๋ํด์๋ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ์์ ์ฒ๋ฆฌํ๋๋ก ๋ง๋ค๋ฉด ์ด๋จ๊น?๐ค ๊ธฐ์กด์ ๋ง๋ CrewPredicate๋ ํฌ๋ฃจ์ ๋ํ ์กฐ๊ฑด ํ๋จ์ ํด์ฃผ๋ ํจ์ํ ์ธํฐํ์ด์ค์๊ธฐ ๋๋ฌธ์, ์๋ฐ์์ ์ ๊ณตํด์ฃผ๋ Predicate<T>๋ฅผ ์ด์ฉํด๋ณด์. ๋ํ, ์ ๋ค๋ฆญ์ ํ์ฉํ์ฌ ํฌ๋ฃจ๋ , ์ฝ์น๋ ๋์์ ์ ๊ฒฝ์ฐ์ง ์๊ณ ์กฐ๊ฑด ํํฐ๋ง์ ํ ์ ์๋๋ก ํด๋ณด์!
public interface Predicate<T> {
boolean test(T t);
}
public static <T> List<T> filter(List<T> list, Predicate<T> p) {
List<T> result = new ArrayList<>();
for(T e: list) {
if(p.test(e)) {
result.add(e);
}
}
return result;
}
์ด๋ ๊ฒ ์ ๋ค๋ฆญ์ ํ์ฉํ์ฌ ์ถ์ํ๋ฅผ ํ๊ฒ ๋๋ฉด ํฌ๋ฃจ๋ฟ๋ง ์๋๋ผ ์ฝ์น, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๊ฒ๋ค์ ๋ํด์๋ ํํฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค. ์ฐ๋ฆฌ๋ ์ด์ ํ์ฅ์ฑ๊น์ง ๊ฐ์ถ๊ฒ ๋ ๊ฒ์ด๋ค ๐
๐ก ๋ฉ์๋ ์ฐธ์กฐ vs ๋๋ค์
ํํ ๋ฉ์๋ ์ฐธ์กฐ์ ๋๋ค์์ ๋ง์ด ๋น๊ตํ์ฌ ์ฌ์ฉํ๋ค. ์ง๋ ์ฑํฐ1์์๋ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ๋ค๋ฃจ์๋๋ฐ, ์ฐ๋ฆฌ๋ ๋๋ค์์์ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ํ์ฉํ๋ฉด ๋ ์งง๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ์ ์ฝ๋์์ ๋๋ค์์ ํ์ฉํ์ฌ ํธ์ถํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
public static void main(String[] args) {
List<Crew> crews = new ArrayList<>();
filter(crews, (Crew crew) -> crew.getAge() <= 25);
}
...
ํ์ง๋ง, ๋ง์ฝ ๋์ด์ ๋ํ ์กฐ๊ฑด์ ์ฌ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ๊ทธ๋ฆฌ๊ณ '๋ฉ์๋๋ช ์ ํตํด์ ๋ช ํํ๊ฒ ํด๋น ์กฐ๊ฑด์ ๋ํ๋ด๊ณ ์ถ๋ค๋ฉด' ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ํ๋์ ๋ฐฉ๋ฒ์ด๋ค. (ํน์, ๋๋ค ๋ด๋ถ์ ๊ตฌํ์์ด ๋๋ฌด ๊ธธ์ด๋ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ํ๋์ ๋ฐฉ๋ฒ์ด ๋๋ค.) ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์๋ค. ๋ฉ์๋ ์ฐธ์กฐ์ ๋ํ ์ค๋ช ์ ์ฑํฐ 3์์ ์กฐ๊ธ ๋ ์์ธํ ์ค๋ช ํ ์์ ์ด๋ค ๐คญ
public void main(String[] args) {
List<Crew> crews = new ArrayList<>();
filter(crews, this::isCrewAgeUnder);
}
private boolean isCrewAgeUnder(final Crew crew) {
return crew.getAge() <= 25;
}
...
์์ ๊ฐ์ด ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ํ์ฉํ์ฌ ์ฌ๋ฌ ๋ฒ ์ฌ์ฌ์ฉํ ์๋ ์๋ค. (๋ฉ์๋ ์ฐธ์กฐ์ ์์ ๋ฅผ ๋ง์ถ๋ ค๊ณ ํ๋ค ๋ณด๋ ์ข ์ด์ํด์ง ๊ฐ์ด ์์ง๋ง... ์ ๋ฐ ๋๋์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.) ์๋๋ฉด, ์กฐ๊ธ ๋ ๊ฐ์ฒด์งํฅ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ด ๋ฐฉ๋ฒ์ด ๋ ๋์ ๊ฒ ๊ฐ๋ค.
public class Crew {
private final String name;
private final String nickname;
private final int age;
private final Course course;
...
public boolean isCrewAgeUnder(final int age) {
return this.age <= age;
}
}
public void main(String[] args) {
List<Crew> crews = new ArrayList<>();
filter(crews, crew -> crew.isCrewAgeUnder(25));
}
...
์ฝ๋์ ์ ๋ต์ ์๊ธฐ ๋๋ฌธ์, ๊ทธ๋๊ทธ๋ ์ํฉ์ ๋ฐ๋ผ์ ์ฐ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค!
โ๏ธ Comparator๋ก ์ ๋ ฌํ๊ธฐ
๊ทธ ์ธ์๋, ๋ค์ํ ํ์ฉ ์์ ๋ค์ด ์๋ค. ๋ํ์ ์ผ๋ก Comparator์ Runnable์ ๋ํด์ ๊ฐ๋ตํ๊ฒ๋ง ์ดํด๋ณด์. ์๋ฐ 8์์ List์๋ sort ๋ฉ์๋๊ฐ ํฌํจ๋์ด ์๋ค. (์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋์ธ sort๊ฐ ๊ตฌํ๋์ด ์๋ ํํ์ด๋ค) ์ด๋, Comparator ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ฉด sort์ ๋์์ ๋ค์ํํ ์ ์๊ฒ ๋๋ค.
// 1๋จ๊ณ - Comparator์ ๊ตฌํ์ฒด ์์ฑํ๊ธฐ
crews.sort(new Comparator<Crew>() {
@Override
public int compare(Crew o1, Crew o2) {
return Integer.compare(o1.getAge(), o2.getAge());
}
});
// 2๋จ๊ณ - ๋๋ค๋ฅผ ํ์ฉํ์ฌ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค๊ธฐ
crews.sort((o1, o2) -> Integer.compare(o1.getAge(), o2.getAge()));
// 3๋จ๊ณ - ์ดํ ์ฑํฐ์์ ๋์ฌ ๋ด์ฉ. ์ผ๋จ์ ๋ ๊ฐ๊ฒฐํ๊ฒ ์ค์ผ ์ ์๋ค๋ ๊ฒ ์ ๋๋ง ์์๋์.
crews.sort(Comparator.comparingInt(Crew::getAge));
โ๏ธ Runnable๋ก ์ฝ๋ ๋ธ๋ก ์คํํ๊ธฐ
์๋ฐ์ ์ค๋ ๋๋ฅผ ํ์ฉํ๋ฉด, ๋ณ๋ ฌ๋ก ์ฝ๋ ๋ธ๋ก์ ์คํํ ์ ์๋ค. ์ด๋, Runnable ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์ฌ ์คํํ ์ฝ๋ ๋ธ๋ก์ ์ง์ ํ ์ ์๋ค. Runnable ์ญ์, run()์ด๋ผ๋ ์ถ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ํจ์ํ ์ธํฐํ์ด์ค์ด๋ค.
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
๊ทธ๋ฆฌ๊ณ , ์ด๋ฌํ Runnable์ ํ์ฉํ์ฌ ๋ค์ํ ๋์์ ์ค๋ ๋๋ก ์คํํ ์ ์๋ค. ํนํ, ์๋ฐ 8์์๋ ๋๋ค ํํ์์ ํ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฐ๋จํ๊ฒ ํํํ์ฌ ์ค๋ ๋์๊ฒ ๋์์ ๊ฑด๋ค์ค ์ ์๊ฒ ๋๋ค.
Thread t = new Thread(() -> System.out.println("Hello world"));
๐ฌ ์ ๋ฆฌ
1) ๋์ ํ๋ผ๋ฏธํฐํ๋ฅผ ํตํด ๋ด๋ถ์ ์ผ๋ก ๋ค์ํ ๋์์ ์งํํ ์ ์๋๋ก, ์ฝ๋๋ฅผ ๋ฉ์๋์ ์ธ์๋ก ์ ๋ฌํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๊ตฌ์ฌํญ์ ๋ ์ ์ฐํ๊ฒ ๋์ํ ์ ์๋ค.
2) ์ต๋ช ํด๋์ค ๋ฐ ๋๋ค๋ฅผ ํ์ฉํ์ฌ ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํ ์ ์๋ค.
์ฑํฐ 2์์๋ ๋์ ํ๋ผ๋ฏธํฐํ์ ๋ํด์ ๋ ์์ธํ ์์๋ณด์๋ค.
์ฑํฐ 3์์๋ ๋๋ค ํํ์์ ๋ํด์ ์์๋ณด๋๋ก ํ์ ๐ช ์๋ง ๋ด์ฉ์ด ๊ธธ์ด์ ๋ ๊ฐ๋ก ๋๋ ์ ์ธ ๊ฒ ๊ฐ๋ค.