현재 진행중인 프로젝트에서 좀 이해하기 힘든 코딩표준이 나왔다. (현재 프로젝트에서는 Java(Spring)와 Flex(Swiz)로 개발을 진행 중이다.) 어떤 표준인고 하니, 모든 VO 클래스에서 기본생성자를 만들고, 모든 멤버를 리터럴이나, 혹은 문자열 등으로 초기화하라는 표준이었다. 예전에도 프로젝트 내에서 비슷한 이야기를 들었었고, 그 의견을 내었던 분이 프로젝트 내에서 꽤 큰 힘을 가지고 좌지우지 하시는 분이라서 정중히 메일로 내 의견을 밝혔던 기억이 있었다. 그리고, '표준'관점에서 어거지로 기본생성자를 만들어 코딩을 해왔다.
하지만, 개발기간 막바지에 와서 다시 그 이야기를 꺼낸 것이다. (이제 그 이야기를 꺼낸 분을 '그 분'이라 호칭하겠음) 오늘도 사실, 그 분과 그 이야기를 나와 직접 나눈 것은 아니고 일하다 바람결에 들려오는 어처구니가 없는 이야기에 점점 집중, 흥분을 한 나머지 끼어들고 말았다.
먼저 내가 알고 있는 지식으로는... 클래스 내의 멤버변수는 초기화 하지 않았을 경우에 분명히 기본값으로 셋팅된다. 물론 시점이 있는데, 그건 기본생성자(코드상에서 생략되어있는..)를 호출할 때이다. JVM이 인스턴스를 생성하는 절차에 대해서는 따로 설명할 기회가 된다면부연을 하겠지만, 중요한건 이딴 표준이 필요없다는데 있다. 아니, 필요없다기보다는 현 프로젝트에서 굉장히 쓸때없는 짓이며, 그런 주장을 하는 그 분의 논리가 지극히 개인적인 경험에서 나온, 말하자면 "내가 옛날에 초기화 안해서 엄청 고생한 적이 있었어. 디버그모드(그분이 말씀하시는 개발기간)에서야 스펙대로 돌아가겠지만, 런타임에서는 수동으로 초기화되지 않은 코드가 어떤 문제를 발생시킬지 모른다고!" 이런 논리인 것이다.
그 분은 인스턴스가 생성되고, 멤버가 초기화되는 절차를 아시는지 모르시는지.. 모르셨다면 알고나서 굉장히 놀라실 것이고, 혹여 알고 계신다면.. IT에 통달하셔서 "사람이 만든 JVM 따위.."라며 속으로 콧웃음치고 계실런지도 모르겠다.
여튼 마지막으로 그분의 논리를 좀 더 자세히 이야기하자면 그렇다. "설사 기본값으로 셋팅된다 하더라도 JVM은 믿을 수 없는 놈이므로, 경험상 어떤 오류를 야기할 수 없으니 기본값을 셋팅해서 완벽한 프로그램을 만들자."가 첫번째 논리이고, "개발자들이 인스턴스의 멤버에 접근할 때 마다 null 인지 아닌지를 체크하는 코드를 자꾸 집어넣는데 그럼 생산성의 저하가 일어나는게 아닌가!" 라는게 두번째 논리이다.
흥분상태라 좀 두서없긴 한데.. 내 반론은 이렇다. 첫번째로 "JVM에서 기본값 셋팅하는 절차나,개발자가 직접 생성자에 값을 셋팅해주는거나 절차상 차이가 없으므로, JVM을 못믿는거면 인정한다. 근데 그럴거면 Java 따위 뭣하러 쓰지?" 이고, 두번째로는 "개발자가 널값을 체크하건 말건 그게 비지니스 로직을 위해 반드시 해야하는 부분이라면, 기본값 셋팅하고 나서는 널체크를 안해도 된다는 이야기는 개나 줘버리시고, 문자열이나 리터럴로 기본값 초기화를 안해서 널체크를 해야하는거라면 (일단 스펙따윈 잊자) 그럼 VO 클래스마다 멤버 이름 똑같이 복사해서 빈문자열이나 0 따위를 넣고 있는거랑 필요에 따라 널체크하는거랑 뭐가 더 불필요하게 코딩문자수가 길어질까?" 라는 것이다.
아무튼, 오늘 귀중한 경험을 하나 했다. "내가 해봐서 아는데..."라고 말하는 사람과는 가급적 대화할 생각을 말 것. 특히 나도 해본걸 그 사람도 해봐서 안다고 말하는 사람과는 더더욱... 그건 기본적으로 경험의 차이를 떠나 인격의 문제가 아닐까 하는 심각한 고민이 든다.
덧붙임(1)
이게 이렇게 흥분할 일인가? 하고 이글을 읽으시며 반문하실 수도 있는.. 비전문가나 초고수분들께 한가지 귀뜸해드리고 싶은게 있다. 당신도 누군가에게 "기본이 안되어있는데 무슨!" 이라는 말이나 "나에게 생산성을 논해? 허~ 참.." 이란 말을 듣는다면 나처럼 흥분 안하게 생겼는가? ㅋㅋ
덧붙임(2)
덕분에 공부 많이 했다. 혹시 내 지식이 틀렸을까봐 레퍼런스도 많이 찾아봤고, 좋은 글도 발견한 만큼... 감사해야될 부분도 있는것 같다. 마치 MB덕분에 온 국민이 광우병 전문가가 되었듯 말이다.오늘본 레퍼런스 중에 좋은 것은다 영문이었는데, 하나쯤 번역해서 올려보아야겠다.그 분이 같은 이슈로 검색하시다가 내 블로그에 들어오실 수도 있으니... 참고하시라고..
1. Object initialization in Java :
http://www.javaworld.com/javaworld/jw-03-1998/jw-03-initialization.html?page=1
(번역물 :
http://mosscarpet.blogspot.kr/2012/07/java-1.html)
2. Java Language and Virtual Machine Specification :
http://docs.oracle.com/javase/specs/
덧붙임(3)
근데.. FLEX는 안에서 어떻게 돌아가는지 전혀 알고 싶은 마음이 안생기는건 왜 일까?