반응형

프로그래밍/cpp 46

VC++ 동적 연결 라이브러리(Dynamic Linking Library) dll 만들기

dll(Dynamic Linking Libray) 은 동적 연결 라이브러리다.우선 dll에 대해서 간단히 언급하고 dll 만드는 방법을 설명하려 한다.보통 C++을 막 배우기 시작해서 프로그램을 만들면 exe 파일 하나만 달랑 나온다. 이것은 실행파일이고 이 파일 안에 프로그래머가 정의한 함수를 비롯한 모든 코드가 모두 포함되어 있다.그런데 프로그래머가 정의한 함수를 실행파일과 분리해서 dll 파일안에 넣어둘 수가 있다. 달리말하면 프로그램이 처음 로딩될 때 메모리에 적재할 코드와 런타임 시에 그때 그때 필요한 코드를 구분해서 메모리를 효율적으로 사용할 수 있다. 또한 동시에 실행되는 여러 프로그램에서 같은 함수를 사용할 경우 각 프로그램에서 동일한 dll을 참조하면 되므로 같은 함수를 여러번 로딩하는 ..

프로그래밍/cpp 2017.08.04

c++ private, public, protected 속성, 상속 접근 지정자

객체지향 언어인 C++에서 상속은 여러가지 면에서 비중있게 다루어져야 하는 부분이다. 상속의 의의와, 상속 문법 그리고 프로그램 내에서 상속을 통해서 구현하고자 하는 것들 등등..하지만 실제로 보통 프로그래머들은 상속의 기능 중 아주 일부분만을 기계적으로 사용한다. 그도 그럴 것이 제대로된 클래스를 설계하는 것은 특정 능력자들의 손에 의해서 이루어지고 일반적으로 프로그래머들은 그것을 사용하거나 아주 간단한 상속만 만들어 사용하는데 익숙해져 있기 때문이다.어찌되었건 상속의 다양한 주제들 중에 가장 기본적인 상속의 접근 지정자에 대해서 간단이 언급하겠다.3가지 상속 접근 지정자우선 상속 접근 지정자로는 public, private, protected의 세가지가 있습니다. 그리고 위 표를 보기 전에 각 접근 ..

프로그래밍/cpp 2017.07.27

클래스 템플릿에 대한 간단한 정리

앞서 템플릿에 대한 개념을 설명하면서 함수 템플릿에 대해 살펴보았습니다. 2017/04/18 - [프로그래밍/cpp] - C++ 템플릿(template) 이해하기 이번에는 클래스 템플릿에 대해 살펴볼 것인데 함수 템플릿과의 차이점에 초점을 맞춰서 이해할 필요가 있습니다. 클래스 템플릿을 선언하는 방법은 함수 템플릿의 선언과 차이가 없지만 함수와 클래스의 구조적인 차이점으로 인해 클래스 템플릿을 사용할 때 반드시 타입을 명시해 줘야 합니다. 명시해주는 방법은 함수 템플릿의 구체화 지정과 동일하므로 쉽게 이해할 수 있습니다. 우선 템플릿 선언을 하는 예제를 살펴보겠습니다. 클래스 템플릿의 선언 클래스 템플릿 선언에 대한 내용은 굳이 길게 설명할 필요없습니다. 함수 템플릿을 만드는 방식과 동일하기 때문입니다...

프로그래밍/cpp 2017.04.29

C++ 템플릿(template) 이해하기

템플릿을 사용하여 프로그래밍 하는 것을 일반화(Generic) 프로그래밍이라고도 한다. 개인적으로 C++을 제대로 공부하기 위한 첫 번째 관문은 템플릿(template) 아닐까 생각한다. 템플릿을 알아야 STL(Standard Template Library)를 공부할 수 있기 때문에 이 관문을 거쳐가야 한다. 물론 템플릿을 제대로 이해하는 것이 만만한 영역은 아니지만 STL은 사용방법만 알면 깊은 이해없이도 기본적인 사용은 할 수 있다. 어찌되었건 템플릿을 제대로 공부하려면 큰 맘을 먹어야 한다. 여기에서는 템플릿의 기본적인 내용을 우선 정리해보려고 한다. 그렇다면 템플릿은 무엇인가? 식상하지만 많은 책에서 붕어빵 틀, 또는 모형 자 등으로 비유된다. 붕어빵 틀에 밀가루 반죽을 부어서 붕어빵을 찍으면 붕..

프로그래밍/cpp 2017.04.18

c++ 캐스팅 연산자 const_cast

앞서 static_cast에 이어서 나머지 캐스팅 연산자에 대한 내용입니다. conast_cast와 dynamic_cast는 사용 빈도수가 높지 않습니다. 그래도 중요한 포인트는 기억해 두어야 합니다. const_cast이름으로 유추해 보면 상수를 상수가 아닌 수로 또는 그 반대로 바꾸는 경우에 사용할 듯 싶네요. 그런데 이름 그대로 이해하면 안됩니다. 앞서 살펴본 static_cast의 경우 상수변수의 상수성을 없애는 용도로 사용했었습니다. 그렇다면 const_cast라는 것을 굳이 둘 필요가 없겠죠. 바로 const_cast은 포인터나 참조로만 캐스팅이 가능합니다. 이 때에는 상수성을 주거나 또는 상수성을 없앴 수만 있습니다. 예를 들어 보면... num이라는 정수형 상수와 이에 대한 상수 지시 포인..

