프로그래밍 언어 112

포인터

포인터 포인터란? 포인터는 개체의 메모리 주소를 저장하는 변수이다. 포인터는 세 가지 기본 목적으로 C 및 C++에서 광범위하게 사용된다. 힙에 새 개체를 할당하려면 함수를 다른 함수에 전달하려면 배열 또는 기타 데이터 구조의 요소를 반복한다 원시포인터 원시 포인터란( = raw pointer)? 원시 포인터( = raw pointer )는 스마트 포인터와 같이 캡슐화 개체에 의해 수명이 제어되지 않는 포인터다. 원시 포인터는 즉, 값에 비포인터 변수의 주소를 할당하거나 nullptr을 할당할 수 있다. 값이 할당되지 않은 포인터는 임의 데이터가 포함이 된다. 포인터를 역참조하여 포인터가 가리키는 개체의 값을 검색하는 것 또한 가능하다. 멤버 엑세스 연산자는 개체의 멤버에 대한 엑세스를 제공한다. * 역..

부동소수점

부동 소수점 C / C++ , 자바와 같은 프로그래밍 언어에는 수를 표현하기 위해 크게 두 가지 타입을 제공한다. 바로 정수 타입과 부동소수점 타입이다. 부동소수점타입과 정수타입을 나누어 놓은 이유는 매우 간단하다. 부동소수점은 실수를 완벽하게 표현할 수 없다. 사실 정수조차 제대로 표현하지 못한다. 떄문에 본래 목적의 일부분만을 나타낼 뿐이다. 부동소수점은 아주 작은 수와 아주 큰 양수를 표현하기 위해 도입되었다. 고정소수점과 부동소수점 부동소수점이란 실수를 표현할 때 소수점의 위치를 고정하지 않은 것을 말한다. 고정소수점은 나타낼수 있는 범위가 무척 한정된다. 그에 비해서 부동소수점은 고정소수점보다 훨씬 넓은 범위의 수를 표현할 수 있는 장점이 있다. 그래서 프로그래밍에서 실수를 표현할 때는 부동소수..

포인터 & 함수 포인터 & 깊은 복사 & 얕은 복사 & 생성자 & 오버로딩 & explicit & 형변환 연산자 & R-value , L-value

포인터 지금까지 변수 선언으로 메모리에 공간을 확보하고, 그곳을 데이터를 넣고 꺼내 쓰는 공간으로 사용했다. 변수명은 그러한 메모리 공간을 식별할 수 있는 이름이었다. 그러나 변수는 선언된 블록({}), 함수 내부로 사용이 제한되어 있다. 같은 변수명을 사용했다 하더라도 블록이나 함수가 다르면 별도의 저장 공간을 확보하므로 전혀 다른 변수로 사용되는 것이다. 그래서 사용 범위를 벗어난 경우도 데이터를 공유할 수 있는 새로운 방법이 포인터 개념이다. 메모리의 주소 메모리라는 것은 우리가 데이터를 넣고 꺼내 쓰는 공간으로, 그 위치를 식별할 수 있어야 한다. 프로그램은 사용하는 메모리의 위치를 주소 값으로 식별할 수 있다. 메모리의 위치를 식별하는 주소 값은 바이트 단우로 구분된다. 이 값은 0부터 시작하고..

템플릿의 특수화

암시적 구체화 암시적 구체화를 사용하는 이유는 말 그대로 암시적인 제한성 때문인데, 즉 사용하기를 원하는 데이터형을 나타내는 하나 또는 그 이상의 객체를 선언하기 때문이다. ArrayTP stuff; // 암시적 구체화 컴파일러는 객체가 요구될 때까지 그 클래스의 암시적 구체화를 생성하지 않는다. ArrayTP *pt; // 포인터, 아직 객체가 필요 없다. pt = new ArrayTP ; // 이제 객체가 요구된다. 두 번째 구문은 컴파일러에게 하나의 클래스 정의와, 그 정의에 따라 생성되는 하나의 객체를 생성하라고 지시한다. 명시적 구체화 키워드 template을 사용하여 클래스를 선언하고, 사용하려는 데이터형을 나타냈을 때, 컴파일러는 명시적 구체..

복사 생성자 & 복사 대입 연산자 & explicit & extern

explicit 키워드는 자신이 원하지 않은 형변환이 일어나지 않도록 제한하는 키워드이다. extern 키워드는 전역 변수, 함수 또는 템플릿 선언에 적용할 수 있다. extern 키워드는 컨텍스트(문맥)에 따라 네 가지 의미가 있다. 1. 전역 const 변수가 아닌 선언에서 변수 또는 함수가 다른 변환 단위에 정의되도록 지정한다. 변수가 정의된 파일을 제외한 모든 파일에 extern적용해야 한다. 2. const 변수 선언시, 변수에 extern 링크가 있음을 명시해야한다. 모든 선언된 파일에서 extern 은 반드시 선언되어야한다(Global const 변수는 기본적으로 내부 연결을 가진다.) 3. c언어에서의 extern은 한정자 또는 블록의 여러 함수 선언에 적용될 수 있다. 4. 템플릿 선언 ..

