프로그래밍 언어/C & C++ 정리 59

모던 C++ 함수형 프로그래밍 auto

auto 키워드 auto 키워드로 데이터 타입을 자동으로 정의하기 위해서는 일단, 모던 C++ 이전에 auto 키워드는 변수가 자동 지속 기간(automatic storage duration)을 가져야 함을 명시적으로 나타내기 위해 사용했다는 것을 알아두자. ++ 이전의 C++과 비교하면 모던 C++에서는 어떤 것이 달라졌는지, 사실 많은 변화가 있었음은 알지만 그럼에도 불구하고 필자는 해당 기능들을 잘 알지 못한다. 때문에 게시글과 같이 성장하고자 매일 C++에 관련된 포스팅을 하고자 함을 기반으로 작성된 게시글이기에 필자의 학습을 초점에 맞춰 작성되기 때문에, 독자 위주의 게시글 이라기 보다는 필자의 독서 기록용 게시글임을 인지해주고 읽어주길 바란다. ++ 자동 지속 기간(automatic stora..

상황에 맞는 키워드 (Context-Sensitive Keywords)

상황에 맞는 키워드(Context-Sensitive Keywords) 상황에 맞는 키워드는 오직 특정 문맥에서만 인식할 수 있는 언어 요소이다. 특정 맥락을 벗어나면, 상황에 맞는 키워드는 유저가 정의하는 기호가 될 수 있다. ( = Context-sensitive keywords are language elements that are recognized only in specific contexts. Outside the specific context, a context-sensitive keyword can be a user-defined symbol.) 키워드 목록 abstract delegate event finally for each, in initonly internal literal over..

C++/ CX 와 C++/ CLI 의 차이

C++/ CX(C++ component extensions, c++ 컴포넌트 확장) C++/ CX(C++ component extensions, c++ 컴포넌트 확장)는 마이크로 소프트가 window phone8 과 window 8과 같은 새로운 윈도 런타임을 지원하기 위해 고안한, C++를 확장한 언어 규격이다. 문법이 C++/CLI과 유사하지만, 컴파일한 결과물은 C++/CLI의 Managed Code가 아닌 Native Code이다. 현재 Visual studio 12이상에서 사용 가능하다. C++/CLI(C++/ 공통 언어 기반) C++/CLI(C++/ 공통 언어 기반)은 Managed Extensions for C++ 대신 사용하기위해 고안된 마이크로 소프트사의 언어 규격이다. 예전의 Manag..

C++ 오류 처리

오류처리 C++에서, 프로그램의 예기치 않은 행동을 처리하는 수단은 크게 두 가지이다. 하나는 단언 (assertion)이고 다른 하나는 예외(exception)이다. 전자는 프로그래밍의 실수를 검출하기 위한 것이고, 후자는 프로그램이 더 이상 정상적으로 실행될 수 없을 정도의 어떤 예외적인 상황을 방지하기 위한 것이다. 사실 이 둘의 구분이 항상 명확하지는 않다. 해더 헤더의 assert 매크로는 C에서 물려받은 것이지만 여전히 유용하다. 이 매크로는 주어진 표현식을 평가해서, 만일 결과가 false이면 즉시 프로그램을 종료한다. 이 매크로는 프로그래밍 실수를 검출하는 데 사용해야 한다. 예를 들어 음이 아닌 실수의 제곱근을 계산하는 어떤 알고리즘을 구현한다고 가정했을 때, 수학에서 음수가 아닌 수의 ..

effective c++

TR1 TR1 C++ 표준 라이브러리에 새로 추가되는 기능들에 대한 명세이다. 새로 추가된 기능들은 클래스 및 함수 템플릿이 주류인데, 해시 테이블, 참조 카운팅 방식 스마트 포인터, 정규 표현식 등이다. TR1의 모든 구성요소는 tr1 네임스페이스에 들어 있고, tr1 네임스페이스는 std 네임스페이스 안에 중첩되어 있다. Boost C++ 라이브러리를 제공하는 단체로 TR1의 구성요소 대부분이 이곳에서 만들어졌다. TR외의 유익한 많은 것들을 참고할 수 있다. http://boost/org C++의 구성 방식과 규칙 C++는 다중패러다임 프로그래밍 언어로 절차적 프로그래밍을 기본으로 객체 지향, 함수식, 일반화 프로그래밍을 포함하여 메타프로그래밍 개념까지 지원한다. C++을 구성하는 하위 언어 C언어..

<memory> smart pointer

smart pointer 스마트 포인터는 헤더 파일의 std namespace에 정의된다. smart pointer는 포인터처럼 행동하는 클래스 객체이지만, 몇 가지 추가 기능을 지닌다. 이번 게시물에서는 예시를 통해 동적 메모리 대입을 관리하기 위한 스마트 포인터 템플릿에 대하여 알아볼 것이다. 가령 어떠한 함수가 원시 포인터를 사용한다고 가정하면, 마지막에 delete 구문을 빼먹었거나, 혹은 delete 구문 전에 오류가 나면 대입된 메모리가 해제되지 못한다. 지역 변수는 스택 메모리부터 삭제된다. 그래서 포인터가 차지하고 있던 메모리가 해제되고 이때, 포인터가 지시하는 메모리도 함께 해제된다면 좋을 것이다. 이러한 과정을 거치기 위해서는 포인터의 수명이 다했을 때 프로그램이 어떤 추가 조치를 취해..

volatile

volatile 란? 하드웨어에 의해 프로그램에서 수정할 수 있는 개체를 선언하는 데 사용할 수 있는 형식 한정자이다. volatile declarator; 일반적으로 volatile은 컴파일러 최적화를 제한하는 용도로 사용한다. 컴파일러는 훌륭하게 최적화하지만, volatile를 사용해서 최적화를 제한해야 하는 상황이 있다. 즉, volatile int t 구문은 변수 t의 값은 프로그램을 수행하는 어느 순간에나 외적인 요인에 의해 값이 변할 수 있음을 컴파일러에게 알려 주어, 컴파일러가 변수 t의 값을 사용할 때 주의하도록 만든다. (주로 하드웨어를 제어하는 프로그램에서 발생하는데, 변수가 특정 하드웨어의 레지스터나 포트를 가리키는 겨웅에 사용한다) 특히 volatile로 정의된 변수는 레지스터에 할..

포인터

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

부동소수점

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

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

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