아무래도 한국에서 자바는 절대적인 위치에 있는 것 같다. 특히 자바 스프링을 쓸 줄 아는 프로그래머는 일을 못 구할 걱정은 안해도 될 것이다. 나는 그리고 대학교 계절학기로 JAVA를 재수강했다. D+가 나왔기 때문이다. 꼭 성적 때문에 재수강한 건 아니고, 나도 앞으로 살면서 JAVA 쓸 일이 한번은 있을텐데 이번 기회를 통해 좀 익숙해져봐야지 하는 생각으로 재수강을 하였다. 그리고 해보면서 느낀 점을 조금 정리해보고자 한다.

JAVA 는 썬 마이크로시스템즈의 제임스 고슬링과 다른 연구원들이 개발한 객체지향적 프로그래밍 언어이다. smalltalk 이라는 언어를 기반으로 개발되었으며 Write Once, Run Anywhere 이라는 컨셉으로 개발 되었다. 이후 오픈소스화 시켰으며 오라클이 썬 마이크로시스템즈를 인수함에 따라 오라클로 JAVA의 권리 및 유지보수 권한 또한 넘어갔다.이에 자바 개발 키트를 각 회사 및 재단에서 개발하게 되었고, 해당 JDK 들은 Oracle JDK 와의 호환성 여부를 표시한다.

기본적으로 JAVA는 바이트코드로 컴파일 되어 JVM(자바 가상 머신)에 의해 해석되어 실행된다. 그렇기 때문에 동일한 JDK 버전이 설치되어있으면 동일한 실행을 기대할 수 있다. 이것이 내가 생각하는 자바의 최고 장점이다. 다시 빌드하지 않아도 되는 것, 자바 바이트코드로 빌드하고 JAR 파일로 배포하면 된다.

자바는 객체지향 프로그래밍 언어로 Class 로 단위로 프로그램이 이루어져 있다. 일단 메인 메소드인 public void static main(String[] args) 도 클래스 안에 있어야 하는데 보통 public 클래스 안에 위치한다. 기본적으로 자바에서 public 클래스는 해당 클래스 파일 이름과 동일해야하며, 따라서 한 파일에 하나 밖에 만들 수 없다. public 클래스와 메인 메소드를 쓰고 나면 본격적으로 프로그램 로직을 구현해야하는데 하면 할수록 많은 class와 상속을 할 수 밖에 없는 구조라고 느꼈다. 마치 예전 프로그래밍 유머 중에 자바는 자바 코드를 짜는 공장을 만든다 라는 유머가 이해가 될 정도였다. C와 Cpp를 하면서 포인터의 홍수를 피할 수 없듯이 자바를 하면서 Class 의 홍수를 피할 수 없나보다 싶었다.

게다가 RAW TYPE이나 이런 것들로 인한 현대적인 언어에 비해 약타입적인 모습들이나 이해하면 알겠는데 참 이해하기 어려운 자바 특유의 기법들 (문자열 비교에는 equl() 메소드가 필요하다 등) 때문에 기묘하게 정감이 안 가는 언어이다.

또한 자바는 내 생각에는 메모리를 너무 많이 요구한다. 물론 이건 등가교환적인 요소이다. 자바는 여러 플랫폼에서 돌리기 위해 JVM 방식을 채택했다. 자바는 30억개의 디바이스에서 구동된다. JAVA는 바이트 코드인 class 파일로 컴파일 되고 이는 JVM에서 해석되서 실행된다. JVM 은 가상환경이고 최적한 실행을 위해 가능한한 메모리를 제한선까지 넉넉하게 예약한다. 그렇기 떄문에 메모리를 실제로도 많이 소모하며, 어떤 부분에서 메모리를 많이 소모하는지 분석하기 난해하다.

개인적으로 IDE가 없으면 프로그래밍 하기 힘들다는 것도 나는 불편했다. 자바는 IDE가 반드시 필요한 언어이다. 사실 반드시까진 아니지만 날코딩을 하기 매우 불편하게 되어있다. 자바는 컴파일 하면 여러개의 class 파일을 만들고 이를 링크하고 실행해야한다. 그러기 매우 불편해서 보통은 maven 이나 gradle 같은 빌드툴을 사용하는데 이것을 사용하는 시점에서 IDE가 없으면 매우 불편하다. 예제를 단순히 따라치거나 하는데 실행 파일 하나로 끝나지 않고 프로젝트 폴더를 하나 만들고 안에 gradle 프로젝트를 생성하는 작업들 역시도 꽤나 불편하게 느껴진다.

하지만 그럼에도 엔터프라이즈용으로 많이 쓰이는 이유는 일단 Spring 베이스의 전자정부프레임워크가 한국에서 JAVA와 SPRING의 보급을 불러일으켰다. 또한 엔터프라이즈 환경에선 메모리 사용량이 개인에 비해 크게 커도 상관이 없으며 다양한 서버 환경에서 동일하게 구동되는 것 또한 장점이고, IDE를 통해 개발환경 및 프레임워크 사용환경을 맞출 수 있으며, 클래스 파일 별로 분업 같은 걸 하기 나쁘지는 않겠다는 느낌이 있다. 개인적으로 JVM이 컨테이너 환경과 적합하지 않을 것 같다는 생각은 있으나 일단 지금까지의 사용환경은 베어메탈 환경이 많고, 자바 더 나아가 스프링, 스프링부트 또한 넷플릭스가 사실상 주도하여 컨테이너 환경에 맞게 개선을 하고 있기 때문에 크게 문제가 없을지도 모르겠다..

한국에서 프로그래밍을 한다는 건 필연적으로 자바의 입김을 벗어나기 어렵다는 이야기이기도 하다. 그런데 막상 해보니 애증이자 나랑은 그렇게 맞지 않고, 정감이 가지 않는 언어인 것이 참 기묘한 점이다. 그래서 오히려 인프라 엔지니어 쪽을 하는게 더 맞았나 싶기도 하고, 남는 시간에 프로그래밍을 하는게 오히려 더 낫겠다라는 생각이 들었다. 이렇게 저렇게 맘에 안 드는 점을 적기는 했지만 자바가 쓰이는 곳은 정말 많다. 마인크래프트, 마인크래프트 모드들, 카프카, 주키퍼 같은 클러스터 관리툴에 스프링과 스프링부트까지. 레거시라고 볼 수도 있지만 코틀린 등으로 인해 JVM을 쓰는 언어자체가 없어지지는 않을 것 같다. 그러면 어쩔 수 없이 공부해보는 수밖에