프로그래밍/Java

Java 8 시작 하기

seungdols 2016. 6. 10. 23:33
Edit

Java 8 시작하기

언어:JAVA 티스토리

도대체 왜 함수형인가?

사실 필자도 함수형을 잘 모른다. 왜냐? Java8도 아직 잘 모른다.

내가 경헌한 건 JavaScript, Python, Ruby 정도에서 First Class Function이 유사하게 가능하다는 느낌정도?

물론, JavaScript는 충분히 느낄수 있는 일급 객체를 지원한다.

요즘 대세인 Scala, Closure등 여러가지 함수형 언어가 실무에서도 쓰이고 있는 실정이다.

자, 그럼 자바에서 도대체 뭐가 바뀐 건지 천천히 따라가보자.

첫 째는 람다의 등장이다. 많은 언어에서 람다를 이미 지원 해주었다. ( ㅠㅠ 자바는 업데이트가 최소 8년은 늦었다…)

C#에 이미 많은 부분에서 지고 있는 실정…

사례로 한 번 알아보자 - 람다의 필요성

1.   public static List<Apple> filterGreenApples(List<Apple> Inventory){
2. List<Apple> result = new ArrayList<>();
3. for( Apple apple : Inventory){
4. if("green".equals(apple.getColor()))
5. result.add(apple);
6. }
7. return result;
8. }
9. public static List<Apple> filterWeightApples(List<Apple> Inventory){
10. List<Apple> result = new ArrayList<>();
11. for( Apple apple : Inventory){
12. if(apple.getWeight() > 150)
13. result.add(apple);
14. }
15. return result;
16. }

두 메소드는 리스트에서 특정 목적을 취하여 해당하는 객체만 새로운 공간에 넣어서 반환하는 메소드이다.

자, 여기서 문제 개발이란게 요구사항이 절대 변하지 않을까?

분명 그럴리 없을 것이다.

고로, 유연한 확장이 가능해야 한다는 말씀이다.

그래서 중복되는 것들을 모아 추상화 시키고, 캡슐화를 시켜보자.

1.public interface ApplePredicate {
2. boolean test(Apple apple);
3.}

먼저 인터페이스를 하나 만들어 보자.

1.class AppleWeightPredicate implements ApplePredicate{
2. @Override
3. public boolean test(Apple apple) {
4. return apple.getWeight() > 150;
5. }
6.}
7.class AppleColorPredicate implements ApplePredicate{
8. @Override
9. public boolean test(Apple apple) {
10. return "green".equals(apple.getColor());
11. }
12.}

즉, 위에 있는 두 메소드를 클래스화 시켜서 캡슐화를 하였다.

고로 여기서 다형성 개념을 적용시킬 수 있다.( 상속만 가능한 개념이 아닌 인터페이스 구현체들간의 관계로도 다형성을 적용시킬 수 있다.)

1.public static List<Apple> filterPredicateApples(List<Apple> Inventory, ApplePredicate p){
2. List<Apple> result = new ArrayList<>();
3. for( Apple apple : Inventory){
4. if(p.test(apple))
5. result.add(apple);
6. }
7. return result;
8.}

자, 그럼 메소드 호출이 어떻게 되었을까?

1.        List<Apple> list = Arrays.asList(
2. new Apple(150, "green"),
3. new Apple(170, "red"),
4. new Apple(50, "green"),
5. new Apple(160, "blue")
6. );
7. List<Apple> results1 = filterGreenApples(list);
8. System.out.println(results1);
9. List<Apple> results2 = filterWeightApples(list);
10. System.out.println(results2);
11. List<Apple> results3 = filterPredicateApples(list, new AppleWeightPredicate());
12. System.out.println(results3);

여기서 보면, 7 , 9 과 11번 라인의 차이 보이시나요?
결국 메소드 콜에서부터 차이가 발생한다.

일단, 여기까지 쭉 코드를 보면서 이해해보도록 하자.


이제는 중간 변환 작업을 건너 띄고, 람다로 바로 바꿔 볼 계획이다. 왜냐 ? 불필요한 코드를 배울 필요 없기 때문이다.

사실 익명 클래스로 직접 파라미터화를 통해 코드를 구현 할 수도 있으나, 지저분해지고 익명 클래스에 익숙한 사람이 드물다.

드디어 람다 !

