반응형

C++ 8

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

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

프로그래밍/cpp 2017.04.29

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

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

프로그래밍/cpp 2017.04.18

GoF의 디자인 패턴 개정판 (2015) IT서적 다운 책

디자인 패턴에 관해 가장 처음 읽었던 책은 한빛미디어에서 나온 GoF 디자인 패턴 이렇게 활용한다. 라는 책이었다. 사실 그 당시는 디자인 패턴에 대해 생소하기도 했고 그냥 대충 골라서 읽었던 책이었는데, 그리 큰 감흥은 없었다. 그리고 이 책을 읽고서 많은 혼란을 느꼈었는데 싱글톤 패턴에 대한 내용이었다. 얼마전에도 이 책을 잠시 들쳐봤는데 싱글톤 패턴의 의미가 좀 의아했다. 이 책은 싱글톤 패턴을 최대 N개로 객체 생성을 제한하는 것 이라고 했다. 내가 알고 있는 싱글톤은 생성 객체를 오직 하나로 제한한다는 것이었기에 매우 혼란스러웠다. 오늘 소개할 책은 매우 유명한 책이다. "GoF의 디자인 패턴 개정판" 이 책은 디자인 패턴의 고전이다. 모른다면 꼭 읽어보길 권한다. 이 책에서 싱글톤 패턴의 사용..

관심사/도서 2017.03.31

캐스팅 연산자 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++

비타입 인수(Nontype Argument)는 타입이 아닌 실제 값을 말합니다. 실제 값은 변수가 아닌 상수를 말합니다. 대표적인 예로 배열객체를 만드는 클래스를 클래스 템플릿으로 만들어 보겠습니다. 멤버변수로 배열이 선언되었지만, 초기화가 안되 있습니다. 배열의 특성상 구체화(컴파일시)와 동시에 초기화가 되어야 하기 때문에 N값에 상수가 필요합니다. 템플릿을 이용해서 객체 생성시로 초기화를 미룰 수 있습니다. 이렇게 하면 클래스로 원하는 타입과 크기의 배열 객체를 생성할 수 있습니다. 템플릿을 사용하지 않고서는 클래스로 원하는 객체를 만드는 방법은 동적할당을 이용하는 방법일 겁니다. 동적할당을 사용하면 실행중 언제라도 배열을 크기도 바꿀 수 있고 실행시간 중에 생성할 수도 있습니다. 하지만 동적할당은 ..

프로그래밍/cpp 2014.06.18

C++ 추상클래스(인터페이스(interface)/순수가상함수)에 대한 고찰

디자인 패턴에 관한 책을 보면 인터페이스를 많이 활용합니다. 그런데 C++에서는 인터페이스라는 용어를 정확히 찝어서 사용하지는 않는 것 같습니다. 자바(Java)언어의 경우를 보면 일반적인 클래스와 인터페이스가 확실히 구별되고, 구현 방법도 extends와 implements로 다른 종류로 치부됩니다. 애초에 자바의 경우는 언어적인 차원에서 다중상속을 하지 못하게 하였고, 대신 인터페이스를 구현하는 방법으로 다중 상속부분을 해결하는 걸로 알고 있습니다. 꼭 다중상속의 차원에서만은 아니겠지만, 자바언어는 인터페이스를(interface) 따로 정의해 놨습니다. 이에 반해서 다중 상속이 자유로운 C++의 경우는 인터페이스라는 용어에 대해서 굳이 생각하지 않아도 되고 굳이, 구분해서 문법을 설명하지 않습니다. ..

프로그래밍/cpp 2014.05.01

연산자 오버로딩 C++

일반적인 연산을 살펴보면 오버로딩과 비슷한 규칙을 살펴볼 수 있다. 피연산자의 타입이 달라지더라도 알아서 계산이 된다는 것이다. 예를들어 정수+정수 의 연산결과는 정수가 되고, 실수+실수 의 연산결과는 실수가 된다. 이렇게 피연산자의 타입을 알아서 체크하고 그에 맞는 +연산을 하는 것은 마치 함수가 인수의 타입에 따라서 작동하는 오버로딩과 비슷하다 볼 수 있다. 이렇게 살펴본 사실은 실제로 사실이다. 다시말해 '+'는 피연산자의 타입에 따라서 오버로딩 되어있다. 하지만 char*타입과 같은 문자나 클래스 타입에 대해서는 작동하지않는다. 그렇다면 사용자가 직접 이런 연산자들을 오버로딩하는 법이 있을까? 15~18라인은 연산자 오버로딩코드이다. 일반적인 함수의 선언과 비슷한데 눈여겨볼 점은 호출시의 모양이다..

프로그래밍/cpp 2014.03.19

가상함수 virtual 키워드 C++

클래스 타입의 포인터로 멤버함수를 호출할 때 virtual 키워드의 유무에따라 동작이 달라지게된다. 예를들면 class A { public: void test(){코드1} }; class B : public A{ public: void test(){코드2} }; A *a = new B(); a->test(); //동작1 : 코드1이 실행 동작2 : A클래스의 멤버함수인 test()를 virtual로 선언하면 코드2가 실행 좀더 확실하게 살펴보자 다음과 같이 코드를 작성해보자. A클래스와 A를 상속한 B클래스를 선언한 뒤 Message함수를 만들어 A클래스타입의 포인터 pa를 인수로 하여 A객체와 B객체를 정적/동적바인딩을 해보자. 정적바인딩 동적바인딩(vitual 키워드 사용) vitual 키워드의 유무..

프로그래밍/cpp 2013.06.04
반응형