이 블로그는 방문자 통계를 위해 티스토리 기본 기능과 Woopra를 사용합니다. 원하지 않으신다면 사용하시는 웹 브라우저에 내장된 DNT 헤더를 켜고, JavaScript를 끄셔도 무방합니다.
이 블로그 방문자의 약 60%는 네이버 검색을 사용하십니다. 을 이용하시면 더 유용한 정보를 쉽게 얻게 되실 수도 있습니다. [mediatoday]
« 2020/10 »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
블로그 이미지
제가 주제인 블로그... 그냥 주제 없는 블로그입니다. 전공 분야나 예전 관심 분야 등등에 관한 글이 우선입니다만, 두어 문단을 넘길 만한 글이라면 대강 정리해 기록합니다. 학부생입니다. 트위터에서 볼 수 있습니다. http://aurynj.net/ 어­리


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;
}

아이고.

댓글을 달아 주세요