반응형

프로그래밍 215

선택정렬 알고리즘(selection sort)

선택정렬(selection sort) - 선택정렬은 일반적으로 사람이 어떤 것을 크기 순서대로 정렬할 때 사용하는 방법과 유사한 방법입니다. 나열된 것 중에 가장 작은 또는 가장 큰 것을 선택하여 앞 또는 끝으로 보내는 작업을 반복하면 최종적으로 크기 순서대로 정렬이 되는 방식입니다. 다음 영상은 선택정렬에 대한 이해를 도와줍니다. 사람이 정렬을 할 경우 비슷한 과정을 거치지만 일반적인 사람의 경우 직관에 따라 몇몇 숫자의 위치를 정하고 그를 기준으로 수를 정렬하기 때문에 컴퓨터 입장에서 정렬하는 법을 위 영상을 보며 생각해볼 필요가 있습니다. 다음 그림은 선택정렬을 간략화한 그림입니다. 컴퓨터 입장에서 알고리즘이 실행될 때 두 수를 교환하는 과정 전에 더 많은 비교가 있습니다. 위 그림은 직관적으로 알..

버블정렬 알고리즘(bubble sort)

버블정렬(bubble sort) - 정렬 알고리즘을 배울때 보통 먼저 배우는 정렬 알고리즘 입니다. 버블정렬은 간단하기 때문에, 직관적으로 쉽게 이해할 수 있습니다. 마치 거품이 수면으로 올라오는 것 같아서 버블정렬이라고 한다네요. 버블정렬을 설명하기에 앞서 주요 정렬 알고리즘에 관한 시각적 자료를 링크하겠습니다. 정렬들간에 비교와 정렬의 특성을 파악할 수 있습니다. 버블정렬은 사람의 입장에서는 그렇게 자연스럽지 않습니다. 위 영상처럼 두 개씩 대소관계를 비교하며 위치를 바꾸어 나가는 데 컴퓨터 가 살아있다면 컴퓨터 입장에서 이러한 단순함이 오히려 쉽다고 느껴질꺼라 생각합니다. 버블 소트의 문제해결 방법은 다음과 같습니다. 1. 배열의 첫번째 요소와 두번째 요소의 대소관계를 비교한다 2. 대소관계에 따른..

비타입 인수,디폴트 템플릿 인수,특수화 (클래스,함수 템플릿) c++

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

프로그래밍/cpp 2014.06.18

클래스 템플릿에 대한 이해 C++

클래스 템플릿도 함수 템플릿과 비슷합니다. 알고리즘이 동일하다는 조건하에 멤버들의 다른 경우 템플릿으로 해결할 수 있습니다. 템플릿 함수를 이해했다면 이해하기 쉽기 때문에 긴말 없이 예제로 바로 들어 가겠습니다. 결과는 1이 찍히는 간단한 프로그램입니다. 함수 템플릿과 동일하게 template 로 시작합니다. 클래스의 선언부를 선언하는 방식은 기존 클래스 문법과 똑같습니다. 호출에 따라 달라질 멤버변수만 T로 선언해 주면 됩니다. 객체의 생성시 클래스명 뒤에는 을 적어주도록 합니다. 클래스의 경우는 함수와 달리 이렇게 명시적으로 클래스를 호출해주어야 합니다. 단, 함수 템플릿의 경우도 인수로 타입네임이 정해지지 않은 경우에 명시적 호출을 하는 것과 비교해서 이해해 주시길 바랍니다. 참고로 생성자에 타입네..

프로그래밍/cpp 2014.06.17

C++ 템플릿, 함수템플릿에 대한 이해

STL(Standard Template Library)의 문법적 토대가 되는 템플릿에 대해서 알아보도록 하겠습니다. 템플릿을 일종의 형틀입니다. 원하는 모양을 직접 조각하거나 빗는 것은 시간이 오래걸리지만, 형틀이 있다면 단순히 찍어내기만 하면 바로 만들 수 있습니다. 이번 포스팅의 주제인 함수 템플릿은 함수를 찍어내는 형틀이라고 생각하면 될 것입니다. 먼저 간단한 템플릿 함수를 예를 들어 보겠습니다. template 부분은 함수 템플릿의 정의 시작 부분입니다. 선언과 정의를 따로 하려면 다음과 같이 하면 됩니다. 또한 다음과 같이 두 개 이상의 타입을 전달받을 수도 있습니다. 여기서 핵심적인 부분은 T인데, 함수의 본체에서 사용될 타입입니다. 이렇게 함수템플릿을 작성하고 단순히 이 함수를 호출을 하게되..

