프로그래밍

116

C++ 이름공간(Namespace)과 using

C++ 표준은 이름 사용 범위를 더 잘 제어할 수 있도록 '이름공간'이라는 기능을 제공합니다. 최신의 이름공간을 배우기 전에, C++가 이미 가지고 있었던 이름 공간 기능을 간단하게 설명해보겠습니다. 구식 이름 공간 선언 영역(declarative region) 선언을 할 수 있는 영역입니다. 전역 변수의 선언 영역은 선언된 파일이고 지역변수의 선언 영역은 선언된 블록입니다. 잠재 사용 범위(potential scope) 선언한 지점부터 선언 영역의 끝까지를 잠재 사용 범위라고 말합니다. 잠재 사용 범위는 선언 영역에 비해 좁습니다. 말 그대로 잠재 사용 범위는 해당 변수의 사용이 가능한 범위를 말합니다. 사용 범위는 해당 변수에 접근(읽기/쓰기)을 한 범위입니다. 이것은 지역변수에 대해 공부를 하셨으면..

프로그래밍/C++ 2019.09.10 Plorence

C++ 템플릿 함수 반환형 추론(decltype, auto)

타입이 무엇인가? 프로그래머가 템플릿 함수를 쓰려고 할 때 한 가지 문제점은, C++98에서 선언을 할 때에 어떤 타입을 사용해야 하는지 알아내는 방법이 항상 가능한 것은 아니라는 점입니다. template void Add(T1 a, T2 b) { ? result a + b; } 이때 result의 타입은 뭐가 되어야 하는지 알 수 없습니다. T1, T2의 타입들은 모든 타입이 올 수 있으므로 덧셈 연산으로 인해 뭐를 반환할지 알 수 없는 셈입니다. 예시 상황 #include class Integer { private: int n; public: Integer(int n = 0) { this->n = n; } Integer operator+(int n) { Integer result(this->n + n..

프로그래밍/C++ 2019.08.26 Plorence

C++ decltype 키워드(C++11)

decltype키워드 다음 내용은 C++11부터 적용된 내용이고 C++11부터 decltype이라는 키워드가 생겼습니다. decltype키워드는 주어진 이름이나 표현식의 구체적인 타입을 알려주는 키워드입니다. 사용 방법 int a = 0; decltype(a) b = a; //a와 동일한 타입의 변수 만들기 delctype(a+b) c = a+b; //a+b와 동일한 타입의 변수 만들기 컴파일러는 어떤 타입을 사용할 것인가 컴파일러는 어떤 타입을 사용할 것인지 결정하기 위해서 체크리스트를 거쳐야 합니다. decltype(expression) var; 1 만약 expression이 괄호가 없는 식별자일 경우라면 var는 식별자와 동일한 타입이 되며, const를 포함합니다. double x = 0; dou..

프로그래밍/C++ 2019.08.26 Plorence

C++ 함수 템플릿의 특수화와 구체화

특수화(specialization) 암시적 구체화, 명시적 구체화, 명시적 특수화를 모두 특수화라고 합니다. 이들의 공통점은 이들이 일반화 서술을 나타내는 함수 정의가 아니라, 모두 구체적인 데이터형을 사용하느 함수 정의를 나타낸다는 것이기 때문입니다. 함수 템플릿에서의 명시적 특수화(Explicit Specialization) 명시적 특수화(explicit specialization)라는 특수화된 함수 정의를, 필요한 코드와 함께 제공될 수 있습니다. 컴파일러가 함수 호출에 정확히 대응하는 특수화된 정의를 발견하게 되면 템플릿을 찾지 않고 그 정의를 사용합니다. 명시적 특수화를 사용하는 이유는 특정 형식(데이터형)에 대한 범위를 줄여 특별한 동작을 하기 위해서입니다. 만약 매개변수가 int형일경우 다른..

프로그래밍/C++ 2019.08.22 Plorence

