자바 인 액션 실전 요약

Ch 1 ~ 2 자바와 동적 파라미터화

 

주니어인 내가 당장 알아야하는 챕터만으로 정리했다.

병렬 처리와 프로그래밍의 역사적 흐름과 같은 내용은 제외했다.

최대한 책의 내용을 그대로 요약하려 노력했고 내 의견은 기울여서 표현했다.

예제 코드는 내 프로젝트에서 따오거나 직접 작성한 코드들이다.

 

Chapter 1

자바에서 무슨 일이 일어나고 있을까?

 

자바 8은 람다와 스트림 API로 간결한 코드를 구현할 수 있도록 지원한다.

람다는 Ch. 3, 스트림 API는 Ch. 4 ~ 6에서 자세한 내용을 확인할 수 있다.

 

프로그래밍 언어의 핵심은 값을 변경하는 것이다. 그리고 우리는 이 값을 "일급 값"이라고 한다. 반면에 인스턴스화하여 전달하는 값인 메서드, 클래스를 이급 값 이라 한다. 자바 8 설계자들은 메서드를 일급 값으로, 즉 값으로써 전달할 수 있게 만들었다.

 

메서드 참조 " :: ": 이 메서드를 값으로 사용하라. (위 일급 값을 이해하니 다음 코드가 다르게 보인다.)

// 상품들을 받고 스트림으로 상품의 Id로 mapping 후 리스트로 반환
return products.stream()
                .map(Product::getId)
                .toList();

 

Predicate란?

수학에서 인수로 값을 받아 true, false를 반환하는 함수를 말한다.

자바 "java.util.function"에서 인터페이스로 확인할 수 있다.

 

외부 반복과 내부 반복

외부 반복: for-each 루프를 이용해서 각 요소를 반복하는 것

// 팀유저 리스트를 받아 수락된 것을 확인하고 요청한 position과 맞으면 result에 추가하는 루프
int result = 0;
for (TeamUser teamUser : teamUserList) {
            if (teamUser.getApprove() && position.equals(teamUser.getRole())) {
                result++;
            }
        }

 

내부 반복: 루프에 신경쓰지 않고 스트름 API를 사용하여 스트림 라이브러리에서 모든 데이터가 처리한다. 

// 내부 반복으로 수정
return teamUserList.stream()
                .filter(teamUser -> teamUser.getApprove() && position.equals(teamUser.getRole()))
                .count();

 

Chapter 2

동작 파라미터화 코드 전달하기

 

동작 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다.

간단하게 말하자면 함수를 전달하는 것이다. 하지만 이를 정확하게 이해하기 위해서는 흐름을 이해할 필요가 있다.

 

요구사항은 항상 바뀐다. 시시각각 변하는 요구사항에 엔지니어링적인 비용을 최소화하기 위해서는 새로 추가한 기능은 쉽게 구현할 수 있어야 하며 장기적으로 유지보수가 쉬워야 한다.

사과를 필터링한다고 생각해보자. 처음에는 빨간 사과만을 고르면 됐다. 농부는 무게가 150그램 이상이 되는 사과를 추가 선별해야 할 수도 있다고 말했다. 사과는 똑같이 인수로 받으면서 선별하는 동작만 다르게 하니 추가로 메서드를 만들기에는 많은 부분이 겹칠 것 같다. 추상화해야하는 시점이다. 전략 디자인 패턴을 통해(이 패턴에 대해서는 아래 짧게 요약했다) 사과를 받고 선별하는 과정에는 수정없이, 어떤 선별과정이 필요한 지만 추가하도록 바꿀 수 있었다.

 

전략 디자인 패턴

각 알고리즘(전략)을 캡슐화하는 알고리즘 패밀리를 정의하고 런타임에 알고리즘을 선택하는 기법이다.

"사과를 선별하기라는 패밀리에 빨간 사과 고르기, 무거운 사과 고르기라는 구현체로 전달"을 예로 들 수 있다.

다형성과 관련이 깊다.

 

하지만 여전히 우리에겐 고민이 있다. 고작 무거운 사과 고르자고 새로운 클래스와 메서드를 구현해야 한다.

(같은 이름과 같은 인수의 메서드를 한 클래스에 구현할 수 없으니깐)

 

물론 익명 클래스로 해결하는 방법이 있지만, 알고 싶지도 알 필요도 없다.

왜냐하면 우린 람다가 있으니깐.

람다를 Ch. 3에서 자세하게 알아보자.