본문 바로가기

이생각 저생각

[뜬금없는 이야기] 악당의 자바7(Villain's Java 7)

JAVA 7은 나올때가 한 참 지났다. 왜 이리 오래 걸리는건지 이해가 잘 안가지만, 그래도 이젠 유저들의 숫자가 어마어마하고 다양한 집단의 다양한 이권이 왔다갔다 하는 상황이라는 걸 따져보면 조금은 답답한 마음이 누그러 들기도 한다.

현재 자바는 성공한 젊은 벤처기업 SUN에서 노련한 장사꾼 오라클의 손으로 넘어가 있는 상태다.

잠깐! 말을 이어가는데 짤라서 미안한데, SUN이 젊은 벤처라고? 아니지 않나?

음.. 어떻게 생각할런지 모르겠지만, 외국에선 SUN은 성공한 젊은 벤처기업의 이미지가 짙다. 구글이나 페이스북, 유투브, 플리커등의 인터넷 서비스 벤처와는 또 다른 의미로 벤처기업이 맞다. 자, 하려는 이야기는 이게 아니니까 이건 잠깐 넘어가자.

어디까지 이야기 했더라? 아! 맞다! 현재 자바는, 취미가 요트와 비행기 수집인 세계 6대 부자에 성격이상한 낭비벽 래리 앨리슨의 손에 있다. 오라클의 그 간의 행보를 보건데, 비싼 돈 주고 썬을 인수했는데, 핵심 자산 중 하나인 자바를 그냥 놔둘리 없다. 아마 이런저런 눈치를 보고 있을 것이 분명하다. 자바를 버전7로 올리는것 보다는 자바가 어떻게 하면 돈이 될지를 사람시켜 파고 있을지도 모르겠다.

그런데 사실 IT시장에서 유독 두드러지는 원리인 강자독식의 관점에서 놓고 봤을때, 지금은 자바로 돈을 어떻게 만들어 보겠다는 생각보다는 시장자체를 더욱 견고하게 만들어 버리는편이 낫다.

 내가 만약 돈 좋아하는 앨리슨이라면 자바에 다음과 같은 세 개의 기능을 추가해서 당장 대대적인 홍보와 함께 자바 7을 내놓을 것이다. 이름하여 악당의 자바7 (Villain's Java 7) 이다!

1. Objective-C와 C#에 있는 Properties 기능
class TimePeriod{
    private double seconds;
 public double Hours
{
 get { return seconds / 3600; }
 set { seconds = value * 3600; }
}
}
class Program{
 static void Main(){
TimePeriod t = new TimePeriod();
t.Hours = 24; // setter 자동 호출. 3600 곱하기가 일어나서 저장된다.
System.out.println("Time in hours: " + t.Hours); // getter 자동 호출
}
}
[C# 예제 변형]

 2. 왠만한 스크립트 랭귀지들이 가지고 있는 cloure기능
var printMessage = function (s) {
 
var f = function () {
    
console.log(s + ' was pressed.');
    }

    return
f;
}

buttonA.onClick = printMessage('A');
buttonB.onClick = printMessage('B');
buttonC.onClick = printMessage('C');
[클로저의 여러가지 사용방법 중 한가지. 함수형 언어와 명령형 언어의 중간 선택]

3. Meta Programming 강화를 위한 일급함수 기능 (= 함수 그 자체를 변수처럼 할당하거나 인자로 넘길 수 있는 기능)
f( x ) {
    return x + 3
}

g( function, x ){
    return function(x) * function(x)
}


print g(f, 7)

Python 예제 변형. print g(f, 7) 결과로 100 이 찍힌다.

왜 이런 기능을 추가하는 것이 악당의 자바7이란 말인가? 나쁘지 않지 않나?

현재 판도를 보면 그렇지 않다. 한동안 자바가 숨죽이고 있는 동안 다른 대안언어들이 자신만의 색깔을 찾아나가고 있는 상황이기 때문이다. LISP계열, JVM위에서 돌아가는 언어들(Clojure, Scala, Groovy), RUBY, Python 등등이 살짝 살짝 세력을 높여가고 있는 추세이다. 그 세력 증가에는 자바에서 벗어난 자바개발자들이 상당수 차지한다. 지루하고 답답하고, 새로운 공기와 기능을 찾아서!

크게 장사를 하려면 시장이 크고 그 안의 사람이 많아야 한다. 지금 당장 자바로 돈을 벌려고 하면 엄청나게 욕을 먹을 테니 우선은 자바 시장을 더 키워놓는 것이 중요하다. 핵심자사인 JVM과 자바를 적극 활용해서 플랫폼안의 개발자수를 늘릴 필요가 있다.

따라서 시장을 지배하고 다른 언어들을 죽이고자 한다면 위 기능 세 개만 추가하면, (논란은 있겠지만) 왠만한 대안 언어들은 다들 대안이 채 되기도 전에 힘을 잃을 것이다.

JUnit이 한동안 버전업이 없는 동안, TestNG가 좋은 기능을 여럿 소개했지만, JUnit4로 넘어오면서 TestNG의 좋은 기능 대부분의 기능을 흡수한 JUnit은 현재 자신만의 수성을 이뤄냈다.

마찬가지로 위 세가지 기능을 추가한다면 자바는 왠만한 언어들을 고사시키고 더더 세를 늘려 살아 남을 것이다.

다음은 왜 세가지 기능을 꼽았는지에 대한 이유다.


1. Objective-C와 C#에 있는 Properties 기능
getter, setter를 직접 만드는 건 구시대 적이다. 귀찮다. 많은 언어들이 Properties기능을 지원해 주고 있다. getter 나 setter가 있으면 해당 메소드를 통하고, 없다면 다이렉트로 변수에 접근한다. 자바빈을 만들때도 아주 편리하다. C의 구조체를 사용하던 사람들에게도 환영받을만 하다.

 2. 왠만한 스크립트 랭귀지들이 가지고 있는 closure기능
자바 유저들을 루비, JRuby, Groovy들의 유혹으로부터  격리시킬수 있다. 그리고 자바가 이들로 부터 매번 공격받던 부분 중 커다란 부분 하나가 해소될 수 있다. 게다가 이미 JAVA5부터 지원해 주고 있는 enhanced for loop와 함께 쓸수 있게 만든다면, 루비의 블럭(block)을 거의 유사하게 만들어 낼 수 있을 것이다.

3. Meta Programming 강화를 위한 일급함수 기능
많은 함수형 언어들의 장점으로 내세우는 기능들을 무색하게 만들수 있다. .net은 이미 람다계산(Lamda Calculus)을 지원해 주고 있다. 언어가 복잡해 지고 어렵고는 크리티컬하게 중요한 문제가 아니다. 사람들이 이 기능을 얼만큼 쓸건지도 고민할 필요 없다. 단지 지원한다는 것만으로도 다양한 응용 방법을 찾아낼 것이고, 함수형 언어들이 타격을 받을 것이다. 특히 스칼라는 직격에 가까울 것이다. 커링(curring)이나 트레이트(trait)를 배우기 위해 고생했던 사람들이라면 이정도로도 충분히 자바에 만족을 느낄 것이다.

한마디로 요약하면, 프로그램 언어 시장 청소 및 자바언어 사용자를 더더욱 견고하게 끌어들이기. 시장에서 정상의 자리를 유지하기가 목표인 것이다. 추가된 세 가지 기능만으로도 그간 자바에 불만을 느끼고 새로운 언어를 찾아 다니던 대안 언어 탐험가들에게 홈커밍데이를 만들어 줄 계기가 될 것이고, 자바는 여러 대안언어들의 킬러 랭귀지가 될 것이다. (못된 자바가 되겠지. evil java?)

현재의 자바도 복잡하다고 뭐라 하는 사람이 많지만, 안쓰면 그만이다. 기능이 많은데 안쓰는 거랑, 없어서 못쓰는 거랑은 또 다르다. 새로운 전자제품에 내가 쓸 수 있는 기능이 더 많아서라기 보다는 단지 기존 제품에 없는 다양한 기능이 더 많다는 이유만으로도 새 제품은 내 손안의 물건보다 매력적으로 보이는 법이다. 

내막을 아는 사람들에겐 욕을 먹겠지만 괜찮다. 그렇게 많이는 모를 것이다. 단지 더 많은 자바 개발자를 위해 새 기능을 추가했을 뿐 아닌가?  시장 경제란 원래 잔인하다는 점도 위안이 된다.

얼마전 자바원에서 오라클에서 JAVA 7을 놓고 이런저런 이야기가 오고간걸 안다. 하지만 아직도 자바 7은 어떻게 나올지 모르겠다. 그냥 재미 차원에서, 악당의 자바 7이 된다면 어떤 모습으로 만들까 하고 생각해 봤다.

:)