이번에는 new에 대한 이야기 이다.
몇 달 전에, Coding idiom을 정하는 쪽에서 코드의 통일성을 위해 파라미터가 없는 생성자의 생성법을 idiom으로 정리를 하자는 의견을 내었다. 간단하게 이야기 하면 new를 할 때의 코드 표기법을 new A 또는 new A() 중에 하나를 권장하는 쪽으로 가자는 것이다.
나의 경우, 처음에는 stack에서 생성할 때는 A a(); 가 아닌 A a; 를 사용해야 하므로 new 할 때도 new A()가 아닌 new A; 를 해야 한다는 주장을 하였다. 그런데 또 다른 쪽에서는 현재의 C++ 규약에서는 new A()와 new A의 동작을 각각 다르게 정의를 하고 있으므로 그 정의에 따라 결정을 하자고 했다.
그래서 문제의 방향은 new A()와 new A의 차이점을 보고 결정하기로 하였는데, C++1998과 C++2003에서 각각 정의하고 있는 new A()와 new A 의 차이점은 다음 링크에 잘 정리되어 있다.
원래 문제는 좀 더 복잡한 상태에서의 결정이지만, 이 문제를 간단하게 줄이면
- new A 는 메모리만 할당을 하며 사용자가 명세하지 않은 임의의 일을 더 하지 않는다.- new A() 는 메모리 할당뿐 아니라 멤버의 값을 0으로 초기화 시켜 준다.
이렇게 정리가 된다.
여러 사람들이 각각의 의견을 내었고, 나는 C++1998이냐 C++2003이냐와 상관없이 (1)컴파일러가 임의의 일을 더 하지 않는 new A 방식을 택하여야만 개발자가 항상 명확한 코드를 짤 수 있다는 주장이었고, 반대 쪽의 의견은 (2)항상 0으로 초기화 시켜주어서 개발자가 실수하더라도 문제가 적어지도록 적절히 초기화가 되어야 한다라는 주장이었다.
최종적으로는 나의 의견은 채택되지 않았지만, 나는 여전이 (1)번을 주장하고 싶다. -std 옵션이 무엇이 되든 간에 코드의 consistency을 보장할 수 있다는 것, 즉 예외가 없는 규칙이 가장 좋은 규칙이라는 생각에는 변함이 없다.
사실 이래나 저래나 큰 영향은 없는 규칙이고 개인의 철학과 다양성의 문제이다 보니, 괜히 이런 결정에 브레이크를 걸어 여러 사람의 뒷다리를 잡는 일은 없어야 하기에 그냥 다수의 결정에 따랐다.
Posted by 안영기