프로그래밍/cpp 2014.06.16

box2d의 Testbed 유용한 디자인 패턴 정리

글쎄... 이 디자인 패턴은 어떤 이름일까 아직 모릅니다. 공부를 해나가다 보면 언젠간 알게 되겠지만.... 직접 분석을 했기 때문에 나중에 알게 되겠지만, Box2D의 디자인 패턴은 참 유용하다는 생각이 드네요. 이런 유용한 패턴은 언젠가 꼭 필요할 수 있을것 같아서 정리해 둡니다.. 오픈 소스기 때문에 엔진 자체도 무척 가볍고 c++로 이루어진 결과물이기 때문에 객체지향 관점에서 배울점이 많은 소스입니다. 물론 제 입장에서 말입니다. 그래서 TestBed가지고 놀던중 내부 소스를 살펴 봤습니다. 한국에는 Box2D관련 자료가 턱없이 부족하기 때문에 그냥 혼자서 살펴봤습니다. TestBed는 내부를 들여다보면 Test라는 주요 클래스가 있습니다. Test를 상속받은 수많은 클래스가 존재합니다. 아래보시..

네임스페이스(namespace) 제대로 사용하기,모듈화 프로그래밍 C/C++

네임스페이스(namespace)의 개념은 하나의 독립된 공간을 할당해 주는 것이라 할 수 있습니다. 이 공간의 개념을 일반적인 집 주소라고 생각해도 되는데, 개념 자체가 어려운 것은 아니지만 실제로 사용하려면 감이 안 잡힐 수 있습니다. 여기서는 C++을 기준으로 설명할 것이고, 클래스의 개념 내에서 네임스페이스를 사용하는 간단한 예제를 만들어 보려 합니다.. 또한 분할 컴파일의 개념도 간략하게 알고 넘어 갈 것입니다.. 프로젝트 구조 예제 클래스의 관계도 입니다. MyClass.h 파일에는 Myclass클래스의 선언(prototype)이 있습니다. MyClass.cpp 파일에는 클래스의 멤버함수에 대한 정의가 있습니다. main.cpp에 Myclass 의 선언과 정이가 모두 들어가도 상관없습니다. 하지..

프로그래밍/cpp 2014.05.13

포인터와 레퍼런스,포인터의 레퍼런스,이중포인터 C++

포인터와 비슷한 개념이 레퍼런스입니다. 레퍼런스의 뜻은 이미 아시다시피 참조를 말하며, 컴퓨터공학에서 reference는 다양한 뜻을 내포하지만 오늘 설명할 개념은 C++에서 포인터와 비슷한 기능을 가진 레퍼런스와 포인터에 관해서 글을 작성합니다. 포인터는 변수의 주소값을 담는 그릇이라 생각하면, 레퍼런스는 변수의 또다른 이름을 나타냅니다. 이 둘은 각각 용량에 대한 특성을 가집니다. 포인터는 가리키는 타입에 상관없이 32비트 운영체제에서 32비트 즉 4바이트입니다. 주소값을 담기 때문에 주소만큼의 용량이죠. 모든 주소값은 같은 운영체제에서는 같을 수 밖에 없겠죠. 그럼 레퍼런스의 경우는 어떨까요? 별명이다. 용량이 없기 때문에 포인터보다 빠르다..등등 여러가지 설명이 많이 있습니다. 다 맞는 말이지만,..

프로그래밍/cpp 2014.05.11

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

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

프로그래밍/cpp 2014.05.01

C++ 디자인 패턴 1. Strategy pattern(스트래티지 패턴), 2. Observer pattern(옵저버 패턴)

참고자료: Head First Design patterns Strategy pattern(스트래티지 패턴)이란? 알고리즘군을 각각 캡슐화한다. 그리고 각각의 알고리즘을 상황에 맞게 교환할 수 있도록 한다. 알고리즘은 알고리즘을 사용하는 클라이언트의 코드변화 없이 사용이 가능하다. 2014/04/22 - [관심사/도서] - head first design patterns(객체지향 디자인 패턴) 서적(책) 주인공이 있고 주인공이 상황에 맞게 무기를 바꿔 사용하길 원합니다. 이럴 때 스트래티지 패턴이 유용합니다. 다음의 코드는 C++로 작성하였고 위 책을 참고했지만, 코드는 독립적입니다. 코드는 패턴의 형식을 이해하기 위한 최소의 형태로 만들었습니다. 자료는 최소한의 테스트 후 오류가 없는 자료를 올리지만, ..

반응형