LinkManager 클래스에 private LinkManager()와 private static LinkManager sInstance;가 있다고 가정하자.
예를 들면 public static LinkManager getInstance(...) 말미에서,
return sInstance == null ? sInstance = new LinkManager() : sInstance;
이런 코드는 가능하지만,
return sInstance != null ? sInstance : sInstance = new LinkManager();
이건 불가능하다. 이건 C/C++에서 업어온 삼항연산자의 정의 때문이다. C11의 정의는 다음과 같다.
(6.5.14) logical-OR-expression: logical-AND-expression logical-OR-expression || logical-AND-expression (6.5.15) conditional-expression: logical-OR-expression logical-OR-expression ? expression : conditional-expression (6.5.16) assignment-expression: conditional-expression unary-expression assignment-operator assignment-expression
Java 7에서도 마찬가지.
(15.24) ConditionalOrExpression: ConditionalAndExpression ConditionalOrExpression || ConditionalAndExpression (15.25) ConditionalExpression: ConditionalOrExpression ConditionalOrExpression ? Expression : ConditionalExpression (15.26) AssignmentExpression: ConditionalExpression Assignment (15.26) Assignment: LeftHandSide AssignmentOperator AssignmentExpression
요즘 연산자를 어떻게 정의하는 게 좋은지 고민을 많이 하는데, 이 정의가 수많은 언어에 등장한다는 걸 생각하면 좋은 연산자 설계인지 아닌지 영 판단이 안 선다... 애초에 저런 구조가 하나만 가능하다는 건 컴파일러를 생각해야만 이해가 간다.
비슷하게 이상한 코딩을 다른 경우에도 할 수 있다. 멀쩡하게 절차적으로 짤 수 있는 struct allocator를 GNU C 확장을 이용해 Lisp 구조로 보이게 쓰는 것이다.
#include <stdlib.h> struct link; struct link *link_alloc(void *target); void (*link_release)(struct link *) = free; struct link { void *target; }; struct link *link_alloc(void *target) { return target ? ({ struct link *new_link = malloc(sizeof(struct link)); new_link->target = target; new_link; }) : NULL; }
아이고.
'Sablog Models > 언어' 카테고리의 다른 글
왜 abstract static은 금지되어 있는가? (0) | 2013.08.05 |
---|