%23%20Java%208%20%uC2DC%uC791%uD558%uAE30%0A%0A@%28%uC5B8%uC5B4%3AJAVA%29%5B%uD2F0%uC2A4%uD1A0%uB9AC%5D%0A%0A%23%23%23%20%uB3C4%uB300%uCCB4%20%uC65C%20%uD568%uC218%uD615%uC778%uAC00%3F%0A%0A%uC0AC%uC2E4%20%uD544%uC790%uB3C4%20%uD568%uC218%uD615%uC744%20%uC798%20%uBAA8%uB978%uB2E4.%20%uC65C%uB0D0%3F%20Java8%uB3C4%20%uC544%uC9C1%20%uC798%20%uBAA8%uB978%uB2E4.%20%0A%0A%uB0B4%uAC00%20%uACBD%uD5CC%uD55C%20%uAC74%20JavaScript%2C%20Python%2C%20Ruby%20%uC815%uB3C4%uC5D0%uC11C%20First%20Class%20Function%uC774%20%uC720%uC0AC%uD558%uAC8C%20%uAC00%uB2A5%uD558%uB2E4%uB294%20%uB290%uB08C%uC815%uB3C4%3F%20%0A%0A%uBB3C%uB860%2C%20JavaScript%uB294%20%uCDA9%uBD84%uD788%20%uB290%uB084%uC218%20%uC788%uB294%20%uC77C%uAE09%20%uAC1D%uCCB4%uB97C%20%uC9C0%uC6D0%uD55C%uB2E4.%20%0A%0A%uC694%uC998%20%uB300%uC138%uC778%20Scala%2C%20Closure%uB4F1%20%uC5EC%uB7EC%uAC00%uC9C0%20%uD568%uC218%uD615%20%uC5B8%uC5B4%uAC00%20%uC2E4%uBB34%uC5D0%uC11C%uB3C4%20%uC4F0%uC774%uACE0%20%uC788%uB294%20%uC2E4%uC815%uC774%uB2E4.%20%0A%0A%uC790%2C%20%uADF8%uB7FC%20%uC790%uBC14%uC5D0%uC11C%20%uB3C4%uB300%uCCB4%20%uBB50%uAC00%20%uBC14%uB010%20%uAC74%uC9C0%20%uCC9C%uCC9C%uD788%20%uB530%uB77C%uAC00%uBCF4%uC790.%20%0A%0A%uCCAB%20%uC9F8%uB294%20%uB78C%uB2E4%uC758%20%uB4F1%uC7A5%uC774%uB2E4.%20%20%uB9CE%uC740%20%uC5B8%uC5B4%uC5D0%uC11C%20%uB78C%uB2E4%uB97C%20%uC774%uBBF8%20%uC9C0%uC6D0%20%uD574%uC8FC%uC5C8%uB2E4.%20%20%28%20%u3160%u3160%20%uC790%uBC14%uB294%20%uC5C5%uB370%uC774%uD2B8%uAC00%20%uCD5C%uC18C%208%uB144%uC740%20%uB2A6%uC5C8%uB2E4...%29%0A%0AC%23%uC5D0%20%uC774%uBBF8%20%uB9CE%uC740%20%uBD80%uBD84%uC5D0%uC11C%20%uC9C0%uACE0%20%uC788%uB294%20%uC2E4%uC815...%0A%0A%23%23%23%20%uC0AC%uB840%uB85C%20%uD55C%20%uBC88%20%uC54C%uC544%uBCF4%uC790%20-%20%uB78C%uB2E4%uC758%20%uD544%uC694%uC131%0A%0A%0A%60%60%60java%0A%20%20%20public%20static%20List%3CApple%3E%20filterGreenApples%28List%3CApple%3E%20Inventory%29%7B%0A%20%20%20%20%20%20%20%20List%3CApple%3E%20result%20%3D%20new%20ArrayList%3C%3E%28%29%3B%0A%20%20%20%20%20%20%20%20for%28%20Apple%20apple%20%3A%20Inventory%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%28%22green%22.equals%28apple.getColor%28%29%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result.add%28apple%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20result%3B%0A%20%20%20%20%7D%0A%20%20%20%20public%20static%20List%3CApple%3E%20filterWeightApples%28List%3CApple%3E%20Inventory%29%7B%0A%20%20%20%20%20%20%20%20List%3CApple%3E%20result%20%3D%20new%20ArrayList%3C%3E%28%29%3B%0A%20%20%20%20%20%20%20%20for%28%20Apple%20apple%20%3A%20Inventory%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%28apple.getWeight%28%29%20%3E%20150%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result.add%28apple%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20result%3B%0A%20%20%20%20%7D%0A%60%60%60%0A%0A%uB450%20%uBA54%uC18C%uB4DC%uB294%20%uB9AC%uC2A4%uD2B8%uC5D0%uC11C%20%uD2B9%uC815%20%uBAA9%uC801%uC744%20%uCDE8%uD558%uC5EC%20%uD574%uB2F9%uD558%uB294%20%uAC1D%uCCB4%uB9CC%20%uC0C8%uB85C%uC6B4%20%uACF5%uAC04%uC5D0%20%uB123%uC5B4%uC11C%20%uBC18%uD658%uD558%uB294%20%uBA54%uC18C%uB4DC%uC774%uB2E4.%20%0A%0A_%uC790%2C%20%uC5EC%uAE30%uC11C%20%uBB38%uC81C%20%uAC1C%uBC1C%uC774%uB780%uAC8C%20%uC694%uAD6C%uC0AC%uD56D%uC774%20%uC808%uB300%20%uBCC0%uD558%uC9C0%20%uC54A%uC744%uAE4C%3F_%0A%0A%uBD84%uBA85%20%uADF8%uB7F4%uB9AC%20%uC5C6%uC744%20%uAC83%uC774%uB2E4.%20%0A%0A%uACE0%uB85C%2C%20%uC720%uC5F0%uD55C%20%uD655%uC7A5%uC774%20%uAC00%uB2A5%uD574%uC57C%20%uD55C%uB2E4%uB294%20%uB9D0%uC500%uC774%uB2E4.%20%0A%0A%uADF8%uB798%uC11C%20%uC911%uBCF5%uB418%uB294%20%uAC83%uB4E4%uC744%20%uBAA8%uC544%20%uCD94%uC0C1%uD654%20%uC2DC%uD0A4%uACE0%2C%20%uCEA1%uC290%uD654%uB97C%20%uC2DC%uCF1C%uBCF4%uC790.%20%0A%0A%60%60%60java%0Apublic%20interface%20ApplePredicate%20%7B%0A%20%20%20%20boolean%20test%28Apple%20apple%29%3B%0A%7D%0A%60%60%60%0A%uBA3C%uC800%20%uC778%uD130%uD398%uC774%uC2A4%uB97C%20%uD558%uB098%20%uB9CC%uB4E4%uC5B4%20%uBCF4%uC790.%20%0A%0A%0A%60%60%60java%0Aclass%20AppleWeightPredicate%20implements%20ApplePredicate%7B%0A%20%20%20%20@Override%0A%20%20%20%20public%20boolean%20test%28Apple%20apple%29%20%7B%0A%20%20%20%20%20%20%20%20return%20apple.getWeight%28%29%20%3E%20150%3B%0A%20%20%20%20%7D%0A%7D%0Aclass%20AppleColorPredicate%20implements%20ApplePredicate%7B%0A%20%20%20%20@Override%0A%20%20%20%20public%20boolean%20test%28Apple%20apple%29%20%7B%0A%20%20%20%20%20%20%20%20return%20%22green%22.equals%28apple.getColor%28%29%29%3B%0A%20%20%20%20%7D%0A%7D%0A%60%60%60%0A%uC989%2C%20%uC704%uC5D0%20%uC788%uB294%20%uB450%20%uBA54%uC18C%uB4DC%uB97C%20%uD074%uB798%uC2A4%uD654%20%uC2DC%uCF1C%uC11C%20%uCEA1%uC290%uD654%uB97C%20%uD558%uC600%uB2E4.%20%0A%0A%uACE0%uB85C%20%uC5EC%uAE30%uC11C%20%uB2E4%uD615%uC131%20%uAC1C%uB150%uC744%20%uC801%uC6A9%uC2DC%uD0AC%20%uC218%20%uC788%uB2E4.%28%20%uC0C1%uC18D%uB9CC%20%uAC00%uB2A5%uD55C%20%uAC1C%uB150%uC774%20%uC544%uB2CC%20%uC778%uD130%uD398%uC774%uC2A4%20%uAD6C%uD604%uCCB4%uB4E4%uAC04%uC758%20%uAD00%uACC4%uB85C%uB3C4%20%uB2E4%uD615%uC131%uC744%20%uC801%uC6A9%uC2DC%uD0AC%20%uC218%20%uC788%uB2E4.%29%0A%0A%60%60%60java%0Apublic%20static%20List%3CApple%3E%20filterPredicateApples%28List%3CApple%3E%20Inventory%2C%20ApplePredicate%20p%29%7B%0A%20%20%20%20%20%20%20%20List%3CApple%3E%20result%20%3D%20new%20ArrayList%3C%3E%28%29%3B%0A%20%20%20%20%20%20%20%20for%28%20Apple%20apple%20%3A%20Inventory%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%28p.test%28apple%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result.add%28apple%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20result%3B%0A%7D%0A%60%60%60%0A%0A%0A%uC790%2C%20%uADF8%uB7FC%20%uBA54%uC18C%uB4DC%20%uD638%uCD9C%uC774%20%uC5B4%uB5BB%uAC8C%20%uB418%uC5C8%uC744%uAE4C%3F%0A%0A%60%60%60java%0A%09%09List%3CApple%3E%20list%20%3D%20Arrays.asList%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20Apple%28150%2C%20%22green%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20Apple%28170%2C%20%22red%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20Apple%2850%2C%20%22green%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20Apple%28160%2C%20%22blue%22%29%0A%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%20%20%20%20List%3CApple%3E%20results1%20%3D%20filterGreenApples%28list%29%3B%0A%20%20%20%20%20%20%20%20System.out.println%28results1%29%3B%0A%20%20%20%20%20%20%20%20List%3CApple%3E%20results2%20%3D%20filterWeightApples%28list%29%3B%0A%20%20%20%20%20%20%20%20System.out.println%28results2%29%3B%0A%20%20%20%20%20%20%20%20List%3CApple%3E%20results3%20%3D%20filterPredicateApples%28list%2C%20new%20AppleWeightPredicate%28%29%29%3B%0A%20%20%20%20%20%20%20%20System.out.println%28results3%29%3B%0A%60%60%60%0A%uC5EC%uAE30%uC11C%20%uBCF4%uBA74%2C%20%207%20%2C%209%20%uACFC%2011%uBC88%20%uB77C%uC778%uC758%20%uCC28%uC774%20%uBCF4%uC774%uC2DC%uB098%uC694%3F%20%0A%uACB0%uAD6D%20%uBA54%uC18C%uB4DC%20%uCF5C%uC5D0%uC11C%uBD80%uD130%20%uCC28%uC774%uAC00%20%uBC1C%uC0DD%uD55C%uB2E4.%20%20%20%20%20%20%20%20%0A%0A%uC77C%uB2E8%2C%20%uC5EC%uAE30%uAE4C%uC9C0%20%uCB49%20%uCF54%uB4DC%uB97C%20%uBCF4%uBA74%uC11C%20%uC774%uD574%uD574%uBCF4%uB3C4%uB85D%20%uD558%uC790.%0A-%20-%20-%0A%0A%uC774%uC81C%uB294%20%uC911%uAC04%20%uBCC0%uD658%20%uC791%uC5C5%uC744%20%uAC74%uB108%20%uB744%uACE0%2C%20%uB78C%uB2E4%uB85C%20%uBC14%uB85C%20%uBC14%uAFD4%20%uBCFC%20%uACC4%uD68D%uC774%uB2E4.%20%uC65C%uB0D0%20%3F%20%uBD88%uD544%uC694%uD55C%20%uCF54%uB4DC%uB97C%20%uBC30%uC6B8%20%uD544%uC694%20%uC5C6%uAE30%20%uB54C%uBB38%uC774%uB2E4.%0A%0A%uC0AC%uC2E4%20%uC775%uBA85%20%uD074%uB798%uC2A4%uB85C%20%uC9C1%uC811%20%uD30C%uB77C%uBBF8%uD130%uD654%uB97C%20%uD1B5%uD574%20%uCF54%uB4DC%uB97C%20%uAD6C%uD604%20%uD560%20%uC218%uB3C4%20%uC788%uC73C%uB098%2C%20%uC9C0%uC800%uBD84%uD574%uC9C0%uACE0%20%uC775%uBA85%20%uD074%uB798%uC2A4%uC5D0%20%uC775%uC219%uD55C%20%uC0AC%uB78C%uC774%20%uB4DC%uBB3C%uB2E4.%0A%0A%23%23%23%20%uB4DC%uB514%uC5B4%20%uB78C%uB2E4%20%21%0A%0A%0A

반응형

'프로그래밍 > Java' 카테고리의 다른 글

실전 아카 - 임백준님  (0) 2016.08.30
Top 10 Mistakes Java Developers Make  (0) 2016.07.14
Java BigInteger class 사용하기  (0) 2016.04.29
Intellij IDE Gradle java Project 생성하기  (0) 2016.04.26
예외처리 관련 기본기  (0) 2015.12.28