🛠 프로그래밍 일반 6

객체와 함수를 은닉하기

함수와 객체를 외부로 노출시켜도 되는지, 노출시켜야 하는지 판단하는 것은 설계에 있어 매우 중요하다. 꼭 필요한 게 아니라면 일단 숨겨놓는 것을 기본으로 삼는 것이 맞다. 사용자는 언제 어느 때 어떤 행동을 취할 지 누구도 알 수 없으므로, 최대한 숨기고 접근하지 못 하게 만들어 예외 상황을 원천 차단하는 것이 좋은 설계다. 은닉하는 방법C++ 기준이다.private 접근 지정자 사용하기노출되지 않아야 하는 멤버는 private 접근 지정자를 통해 은닉한다.namespace 사용하기네임스페이스를 활용하면 접근 난이도를 높혀 일반 사용자의 접근을 차단할 수 있다.// 코어 개발자만 사용하는 네임 스페이스로 감싸는 예시// 네임스페이스를 명시하고 접근해야 하므로 접근 난도가 높아지고, 자연히 일반 사용자의..

서비스 로케이터 패턴 (Service locator pattern)

개념 여러 기능들을 '서비스 로케이터'라는 전역 클래스를 통해 관리하고 제공하는 디자인 패턴.각각의 기능을 제공하는 객체들을 서비스라고 부르며, 서비스 로케이터에 타입 또는 이름으로 서비스 객체를 등록하고, 필요한 곳에서 이를 요청하여 받아 사용하는 것이 골자이다. 개념도 간단하고 구현하기도 쉽다. 다만 구체적인 구현 방식은 하기 나름이라 매우 다양한 형태로 나타날 수 있다. 이 패턴을 사용하는 목적은 기본적으로 객체 간 의존성을 최소화하고, 생명주기의 관리마저 서비스 로케이터를 통해 쉽게 수행하는 것에 있다.의존성을 줄이기 위한 방법론이란 점에서 의존성 주입 패턴과 자주 비교된다. 결론만 말해 서비스 로케이터 패턴은 의존성 주입 패턴보다 당장 구현하기는 더 쉽고 직관적이나, 의존성을 명확하게 드러내는 ..

의존성 주입 패턴 (Dependency injection pattern)

고수준 모듈이 저수준 모듈을 사용할 때 이를 직접 생성하거나 제3자를 통해 찾아오는 대신,고수준 모듈을 생성 또는 초기화하는 외부로부터 저수준 모듈을 '주입받아' 사용하는 패턴. 핵심은 의존성을 외부에서 동적으로 만들어내고 관리하는 것이다. 기본적으로 의존성 역전 원칙이 지켜진다는 전제로 구현되며, (1) 확장과 변경에 용이하게 하고, (2) 의존성을 명시적으로 드러내기 위해 사용한다. 저수준 모듈을 외부에서 생성 또는 가져와 주입하기 때문에 보통은 해당 모듈의 수명까지 외부에서 관리하게 된다. 생성자 주입으로 주입된 객체를 주입의 대상만 사용하게끔 만들고 대상이 소멸할 때 주입된 객체도 같이 소멸하게 하는 방법도 있겠지만, 직관성이 크게 떨어지고 동적으로 의존성을 관리하는 의미가 퇴색되므로 좋은 방법이..

의존성 역전 (Dependency inversion principle)

객체지향의 5대 원칙인 SOLID 원칙 중 D에 해당한다. 또한 "수정은 어렵게, 확장은 쉽게" 설계해야 한다는 개방-폐쇄 원칙을 가장 쉽게 구현할 수 있는 방법이기도 하다. 개발자스럽게 표현하면 "고수준(High-level) 모듈이 저수준(Low-level) 모듈에 직접 의존하지 않게 한다"고 말한다.고수준, 저수준 모듈은 일반적으로 말하는 그 하이-레벨, 로우-레벨의 의미가 맞다. 로우-레벨은 어플리케이션의 밑단에서 구체적인 기능과 로직을 구현하는 것이고, 하이-레벨은 보다 추상화되고 사용자에게 노출될 가능성이 큰 것이다. 더 쉽게 말하면 다른 모듈을 참조할 때 직접 참조하지 말고 인터페이스같은 추상화 레이어를 하나 끼고서 참조하라는 것이다. 이로 인한 장점을 나열해보자면 다음과 같다.만약 인터페이..

API, SDK란?

API(Application Programming Interface)Interface라는 표현대로 어떤 기능이나 서비스를 쉽게 이용할 수 있게 제공(노출)해주는 도구이다.'쉽게 이용한다'는 말은 곧 내부에서, 또는 요청된 서비스를 처리하는 곳에서 무슨 일이 일어나는 지는 몰라도 되도록 해준다는 것. 예를 들어, Win32API는 윈도우즈 OS의 다양한 기능을 쉽게 사용하도록 노출해주는 함수들을 제공하고, 그래픽스 API인 DirectX는 GPU 디바이스를 대신 관리하고 렌더링 작업을 수행해주며, 구글맵 API는 구글 서버와 연결하여 구글 맵을 통해 위치 기반 서비스를 구축할 수 있게 지원해준다. API 중 특히 일반에 무료로 사용할 수 있도록 공개된 것을 Open API라고 부른다.  SDK(Softwa..

기호 파일(Symbol file)이란?

빌드된 코드에 대한 디버깅 정보가 담긴 파일. Visual Studio IDE를 사용하는 경우 .pdb(ProgramDataBase) 확장자로 생성되는 것을 본 적이 있을 것이다.그 안에는 기호(Symbol) 정보라고 부르는 함수의 서명, 변수의 이름 등과 해당 코드가 몇 번째 라인에 있는 지 등의 정보가 담겨있다. (쉽게 생각해서, 소스 코드와 기계어로 번역된 코드를 연결시켜준다고 할 수 있다.)기호 파일이 없으면 IDE에서 디버깅을 할 때 콜스택에 함수 이름이 아닌 주소가 찍힌다거나, 브레이크 포인트를 제대로 걸 수 없다거나 한다고 한다.문제는 내가 작성한 코드는 IDE가 자동으로 기호 파일을 생성해준다지만, DLL 형태로 제공되는 외부 라이브러리의 기호 파일은 생성할 방법이 없다는 것이다.그래서 라..