C++ STL Pair & Map

Pair Pair 란? pair 클래스는 사용자가 지정한 2개의 타입의 데이터를 저장하는 데 사용한다. 서로 연관된 2개의 데이터를 한 쌍으로 묶어서 다룰 때 사용하면 편리하다. 만약 pair 클래스를 사용하지 않고 코드를 짜야 한다면, 서로 연관된 2개의 데이터를 다룰 때, 구조체를 따로 정의해야 한다. 여간 번거로운 일이 아니기에 pair 클래스를 이용함으로써 서로 다른 2개의 연관된 2개의 데이터를 편리하게 관리가 가능하다. Pair의 헤더파일 pair 클래스는 #include 라는 헤더파일에 존재하는 STL이다. 그러나 다음 헤더파일들은 utility 헤더 파일을 포함하는 헤더 파일이다. #include // utility 헤더파일이 포함됨. #include // utility 헤더파일이 포함됨...

C++ STL) deque란?

deque( double ended queue ) 양쪽에서 끝나는 que(큐)를 줄여서 '데크'라고 불린다. stack의 경우엔 최상단에서 삽입, 삭제가 일어나지만, queue같은 경우는 한쪽에서 삽입, 반대쪽에서 삭제가 일어난다. (한쪽 입구에서 삽입, 삭제 중 하의 기능만 가능) deque 의 클래스는 선형 배열로 지정된 형식의 요소를 정렬하고 벡터와 같이 모든 요소에 대한 빠른 임의 액세스를 허용하고 컨테이너 뒷면에서 효율적인 삽입 및 삭제를 허용하는 시퀀스 컨테이너의 클래스 템플릿이다. 이러한 특성은 스택과 큐를 합친 기능으로 모든 입구에서 삽입 삭제가 가능하다. 구조 stack의 경우엔 LIFO(Last In First Out) deck의 경우엔 FIFO(First In First Out) de..

OBB 충돌

OBB 충돌 체크 알고리즘 설명이다. 이 설명은 벡터를 다룬다. 벡터와 벡터의 내적을 모르면 이해하기가 어려울 수 있다. AABB와 OBB는 직사각형 모양의 Bounding Box를 이용해 객체들이 충돌했는지를 판단한다. AABB는 Axis Aligned Bounding Box의 약자로, 축 방향으로 정렬된 경계 경계 상자(Bounding Box)를 뜻한다. 2차원으로 생각했을 때, 모든 변이 x, y 축에 평행한 직사각형을 경계 상자로 정해 충돌 체크를 한다. 반면, OBB는 Oriented Bounding Box의 약자로, 방향성이 있는 경계 상자(Bounding Box)를 뜻합니다. 2차원으로 생각했을 때, 회전이 있는 (회전이 된) 도형을 경계 상자로 정해 충돌 체크를 합니다. (이 글에서는 2차..

생성자를 통한 자동 형변환, 변환 함수

생성자를 통한 자동 형변환 생성자를 자동 데이터형 변환 함수로 동작하게 하는 것은 멋진 기능처럼 보이지만, 프로그래머들이 C++를 많이 경험하게 되면, 자동 데이터형 변환이 항상 바람직한 것은 아니라는 것을 알게 된다. 되려 예상치도 못한 부작용을 일으킬 수도 있다는 프로그래머들은 알게 될 경우도 있다. 그래서, 최신 C++ 시스템에는 자동 데이터형 변환을 못하게 하는 explicit라는 새로운 키워드가 추가되었다. explicit Stonewt (double lbs);// 암시적 데이터형 변환을 허용하지 않는다. 위 예제와 같이 생성자에 explicit 앞의 예와 같은 암시적 데이터형 변환을 못하게 막는다. 그러나 다음과 같은 명시적 데이터형 강제 변환은 여전히 허용한다. 즉 explicit 는 암시적..

분할 컴파일

헤더 파일과 cpp 파일을 구분해놓지 않으면 여러모로 번거로운 일이 생긴다. 예를 들어서, 두 개의 지원 함수를 하나의 별도의 파일에 넣었다고 가정한다면, 양쪽 파일에 있는 그 함수 모두 그 구조체 선언을 사용하기 때문이며, 일일이 번거롭게 그것들을 직접 타이핑하면 실수를 저지를 위험도 있을 뿐만 아니라, 변경할 일이 생기면 둘 다 변경해 주어야 한다. 쉽게 말해서, 하나의 프로그램을 여러 파일에 펼칠 때에는 새로운 문제가 발생한다. 그러므로 원본 프로그램을 다음 과 같이 세 부분으로 분할할 수 있다. 분할 기준은 다음과 같다. 구조체 선언과, 그 구조체를 사용하는 함수들의 원형이 들어 있는 헤더 파일 = .h 그 구조체에 관련된 함수들의 코드가 들어 있는 소스 코드 파일 = .cpp 그 구조체에 관련된..