프로그래밍/cpp 2017.04.11

extern, static 지정자

사실 이 두 지정자는 그렇게 복잡한 녀석들은 아니지만 메모리의 모습과 컴파일 과정과 맞물린 성질을 가지고 있기 때문에 확실히 개념을 잡지 않으면 그냥 저냥 이해하고 넘어가게 된다. extern우선 extern이란 지정자는 간단한 예제 프로그램에서는 거의 등장하지 않는다. 왜냐면 extern으로 선언된 변수가 있다면 이 변수는 전역 변수로 어디엔가 선언되어 있다는 의미를 가지고 있는데 일반적인 예제 프로그램들의 전역변수는 코드의 앞 부분에 미리 선언되므로 굳이 extern 지정자를 사용할 필요가 없기 때문이다. 코드는 순서대로 메모리에 올라가게 되고 이 순서만 맞춰서 전역 변수가 메모리에 우선 올라가 있다면 어디서든 접근이 가능하기 때문이다. 반대로 이 순서라는 것이 발목을 잡을 수가 있다. 예를 들어 전..

프로그래밍/cpp 2017.04.06

구조체 멤버 맞춤(struct member alignment) C++

아시는 분들도 계시고 모르시는 분들도 계실테지만 오늘은 구조체에 대한 내용을 분석해 보려합니다. 구조체는 일종의 데이터의 집합입니다. 그리고 클래스가 구조체의 업그레이드라고 아시고 계실 겁니다. 따라서 여기서 다루는 내용은 클래스에도 해당되는 내용입니다. 구조체 멤버 맞춤이란 구조체에 선언되는 멤버들이 메모리에 할당될 때 어떻게 할당되는가를 말합니다. 비유하자면 필통에 연필, 자, 지우개 등을 넣을 때 어떤 순서로 어떻게 넣는지에 대한 것과 비슷합니다. 데이터 구조 정렬의 정의 우선 한가지 실험을 먼저 해보겠습니다. Visual Studio c++ 환경입니다. 구조체의 크기 실험 ▼다음은 위 코드의 결과입니다. 코드에 정위된 두 구조체는 멤버의 선언 순서만 다르지 멤버 구성은 동일합니다. 그럼에도 구조체..

프로그래밍/cpp 2017.03.26

캐스팅 연산자 static_cast C++

오늘부터 2,3회에 걸쳐 C++의 캐스팅 연산자를 정리해 보려 합니다. 사실 캐스팅 연산자는 C언어에서 사용하는 ( ) 연산자가 있습니다. 단순하게 변환하고자 하는 변수가 있다면 " (type)변수 " 이렇게 써주면 되죠. 누구나 아실거라 생각합니다. C언어의 캐스팅은 이렇게 단순하고 캐스팅도 아주 자~알 됩니다. 그럼에도 C++에서는 캐스팅 연산자를 여러개로 준비해 놨습니다. 그럼 왜 캐스팅 연산자를 여러개로 나눠나서 골치아프게해~! 하고 그냥 C에서 쓰던데로 쓰실 수도 있겠습니다. 하지만 C언어에서 사용하던 캐스팅 방법은 안정성이 없습니다. 예를 들어 보죠. C언어 스타일의 캐스팅 연산 int x = 3;int * p = &x;printf("%c\n", (char)x);printf("%d\n", (c..

프로그래밍/cpp 2017.03.24

전위 연산, 후위 연산자 c++

C++을 사용하면서 항상 느끼는 것은 끝이 없다는 것이다. 처음에 C++을 어느정도 배운 후에는 배운 것에서 조금씩 덧붙여 가면 점점 쉬워 지겠지? 하는 생각이었다. 하지만 내 예상과 달리 C++은 사용할수록 많은 생각을 요구하고 반복적인 망각과 되새김 속에서 달팽이 처럼 힘겹게 기이가는 느낌이다.그래도 힘 겨운 만큼 성취감도 크다. 물론 적성에 안맞는 사람들에게는 비추다. 차라리 파이썬과 같은 언어가 문법도 간단해서 일반적으로는 코드를 작성하기는 깔끔하고 훌륭하다. 오늘은 전위 증가, 후위 증가에 대해서 끄적여 보려하는데 사실 이 연산자들은 파이썬, 자바등 다른 언어들도 가지고 있다. 이해하기에도 어렵지 않고 그다지 쓸 내용은 없을 듯 보인다. 그럼에도 오늘 쓸만한 주제를 억지로 끄집어 내 보았다. 연..

프로그래밍/cpp 2017.03.20

연산자 오버로딩 정리 c++

앞서 변환생성자와 명시적 변환에 대한 내용을 살펴보았다. 이번에는 연산자 오버로딩의 종류에 대한 내용을 정리할 것인데 앞서 주제와 연관된 내용이 있으므로 주목해서 보도록 하자. 그 전에 Scalar type과 non-Scalar type이 무엇인지 생각해 보면 도움이 된다. vector는 자주 들어봤을 것이다. 보통 스칼라(scalar)는 하나의 속성만 가진 값, 벡터(vector)는 여러 속성을 가진 값으로 이해할 수있다. type의 관점에서 스칼라(Scalar)라고 하면 하나의 값에 대한 정보만 가지고 있는 type을 말한다. C언어에서는 int, char, long, float, double 등 하나의 수로 표시될 수 있는 기본타입을 말한다. 참고 : https://msdn.microsoft.com..

프로그래밍/cpp 2017.03.19
반응형