본문 바로가기

개발

JAVA8 대표적인 변화와 함수형 프로그래밍 느낀점

과연 나는 자바 8 개발자라고 할 수 있을까라는 생을 예전부터 자주 했다. 

자바 8을 보면서 기존 자바 7과 확연히 다른 모습을 보이면서 객체지향에서 벗어나 함수형 프로그래밍으로 변화했다. 

 

자바 8을 사용하는지 아닌지는 다음 문항으로 구분 될수 있을 것 같다.

. null 처리를 하는지, 단순 optional 처리가 아니라 우아하게 처리할 수 있는지. 

   - if(Optional.get != null) - (X)

. 객체 지향 프로그래밍과 함수형 프로그래밍의 차이를 아는지

. default 키워드의 정확한 사용법과 예시를 들 수 있는지 

. CompletableFuture 의 사용법과 그 역할을 아는지 

. 날짜 시간대의 자바 8로 넘어오면서 변환된 점을 아는지 

 

신입 입사 면접때 자바 8에 대해서 질문을 받고 스프링 캠프에 가서 주워듣은 걸 아는척하며 말한 기억이 있다. 

부끄럽게도 지금 개발자로 경력을 쌓은지 꽤 지났는데 저 질문들을 물어보면 명확하게 대답할 수 없는 게

현실인 것 같고, 나 자신에게 함수형 프로그래밍을 할 수 있냐라고 질문해보면 아니라고 할 것 같다. 

 

어렴 풋이 알고 있는 건 실제 내 것이 아니고, 눈으로 보기만 하는 건 정작 필요할 때 나오지 않는다. 

의식적으로 쓰고 생각해야 하며 자각해야 되는 것 같다. 다시 자바 8을 내 것으로 만들기 위해 쓴다.

 

자바 8의 대표적인 변화 점들 

스트림

. java.util.stream 패키지에 스트림 api가 추가됨.

. 한 번에 한 항목을 처리했지만 자바 8에서는 고수준으로 추상화해서 일련의 스트림을 만들어서 처리 

. 스레드 작업을 사용하지 않으면서도 공짜로 병렬성을 얻을 수 있음.

 

동작의 파리 미터화 

. 코드 일부를 api로 전달

. 스트림 api는 동작을 파라미터 화 할 수 있는 코드를 넘겨줄 수 있는 기능을 제공한다. 

 

병렬성과 공유 가변 데이터 

. 스트림 메서드로 전달하는 코드는 다른 코드와 동시에 실행하더라도 안전하게 실행.

. 동시에 실행하더라도 안전하게 실행할 수 있는 코드를 만들려면 공유된 가변 데이터에 접근하지 않아야 한다. 

. 두 프로세스가 공유된 변수를 동시에 바꾸려고 할 때의 해결책을 제시

 

.. 함수는 메서드와 같은 의미로 사용되는데 자바 함수는 수학적인 함수처럼 사용되며 부작용을 일으키지 않는 함수를 의미 

.. 프로그래밍 언어에서 일급 값과 이 급값이 존자해는데 프로그램을 실행하는 동안 구조체를 자유롭게 전달할 수 없는 구조체는 이급 시민이다. 

.. 인스턴스 화하면서 값이 되는 클래스를 정의할 대는 메서드를 유용하게 활용할 수 있지만 메서드와 클래스는 자체로 값이 될 수 없다. 

..(중요) 자바 8 설계자는 이 급시민을 일급 시민으로 바꾸는 기능을 추가 했다. (메서드가 일급으로 바뀜)

이급 시민이 일급 시민으로 바뀌면서 그 사용법(일급 값으로 넘겨주는 프로그래밍을)을 익히는 게

자바 8 함수형 프로그래밍의 핵심이다. 

.. 메서드뿐만 아니라 람다(익명 함수)를 포함하여 함수도 값으로 취급할 수 있다. 

 

.. 메서드 전달이든 람다이든 가능은 똑같지만 한 번만 사용하면 람다로 하는 것이 좋고 

복잡한 동작이나 자주 사용하는 코드면 매소드를 전달하는 것이 좋다. 

 

참고 : aws에서 람다 서비스라는 게 있는데 자동으로 기본 컴퓨팅 리소스를 관리하는 서버리스 컴퓨팅 서비스이다.

이벤트에 대한 응답으로 코드를 자동 실행하고 한 번만 실행된다는 의미에서 비슷한 느낌인 것 같다.

 

디폴트 메서드 

. 기존 구현을 고치지 않고도 이미 공개된 인터페이스를 어떻게 변경할까라는 생각에서 출현

. 라이브러리 설계자가 더 쉽게 변화할 수 있는 인터페이스를 만들도록 추가했다. 

. default라는 새로운 키워드가 추가되었다.