C++ 함수 템플릿(Function Template)

함수 템플릿(Function Template) 최신 C++ 컴파일러들은 가장 최근에 추가된 기능인 함수 템플릿을 구현합니다. 함수 템플릿은 int형이나 double형과 같은 구체적인 데이터형을 포괄할 수 있는 일반형(generic type)으로 함수를 정의합니다. 어떤 데이터형을 템플릿에 매개변수로 전달하면, 컴파일러가 그 데이터형에 맞는 함수를 생성합니다. 함수 템플릿 : 함수를 만들기 위한 템플릿 (정의를 말함) 템플릿 함수 : 템플릿으로부터 만들어지는 함수 (생성된 함수를 말함) 해당 용어에 대해 좀 더 자세히 알고 싶다면(https://sks3297.tistory.com/entry/C-%ED%95%A8%EC%88%98%ED%85%9C%ED%94%8C%EB%A6%BF%EA%B3%BC-%ED%85%9..

프로그래밍/C++ 2019.08.22 Plorence

C++ 함수 오버로딩(Function Overloading)

함수 오버로딩(Function Overloading) 함수 오버로딩도 디폴트 매개변수와 마찬가지로 C++에 새로 추가된 기능입니다. 디폴트 매개변수는 개수를 다르게 사용함으로써 같은 함수를 호출할 수 있게 합니다. 반면 함수 오버로딩은 서로 다른 여러 개의 함수가 하나의 이름을 공유하는 것입니다. 함수 오버로딩은 OOP 다형성의 구현입니다. 함수 오버로딩의 핵심은 함수의 매개변수 리스트, 함수 시그니처(function signature)입니다. 함수 시그니처란 매개변수 개수, 데이터형, 순서에 대한 것입니다. 이때 반환형은 상관없습니다. #include int func1(int num1 , int num2) { return num1 + num2; } int func2(int num1, int num2) ..

프로그래밍/C++ 2019.08.19 Plorence

C++ 디폴트 매개변수(Default Parameter)

디폴트 매개변수(Default Parameter) 디폴트 매개변수는 C++에서 새로 추가된 내용입니다. 디폴트 매개변수는 함수 호출에서 실제 매개변수를 생략했을 경우에 실제 매개변수 대신 사용되는 값입니다. #include int func(int num1 = 1, int num2 = 2) { return num1 + num2; } int main(void) { int result = func(); int result1 = func(1, 2); } func()라는 함수는 매개변수 num1와 num2를 더해서 리턴하는 함수입니다. 첫 번째 함수 호출 후 리턴 값(변수 result의 값)은 3이고 두 번째 함수 호출 후 리턴 값도 동일하게 3입니다. 디폴트 매개변수는 말그대로 '디폴트'입니다. 함수호출을 하는..

프로그래밍/C++ 2019.08.17 Plorence

C++ 함수에 전달하는 값을 설명할 때 헷갈리는 점

문득 어제 게시글을 작성하다가, 이런 생각이 들었습니다. 그때 "첫 번째 인자로 100을 넘겨주고.."를 작성하다가 "parameter와 argument는 다른 건데 인자가 아닌 것 같은데?"라는 생각이 문득 들었습니다. 인자와 같이 따라다니는 놈이 있는데, 그게 바로 인수입니다. 인자 인자는 매개변수를 뜻합니다. C++ 기초 플러스에서는 아래와 같이 서술되어 있습니다. "전달되는 값을 넘겨받는 데 쓰이는 변수를 형식 매개변수(formal parameter)라고 한다." void function(int a,int b){ } a, b가 인자인겁니다. 인수 전달하는 값을 뜻하는데, C++ 기초 플러스에서는 아래와 같이 서술되어 있습니다. "함수에 전달되는 값을 실제 매개변수(actual argument)라 ..

프로그래밍/C++ 2019.08.16 Plorence

C++ 참조 변수

먼저 참조란? 참조(reference)는 미리 정의된 어떤 변수의 실제 이름 대신 쓸 수 있는 대용 이름입니다. A을 B변수의 참조로 만들면, A와 B는 같은 변수를 나타내는 것으로 사용할 수 있습니다. 참조의 주된 용도는 힘수의 매개변수에서 사용합니다. 참조를 매개변수로 사용하면 복사본이 아닌 원본 데이터를 가지고 작업을 합니다. 크기가 큰 구조체를 처리해야 하는 함수에서 포인터 대신에 참조를 사용할 수 있습니다. 참조 선언은 '&'기호로 합니다.(C, C++에서 변수의 주소를 나타내기 위해 &사용한다. C++에서는 하나의 의미를 더 추가한 것이다.) ※C에서는 참조 선언을 못한다. 참조 변수 선언 하기 int A = 10; int & B = A; //이때 B는 참조변수이다 간단한 사용법입니다. 이때 ..

프로그래밍/C++ 2019.08.15 Plorence

C++ 일반 함수와 인라인 함수의 차이(어셈블리로 확인하기)

전에 작성한 게시글(https://plorence.kr/482)에서 일부 내용을 가져왔습니다. 일반적인 함수는 아래와 같이 동작합니다. 함수 호출 명령 도달 함수 호출 명령 다음에 있는 명령 주소를 메모리에 저장 스택에 매개변수 복사후 함수가 시작되는 메모리 위치로 점프 코드 수행 리턴값을 레지스터에 복사 후 저장해뒀던 명령 주소로 돌아옴 인라인 함수와 일반 함수의 차이를 확인하기 위해 프로젝트 설정하기 VS2017 기준입니다. 프로젝트 속성 -> C++ -> 최적화로 들어가서 Ob1이나 Ob2를 선택하고 적용 -> 확인을 클릭합니다. 옵션은 MS docs에서 확인하실 수 있습니다. ( https://docs.microsoft.com/ko-kr/cpp/build/reference/ob-inline-fun..

프로그래밍/C++ 2019.08.13 Plorence

C++ 인라인 함수

인라인 함수의 탄생 프로그램의 실행 속도를 높이기 위해 C++에서 보강되었습니다. 일반 함수와의 차이점을 알려면 일반적인 함수의 호출을 알아야 합니다. 일반적인 함수의 호출:프로그램을 함수의 주소로 점프시켰다가 함수가 끝나면 원래의 자리로 돌아옵니다. 좀 더 자세하게 설명하면 함수 호출 명령 도달 함수 호출 명령 다음에 있는 명령주소를 메모리에 저장 스택에 매개변수 복사후 함수가 시작되는 메모리 위치로 점프 코드 수행 리턴값을 레지스터에 복사 후 저장해뒀던 명령 주소로 돌아옴 ※이 때문에 시간이 많이 걸림(점프 수행, 점프할 위치 기억) 인라인 함수의 특징 함수호출을 그에 대한 함수 코드로 대체합니다. 위의 사진처럼 인라인 함수 호출부분이 함수 코드로 대체가 됩니다. 그래서 점프할 위치 기억, 점프 수행..

프로그래밍/C++ 2019.08.09 Plorence

C언어의 기본적인 강좌?를 마치며..

중간에 글을 정리하는 방법도 여러 번 바꿨는데, 그냥 지금이 제일 무난한 듯 싶습니다. 하다가 안하다가 해서 긴 시간이 걸렸지만 C++에서는 꾸준히 올리도록 하겠습니다. register 키워드 같은 건 안썼지만 레퍼런스 참고하셔도 충분합니다. C99부터 많이 생겨났지만 어차피 전 C++을 쓰기에 안올릴겁니다. https://en.cppreference.com/w/c/keyword C keywords - cppreference.com This is a list of reserved keywords in C. Since they are used by the language, these keywords are not available for re-definition. The most common keyword..

프로그래밍/C 2019.05.29 Plorence