Programmer
-
C++에서 언제 어떻게 struct를 사용하는가?Programmer/Programming 2017. 9. 25. 16:03
C++로 코딩할 때에 class와 struct 중에 무엇을 사용할 지 고민을 할 때가 있다. 내가 C++에서 struct를 선택하는 기준은 다음과 같다. 분해하면 모든 멤버 변수가 scala data type이다. 멤버 변수 중에 union, struct 또는 고정 길이 array를 만나면 재귀적으로 분해한다. 모든 말단이 scala data type으로 이루어졌다면 struct를 사용한다. 즉, 분해하는 과정에서 포인터나 가변 길이 배열, 클래스를 만나면 struct를 사용하지 않는다. 구조체를 이진 데이타로 고스란히 pack/unpack 해야 한다. struct는 메모리 형태 그대로 데이터로 상호 변환 가능함으로 개발하기 편하다. 굳이 별도의 pack/unpack 함수를 작성할 필요가 없다. 단, 데..
-
Lisp 비교 : Emacs의 개발 환경Programmer/Emacs 2017. 7. 11. 03:36
Emacs의 Programming 관련 공통 설정 Lisp 공통 설정 (use-package paredit :ensure t :diminish paredit-mode :init (use-package paredit-everywhere :ensure t)) Common Lisp Common Lisp의 major-mode는 'lisp-mode'이다. 보통 확장자 '*.lisp'나 '*.l'와 연결되어 있다. SLIME이라는 강력한 REPL 도구가 있다. Common Lisp 설정 예: (add-hook 'lisp-mode-hook (lambda () (setq indent-tabs-mode nil) (paredit-mode t) (helm-gtags-mode 1))) (use-package slime :en..
-
일단 만들어라. 두 번 만들어라. 그러면 보일 것이다.Programmer/Programming 2017. 6. 29. 06:26
내가 실무에서 배운 최고의 코드 설계 방법은? 일단 만들어라. 두 번 만들어라. 그러면 보일 것이다. 문제를 이해하는 가장 좋은 방법은 만들어보는 것이다. 생각만으로는 알 수 없다. 구현하면서 문제에 대한 이해가 높아진다. (관련 링크: 창의적인 일을 찾지 말고 창의적으로 일을 하라.) 어떻게 하면 효과적으로 문제를 탐색할 수 있을까? 첫번째 구현에서는 문제의 탐색에 초점을 두어야 한다. 머릿속에 떠오르는 이상적인 시나리오를 직선적으로 표현한다. 세세한 예외 처리나 아름다운 코딩 등에 시간을 빼앗기지 말자. 그림에 비유하자면, 머릿속에 떠오른 이미지를 거침없이 스케치를 하는 것과 같다. 화폭에 그리면서 전반적인 이야기와 구도를 잡는 것이 가장 효과적이다. 이 단계에서는 눈가의 잔주름과 같은 세부적인 부분..
-
문제가 발생하면 근본 원인 찾아라.Programmer/Programming 2017. 3. 6. 22:10
문제가 발생하면 근본 원인 찾아라. 근본 원인을 찾지 않고 성급하게 해결하는 것은 나쁘다.대표적인 사례가 핵(hack)이다. 핵은 원인을 고치지 않고 드러나는 문제만을 처리한다. 근본 원인 파악 없이 방어 코드로 해결한다. [표면적인 문제만 해결하려는 우리들의 모습] 자동차의 시동을 두세번 시도해야 비로서 작동하는 문제가 있다고 가정해보자. 핵를 쓰는 엔지니어는 시동 걸릴 때까지 자동으로 반복해주는 기능을 추가한다. 여러 가능성이 있는 원인을 조사하지 않고 표면적인 문제만을 처리하였다.그러나, 이러한 방식은 문제를 감추었을 뿐 근본이 해결되었는지 알 수 없다. 숨겨진 문제가 언제 드러날지 누구도 알 수 없다. 게다가, 이렇게 원인이 해결 안 된 문제들이 숨겨지면서 누적된다는 것이 더 심각하다. 시동이 잘..
-
엑세스 함수(getter/setter)를 올바로 사용하기Programmer/Programming 2017. 2. 13. 13:05
객체의 속성을 읽고 쓰는 일관된 표현 방식을 제공하라. 엑세스 함수를 추천한다.[각주:1] 엑세스 함수를 사용하면 의존성 깨짐의 걱정 없이 구현을 바꿀 수 있다. Null을 할당하는 것을 허용하지 않거나 객체의 속성을 외부에서 바꿀 수 없는[각주:2] 규칙이 더해질 수 있다. 메모이제이션(memoization)[각주:3]과 같은 기능을 추가할 수도 있다. 자료형과 알고리듬이 변경되기도 한다. 엑세스 함수를 사용했으면, 이것을 이용하는 의존 모듈의 수정 없이 규칙과 기능을 추가할 수 있다. 추상적인 자료형을 사용한 엑세스 함수는 객체의 자료형 변경을 용이하게 한다. 위 이유는 명확하니 굳이 설명할 필요가 없다. 모호한 상황에서도 엑세스 함수 강제가 정당한지 생각해보겠다. 멤버 변수의 자료형, 알고리듬의 변..
-
public, private, const 키워드가 필요한 이유Programmer/Programming 2017. 2. 8. 11:08
public/private 키워드는 정보 은닉, 캡슐화 등에 도움을 주는 도구이다. 정보 은닉은 복잡하거나 변경 가능한 설계 결정을 안정적인 인터페이스 뒤로 숨기는 기본 설계 원리이다. 정보 은닉은 모듈을 분할하기 위한 기본 원리다. 모듈은 변경될 가능성이 있는 비밀을 내부로 감추고 잘 정의되고 쉽게 변경되지 않을 공용 인터페이스를 외부에 제공하여 내부의 비밀에 함부로 접근하지 못하도록 한다. 캡슐화는 ‘온갖 방법의 숨기기’라고 생각하면 쉽다. 캡슐화를 통해 데이터를 숨길 수 있다. 그리고 구현 코드, 파생 클래스 또는 여러 가지의 것들을 숨길 수 있다. - 알란 섈로웨이, 제임스 트로트, “알기 쉬운 디자인 패턴 캡슐화는 가해지는 변경에 대한 파급 효과를 일정한 영역 내부로 제한시킬 수 있다. 대부분의..
-
JSONProgrammer/Computer Science 2017. 2. 1. 12:18
JSON은 XML에 비해 상대적으로 가벼운 데이터 교환 형식이다. C 언어의 영향을 받은 언어의 구조체/배열 형식과 유사하여 프로그래머에게 매우 친숙한 형태이다. 특히, 고대의 JavaScript의 일부에 토대로 두고 있어서 JavaScript와 그 구조가 매우 유사하다. XML과 많이 비교되는데 공통점으로 뛰어난 호환성을 제공한다. 많은 프로그램 언어와 웹, 소프트웨어에서 JSON을 지원한다. 텍스트 파일로서 사람이 읽을 수 있다. 이는 디버깅에 매우 효과적이다. 텍스트 파일임으로 이진 데이타보다 더 많은 용량을 차지한다. 다른점으로는 상대적으로 가벼워서 구조가 간단한 데이타에 사용하기에는 적합하다. 반면, DTD나 XML 스키마와 같이 언어를 정의하고 확장, 검사하는 도구가 부족하다. 메타데이터와 네..
-
CentOS 7 emacs-25.1 64bits RPMProgrammer/Emacs 2017. 1. 13. 19:20
GUI 환경에서 GNU Emacs emacs-common-25.1-3.el7.centos.x86_64.rpm 터미널 환경에서 GNU Emacs emacs-common-25.1-3.el7.centos.x86_64.rpm 2015/06/01 - [Practice/Emacs] - CentOS 5 emacs-24.5 64bits RPM 2015/05/28 - [Practice/Emacs] - CentOS 6 emacs-24.5 64bits RPM