분류 전체보기
-
엑세스 함수(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
-
C언어에서 struct 정의 그대로 이진 데이터로 만들기Programmer/Programming 2017. 1. 13. 15:15
C의 struct를 이진 데이터로 저장하고 불러오는데 원하는대로 되지 않을 때가 있다. 예를 들어, 2 바이트 이후에 적혀야 하는데 4바이트 뒤에 위치하는 경우이다. 예상한 이진 데이터의 구조: 실제 이진 데이터의 구조 (목표 머신-target machine-을 64 bits로 컴파일한 경우): 이는 데이터 구조체 정렬(data structure alignment) 때문에 발생한다. 데이타 구조체 정렬이란 해당 머신의 읽고 쓰는 단위 크기의 배수로 데이타를 할당하는 것을 말한다. 데이터가 이 배수값보다 작으면 데이터 구조체 패딩(data structure padding)을 해준다. 현대의 컴퓨터는 성능을 높이기 위해서 이런 방식을 기본으로 사용한다. 따라서, 프로그래머가 정확한 이진 데이터를 생성하려면 ..
-
교착상태(deadlock)를 프로세스 상태와 디버거를 사용해서 찾아내기Programmer/Programming 2017. 1. 6. 15:37
멀티미디어(multimedia) 소스를 수신 받아서 가공하고 송출하는 프로그램을 개선하고 있었다.에이징 테스트(aging test)에서 얼마간 프로그램이 동작하다가 미디어를 송출하지 못하는 버그를 발견했다.로그를 살펴보니 송출이 멈추기 전에 수신부터 진행이 되지 않는 것을 발견했다.UDP로 입력 데이터는 들어오는데 읽지 못하고 있었다. 기능이 멈춰있으면 있으면 두가지를 의심할 수 있다.하나는 무한루프, 나머지 하나는 교착상태(deadlock)이다.무한루프에 빠지거나 교착 상태에 진입하면 다음 단계로 나아가지 못한다. 무한 루프인지 교착 상태인지 간단하게 판단하는 방법은 프로세스의 CPU 점유율과 상태를 확인하는 것이다.`ps -u`나 top 유틸리티로 확인한다. 무한 루프는 CPU를 과도하게 점유하는지 ..
-
버젼 관리 시스템을 사용하여 문제를 해결하기Programmer/Programming 2017. 1. 6. 15:01
초반에는 문제의 원인을 충분히 넓게 잡아라."에서 중요한 디버깅 기법 하나를 간단하게 언급하고 넘어갔다. 분석의 과정이 없이 추론에 근거하여 새로 추가된 원격 기능과 캐싱 알고리즘만을 의심했다. 코드를 수정해도 상태가 개선되지 않았다. ... 중략 ... 이전 버젼과 차이점을 면밀하게 비교하면서 비로서 문제의 원인을 발견했다. 같은 환경과 같은 기능(즉, 로컬 파일 읽기)에서도 새 버젼에서 동일한 문제가 일어났다. 즉, 새로운 기능이 동작할 때 발생하는 것이 아니란 의미이다. 로깅 시스템을 리펙토링을 했는데, 이와 연관이 깊을 것으로 추정했고 다양한 테스트로 이를 검증했다. - 2014/07/15 - [Practice/Debugging] - 초반에는 문제의 원인을 충분히 넓게 잡아라. 버젼 콘트롤 시스템..