4. JAVA의 언어적 불편함
4-1. 명사형 사고를 강제
자바는 모든 동작이 객체 상위에서 이루어지게 함으로써 명사형으로 생각하는 것을 강제합니다. 그 결과로 자바에는 전역 함수가 없고 모든 함수는 어떤 클래스에 종속되어있습니다. 이 때문에 기능적인 부분을 작성하는데 자잘한 클래스들을 작성해야 한다는 불편함이 있습니다.
이런 명사 중심적 생각은 확실히 많은 경우 편리하나 동사 중심으로 생각해야 하는 상황도 생각보다 흔하다는 게 문제입니다. 예를 들어서, 퀵 소트를 자바에서 엄격하게 의도된 대로 짜려면 quickSort(array)라는 함수 대신 QuickSorter라는 객체의 생성자에 배열을 넣고, 그 생성자를 참조하는 참조 변수를 이용해 run()을 호출하여 동작시켜야 하는 것입니다.
디자인 패턴을 사용해서 어느 정도 동사형 사고방식으로 코드를 작성할 수 있긴 합니다. 디자인 패턴에서 핵심적 지위를 차지하는 인터페이스라는 것을 사용하면 상당히 동사적인 관점으로 객체를 다룰 수 있습니다. 자바의 리플렉션 API를 사용하는 방법도 있죠. 하지만 애초에 언어 자체가 명사 기준으로 생각하게 디자인된 건 사실입니다. 자바의 근간을 이루는 표준 java.lang 클래스와 java.util 클래스를 동사형 사고방식으로 재작성하기 전에는 힘듭니다. 이 재작성 삽질은 이미 Scala에서 해 놨으므로, 자바의 이러한 특징이 싫다면 Scala를 사용하면 됩니다.
4-2. 클로저 미지원
명사형 생각을 강제한다는 것의 연장선입니다. 버전 7 이하의 자바는 함수를 일급 객체로 취급하지 않습니다. 어떤 '동작'을 넘겨야 할 때는 그 동작을 추상화한 인터페이스를 만들고, 그것을 클래스로 구현한 뒤, 객체를 파라미터로 넘겨야 합니다. 반면에 클로저를 지원하는 언어는 그냥 함수를 파라미터로 넘기면 됩니다.
자바의 수많은 디자인 패턴들은 이 클로저 미지원 문제 때문에 만들어졌습니다. 자바라는 언어가 설계될 당시에는 클로저라는 개념 자체가 LISP, Haskell, ML 등의 언어를 사용하거나 프로그래밍 언어 자체를 연구하는 사람들만 아는 몹시 마이너한 개념이었기 때문에 동 시기에 만들어진 다른 많은 프로그래밍 언어들도 클로저를 지원하고 있지는 않았습니다. 따라서 설계 결함이라고 부를 수는 없고 현대에 들어서 단점으로 부각되기 시작했다는 편이 더 적절할 것 같습니다.
Java 8에서는 람다 표현식을 지원함과 더불어 메소드 참조라는 방식(this::add)을 통해 함수를 다른 함수의 파라미터로 넘길 수 있게 되었습니다. 이러한 함수 파라미터는 Functional Interface를 이용하여 선언하는데, Functional Interface는 수십여 종이 있으며 인자가 복수개인 것도 당연히 있고, 하나의 추상 메서드를 가진 인터페이스를 새로 만들어서 써도 됩니다. 다만 자바의 람다식은 바깥에 있는 변수를 참조하려면 그 변수가 final이거나 final을 붙여도 문제가 없는 변수들 뿐이다. 따라서 람다식이 주위에 있는 변수를 '저장'할 수는 있으나 그것의 값을 바꿀 수는 없습니다.
java.util.function에 있는 대표적인 함수형 인터페이스 (Function Interface)와 그에 대응하는 추상 메소드 몇 개를 나열하면 다음과 같습니다.
-
Predicate<T> ⇒ boolean test(T)
-
Consumer<T> ⇒ void accept(T)
-
Supplier<T> ⇒ T get()
-
Function<T, U> ⇒ U apply(T)
-
BiFunction<T, U, R> ⇒ R apply(T, U)
자바에 대한 설명을 마치며.
글을 작성하게 된 이 시점에 저는 앞서 말씀드렸던 전자정부 표준프레임워크(EgovFramework)를 사용해 프로젝트를 진행하고 있는 현직 개발자입니다.
저도 포스팅을 작성하려고 마음먹고나서 자료들을 찾아보며 제가 몰랐던 자바에 대한 부분들도 알게 되었습니다.
글을 작성하며 장점보다 단점이 길어졌는데, 저는 개인적으로 자바는 아직도 충분히 매력적이고 필요한 언어라고 생각합니다. 그리고 자바에 입문하기 위해 이 글을 보신 분들이 계시다면, 처음 개발자로 입문을 자바로 해도 충분히 괜찮다고 말씀드리고 싶습니다.
일단 단점에서 말씀드린 부분들은, 작은 일반 회사 프로젝트들이나, 개인 프로젝트에서는 느낄 수 없는 부분들이 많고, 개발자로 마음먹은 상태에서 단점이 더 많다는 이유로 자바를 포기하기에는 너무 아깝기 때문입니다.
특히 메리트는 장점에서도 말씀드렸던, 비교적 많은 일자리와 학원들 자료들로 인해 초반 접근이 용이하고, 어떻게든 첫 직장도 구하기 쉽기 때문에 개발자가 되고 싶으신 분들은 자바로 처음 진입하시는 것도 나쁘지 않다고 생각합니다.
아, 물론 다른 언어를 아예 마음에 두고 계신 분들은 그 언어를 하시면 되고, 언어에 대한 고민을 하고 계신 분들에 한해서요.
글을 쓰다 보니 주절주절 길어졌는데, 개발은 자바를 하다가 파이썬을 할 수도 있는 거고, 자바스크립트를 하다가 리액트를 하게 될 수도 있는거죠. 제가 지금 다니는 회사만 봐도 자바로 일하다가 부서가 바뀌면 프론트엔드를 하게될 수도 있는 것처럼 말이죠.
그러니 처음 개발을 접하시는 분들은 이거 할까 저거 할까 너무 오래 깊게 고민하시는 거보다 일단 한 가지 정해서 뛰어들어보라고 말씀드리고 싶습니다. 요즘 시대에는 1분 1초가 아까우니까요.
그럼 저는 이만, 다른 포스팅에서 또 찾아뵙겠습니다.
'JAVA' 카테고리의 다른 글
JAVA의 버전별 변화(JAVA SE 10 ~ 15) (0) | 2020.11.30 |
---|---|
JAVA의 버전별 변화(JAVA SE 6 ~ 9) (0) | 2020.11.30 |
JAVA의 예외 처리와 소스 코드 길이 차이 (0) | 2020.11.30 |
JAVA의 단점 - 속도문제 (0) | 2020.11.29 |
JAVA의 호환성과 안정성, 가독성 (0) | 2020.11.28 |
댓글