2015년 12월 10일 목요일

모던 자바의 역습(1) 프로그래밍 언어 자바

이번 포스팅은 김대우 님(http://lekdw.blogspot.kr/)과 함께 진행한 동명의 웨비너의 발표 내용에 바탕을 두고 작성되었습니다. 세상에 나온지 어느덧 20년. 오랜동안 프로그래밍 언어의 절대 강자로서 세상을 호령하던 자바를 둘러싼 진실 혹은 거짓말 그리고 과거와 미래에 대하여 알아봅니다.



스크롤의 압박을 피하기 위해 이번 포스팅은 다섯 파트로 나누어 연재합니다.


모던 자바의 역습 

1. 프로그래밍 언어 자바

자바가 세상에 나온 지 어느덧 20년의 세월이 흘렀습니다. 지금은 오라클에 합병된 썬마이크로시스템즈의 제임스고슬링(James Gosling), 마이크 셰리던(Mike Sheridan), 패트릭 노튼(Patrick Naughton)에 의해 인터렉티브 텔레비전을 개발하기 위해 개발된 이 언어는 1990년대 중반 이후 시작된 인터넷의 성장과 발전을 주도하고 스마트 디바이스와 클라우드 컴퓨팅이 대세가 된 오늘날에 이르는 20년의 세월 동안 크고 작은 진화를 거쳐오며 건재함을 과시하고 있습니다.
가장 좋은 언어가 무엇이냐는 무엇을 만드는지에 따라 달라질 수 있고 관점에 따라 이론의 여지가 있겠지만 가장 많은 프로그래머를 보유한 언어로 자바를 꼽는 데 주저할 만한 이유는 없다. 자바는 그만큼 오랜 기간 여러 분야에서 널리 사용되어왔고 또 자바 이전에 나왔던 다른 언어들에 비해 배우기 쉬운 언어인 것만은 분명합니다. 하지만 오랜 역사를 가진 언어인 만큼 자바 또한 코딩 스타일에 있어서 단편화가 진행되어온 것도 사실입니다. 20년의 세월을 지내오며 새로이 추가된 것은 문법뿐만이 아니라 프로그래밍의 패러다임 또한 바뀌어왔기 때문입니다.

자바 언어 시스템

자바에 대하여 이야기를 할 때에는 몇 가지 포인트를 분리하여 이야기하지 않으면 안 됩니다. OOP 언어로서의 순수한 프로그래밍 언어 자바와 자바를 동작시키기 위한 환경으로서의 자바 가상 머신(Java Virtual Machine)과 표준 API를 지칭하는 자바 플랫폼, 그리고 마지막으로 자바를 둘러싼 개발 환경과 패키지 관리 시스템 즉, 자바 생태계입니다. 물론 이 모든 것을 다루기엔 지면도 부족할 뿐더러 무엇보다 제 자신의 지식이 많이 부족합니다. 이 기사를 통해 저는 널리 알려져 있고 또 잘 알고 있다고 생각하는 자바지만 의외로 잘 알려지지 않은 진면목과 코딩 스타일을 살펴보고자 합니다. 특히 가장 최근에 발표된 혁명계 버전인 자바 8이 가져올 변화, 이른바 모던 자바로의 능동적 이행에 대한 내용을 중점적으로 살펴봅니다

자바의 버전 업 - 진화계(evolution)와 혁명계(revolution)자바의 버전 업은 크게 두 가지로 구분하는데, 기능적인 부분의 개선이 주를 이루는 버전업을 진화계(evolution)라 하고 언어 자체의 형태에 변화가 오는 버전업을 혁명계(revolution)라 칭한다. 자바 6, 7이 전자에 속하며 제네릭(Generic)과 어노테이션(Annotation)이 포함된 자바 나 이번에 함수형 프로그래밍 패러다임이 포함된 자바 8이 후자에 속한다.

자바의 목표

프로그래밍 언어로서의 자바를 이야기할 때 빼 놓을 수 없는 것이 언어 설계자들이 설정한 목표입니다. 자바의 공식 홈페이지에 소개된 다섯 가지 설계 지향점은 다음과 같습니다.
It must be "simple, object-oriented and familiar".
It must be "robust and secure".
It must be "architecture-neutral and portable".
It must execute with "high performance".
It must be "interpreted, threaded, and dynamic”.

단순하고 객체지향에 대해 친화적이어야 한다.
견고하고 안전해야 한다.
아키텍처에 중립적이며 어디서나 쉽게 동작시킬 수 있어야 한다.
고성능을 추구한다.
인터프리트적이며, 스레드로 동작하고 동적이어야 한다.


하지만 이보다 더 간결하게 자바를 설명하려 한 시도도 있습니다. 바로 "한 번 작성으로 모든 곳에서 동작한다 Write Once, Run Anywhere”라는 문구로 널리 알려진 자바의 철학(또는 마케팅 문구)인데, 일부 API가 기종이나 OS에 따라 동작이 달라지는 경우가 없지는 않지만 대부분의 PC와 서버환경에서 재컴파일 없이도 잘 작동하는 모습을 보여줌으로서 자바의 인기를 견인한 요소로서 꼽지 않을 수 없습니다.
실제로, 자바가 등장하기 전까지 대부분의 서버환경에서 작동하는 애플리케이션은 코딩은 로컬 PC에서 하더라도 컴파일과 배포는 서버에 원격으로 접속하여 실시한 후, 테스트도 원격 환경을 통해서만 진행이 가능했던 것이 일반적인 모습이었지만 자바의 등장 이후는 작업자의 PC에서도 서버에서 수행했던 작업이 가능해지게 된 것 입니다.

자바의 발자취

이야기는 자바가 세상에 처음 모습을 드러낸 1995년으로 거슬러 올라갑니다. 제임스 고슬링의 자바개발팀은 당시 최고 인기 언어이던 C/C++를 바탕에 두고 OOP를 구현하기에 좋은 모습으로 자바를 만들려 했습니다. 새로운 모습으로 시장에 나타나는 언어인 만큼 기존의 언어 사용자를 최대한 끌어 안으려 한 것이죠. 문법적인 부분과는 별도로 자바 개발팀은 여기에 새로운 시도를 합니다. JVM이라는 가상 머신 위에서 동작하는 언어라는 개념이죠. JVM 덕분에 자바는 기존의 컴파일 언어들이 가지지 못했던 메모리 관리 측면에서의 편리성이나 인터프리터 언어와도 닮아 있는 동적 바인딩과 같은 특징을 지니게 되는데, 이러한 특징은 이후 JVM 언어들이 탄생하는 초석이 됩니다. 자바 4(1.4)부터 8까지의 주요 변경 사항은 다음과 같습니다.

  1. J2SE 1.4
    • JAXP API(XML Processing)
    • 보안관련 API 추가
    • 로깅 API
    • IPv6를 포함한 네트워킹 관련 API 추가
    • NIO(Non-Blocking I/O)
    • 정규표현식(java.util.regex)
    • Assertion
  2. J2SE 5
    • 제네릭 프로그래밍
    • 어노테이션 (메타데이터)
    • foreach 루프
    • 타입 안전 열거형(Type-safe Enums)
    • 정적 임포트(Static Import)
    • Concurrent API (java.util.concurrent)
    • 스레드 우선순위 변경
    • StringBuilder class
  3. J2SE 6
    • JAX-WS (Web Services Client)
    • javac에 의한 어노테이션 처리
    • 모니터링 및 관리기능 강화
    • 스크립트 언어 지원
  4. J2SE 7
    • G1 가비지 콜랙터
    • 바이너리 리터럴
    • Strings을 이용한 switch 구문
    • try-with-resource 구문
    • 타입 인터페이스 추론
    • NIO 2.0
    • Fork-Join에 의한 병렬처리
    • JVM의 동적 언어 지원
  5. J2SE 8
    • 함수형 프로그래밍
      • 람다식
      • 함수형 인터페이스
      • 메소드 참조
    • 제네릭 타입 인터페이스 개선
    • java.util.stream의 함수형 조작지원
    • Collections API의 확장
    • Concurrency API의 확장
    • IO/NIO API의 확장
    • 리플렉션과 어노테이션의 변경
    • Nashorn JavaScript엔진

자바의 성공 요인

자바의 성공 요인으로 가장 크게 꼽히는 것은 기존 프로그래머는 물론 새로운 개발자도 쉽게 배울 수 있는 간결한 문법을 꼽을 수 있습니다. 예를 들어 포인터를 보이지 않게 래핑해 더 쉽게 문법을 배울 수 있었습니다. 여기에 잘 정비된 표준 API를 제공하여 구현해야 할 코드양을 크게 줄일 수 있다는 점 또한 큰 매력으로 작용했습니다. 마지막으로 오늘날 현실 세계의 추상적 구현에 가장 적합한 모델이라 불리우는 객체지향 언어로서의 특징을 꼽을 수 있습니다. 자바는 상속과 구현, 인터페이스와 같은 객체지향 언어의 특징을 처음부터 가지고 있었지만 한편으로는 구조적 프로그래밍 방식으로 구현할 수 있었기에 등장 당시 가장 인기있었던 C 언어의 사용자도 빠르게 흡수할 수 있었습니다.

구조적 프로그래밍의 잔재와 도메인 주도 개발

자바가 처음 등장했던 시기에는 객체지향 프로그래밍의 패러다임이 그리 널리 퍼져있지 않았습니다. C++이 있기는 했지만 C++는 C 언어 사용자를 끌어 안기 위해 구조적 프로그래밍과 객체지향 프로그래밍이 모두 가능했기 때문에 대부분의 개발자들은 이전 20여 년간 프로그램 세계를 지배했었던 구조적 프로그래밍의 패러다임 위에서 프로그래밍을 해오고 있습니다. 이는 자바의 경우도 사정이 비슷해, 언어가 세상에 나온 지 20년이 되어가는 오늘날에도 곳곳에서 구조적 프로그래밍의 잔재를 확인할 수 있습니다. 예를 들면 상수 클래스를 따로 만든다든지 OOOManager와 같은 처리용 클래스를 별도로 두는 것 말입니다. 에릭 에반스가 주창한 도메인 주도 개발(DomainDrivenDedign)은 순수 객체지향 패러다임으로 소프트웨어를 구현하는 데 유용한 원칙과 패턴의 조합으로, 복잡한 현실 세계를 객체지향적 사고의 틀 안에서 더 잘 구현할 수 있게 해줍니다.

자바의 성공에 있어서 오픈소스의 역할

초창기 여러 언어들의 틈바구니 속에서 자바를 원톱의 자리로 끌어올린 것은 무엇보다도 오픈소스 커뮤니티의 전폭적인 지원을 꼽을 수 있습니다. 초창기부터 자바는 만들어진 API를 편리하게 재사용할 수 있도록 Javadoc이라는 문서화 플랫폼을 제공했고, 언어 사양을 정하는 데 외부 개발자의 의견이 충분히 반영되도록 자바 커뮤니티 프로세스를 1998년부터 운영하여 오픈소스 진영에 각별한 배려를 했습니다.
실제로 오늘의 자바를 있게 한 일등 공신으로 손꼽히는 서블릿 컨테이너 톰캣으로 대표 되는 아파치의 각종 프로젝트들과, 자바의 표준 개발 툴로 자리잡은 이클립스, 스트럿츠에서 스프링으로 이어진 애플리케이션 프레임워크에 이르기까지 거의 대부분이 오픈소스 입니다.

쇠퇴의 징조?

이렇게 20년 가까이 절정의 인기를 구가하던 자바지만 2000년 대 초반 정점을 찍은 이후 그 위세가 점차 수그러들고 있는 것이 사실이기도 합니다.

위의 그래프는 2015년 6월 시점에 작성된 tiobe.com의 프로그래밍 언어 인기도 그래프입니다. 2002년 25%를 넘어서던 인기도가 꾸준히 떨어져 2015년에 들어와서는 1위의 자리를 놓고 C 언어와 근소한 차이로 경쟁하고 있습니다.

왜 이렇게 자바의 인기가 줄어 들어가는 것 일까요? 필자는 다음과 같은 세 가지를 자바 인기의 하락 원인으로 꼽습니다.

첫째, 스마트폰이나 타블릿PC, 웨어러블의 등장으로 다양해진 플랫폼과 그에 따라 다양한 언어의 등장을 들 수 있습니다. 소프트웨어 시장 전체가 커지고 있다 보니 더 많은 언어가 각각의 영역에 자리를 잡게 된 것이죠. 그러니까 전체 소프트웨어 생태계가 자바의 독점을 허용하지 않을 정도로 커졌을 뿐이지 단순 점유율의 비교로 자바가 쇠퇴하고 있다고 보기엔 어렵습니다.

둘째, 같은 기간 뚜렷한 성장세를 기록한 C#이나 파이썬과 같은 경쟁 언어들에 비해 다소 더딘 프로그래밍 패러다임의 도입과 행사코드를 줄이기 위한 언어 문법적 개선 속도를 꼽을 수 있습니다. 아무래도 가장 많이 쓰이는 언어이다보니 그만큼 이해 관계자도 많을 수밖에 없고 투표를 통해 언어 사양을 정해나가는 Java Community Process의 특성상 변화를 수용하는 속도가 떨어질 수밖에 없을 듯합니다.

마지막으로 JVM 언어의 약진입니다. JVM 언어란 자바는 아니지만 자바처럼 바이트코드로 컴파일이 가능하여 JVM위에서 동작이 가능한 언어로, 대표적인 언어로서 함수형 언어인 스칼라, 스크립트 언어 루비의 장점을 받아들여 만든 그루비,  애플 Swift의 원형이라 할 수 있는 코틀린이 있습니다. 이러한 JVM 언어들은 자바와 API 레벨에서의 호환성을 지니면서도 함수형 프로그래밍 패러다임이나 스크립트 언어의 간결함을 갖추고 있어 자바가 쌓아놓은 거대한 언어 생태계 안에서 빠르게 자신만의 영역을 구축해나가고 있습니다. 하지만 이러한 JVM 언어들은 단일 프로그램을 자바와 혼용하여 작성할 수도 있다는 점에서 자바의 경쟁자라기 보다는 자바의 단점을 보완해주는 협력자에 가깝습니다.

JVM 언어의 역사

행사코드란?뉴욕의 프로그래머로 유명한 임백준 님의 <“폴리글랏 프로그래밍 : 새로운 자바 언어를 기다리는 히치하이커를 위한 안내서>에서 ceremony code를 번역한 개념으로 프로그램의 실행과 직접적으로는 관계가 없는 프로그래밍 문법적 서식을 말합니다. 이러한 행사코드는 코드의 생산성과 품질에 큰 영향을 미치는 것으로 알려져 있으며 모던 언어들의 공통적인 발전 방향은 이러한 행사코드를 최대한 제거해나가는 데 있다고 할 수 있습니다.


모던자바의 역습

  1. 프로그래밍 언어 자바
  2. 자바를 둘러싼 진실 혹은 거짓말
  3. 자바 코딩 스타일 변천사
  4. 모던 자바의 등장 - Java8
  5. 섹시한 자바 개발자로 거듭나기