템플릿 매개변수 이전에 포스팅한 Grid에 저장될 타입 하나에 대해서만 템플릿 매개변수를 지정했다.클래스 템플릿에 지정할 때 매개변수 리스트는 다음과 같이 꺽쇠괄호 안에 나열한다.template 여기서 매개변수 리스트를 지정하는 방식은함수나 메서드의 매개변수 리스트를 지정하는 방식과 비슷하다.함수나 메서드처럼 클래스 템플릿의 매개변수도 원하는 만큼 지정할 수 있다.이때 매개변수 자리에 타입 대신 디폴트 값을 지정해도 된다. 프로그래밍 언어/C & C++ 정리 2025.06.23
템플릿 코드를 여러 파일로 나누기 템플릿 코드를 여러 파일로 나누기컴파일러는 소스 파일을 컴파일하는 과정에서 클래스 템플릿과 메서드를 사용하는 부분이 나올때마다,이에 대한 정의 코드를 반드시 참조해야 한다.C++에서는 이를 위해 다음과 같은 메커니즘을 제공한다.1. 클래스 템플릿 정의에 메서드 정의 함께 적기메서드 정의 코드를 템플릿을 정의하는 모듈 인터페이스 파일에 직접 작성할 수 있다.이렇게 했을 때,템플릿을 사용하는 다른 소스 파일에서 이 모듈을 임포트하게 되면,컴파일러는 이에 관련된 모든 코드를 참조하게 된다.앞서 포스팅한 Grid클래스 예제가 바로 이렇게 처리된다.2. 메서드 정의를 다른 파일에 적기또 다른 방법은 클래스 템플릿의 메서드 정의 코드를 다른 모듈 인터페이스 파티션 파일에 적는 것이다.그러면 이 클래스 템플릿 정의를.. 프로그래밍 언어/C & C++ 정리 2025.06.22
템플릿에 사용할 타입의 요건 템플릿에 사용할 타입의 요건타입에 독립적인 코드를 작성하려면 여기에 적용할 타입에 대해 어느정도 고려해야 한다.예를 들어 Grid 템플릿을 작성할 때 T에 지정한 타입 원소는 언제든지 소멸될 수 있고,복제 / 이동 대입할 수 있다고 간주한다.어떤 클래스 템플릿을 인스턴스화할 때 그 템플릿에 있는 연산을 모두 지원하지 않으면 컴파일 에러가 발생하며,출력되는 에러 메시지도 이해하기 힘들게 표현된다.하지만 인스턴스화할 타입이 클래스 템플릿의 모든 메서드에서 사용되는 연산을 완전히 지원하지 않더라도 앞서 포스팅한 선택적 인스턴스화를 이용하여 특정 메서드만 사용하게 만드는 식으로 처리할 수 있다.C++20부터 콘셉트(concepts)라는 기능이 추가되었는데, 이를 이용하면 템플릿 매개변수에 대한 요구사항을 컴파일.. 프로그래밍 언어/C & C++ 정리 2025.06.20
템플릿 선택적 인스턴스화, 명시적 인스턴스화 컴파일러는 다음과 같은 암묵적인 클래스 탬플릿 인스턴스화 (implicit class template instantiation) 코드를 보면 그 클래스 템플릿에 있는 가상 메서드에 대한 코드를 생성한다. 하지만 virtual로 선언하지 않은 메서드는 코드에서 실제로 호출하는 것만 컴파일 한다.예를 들어 Grid 클래스 템플릿을 이용하는 코드를 다음과 같이 main() 함수에만 사용한다고 하자.Grid myIntGrid;myIntGrid.at(0, 0) = 10;그러면 컴파일러는 int 버전의 Grid에서 제로 인수 생성자(zero argument constractor = 영인수 생성자), 소멸자, 비 const at() 메서드만 컴파일하고, 복제 생성자나 대입 연산자 등에 대한 코드는 생성하지 않는다.이.. 프로그래밍 언어/C & C++ 정리 2025.06.18
생성자에 의한 템플릿 인자 유추 과정 CTAD란?컴파일러는 CTAD( class Template Arguement Deduction = 템플릿 클래스 인수 추론 )을 이용하여 템플릿 생성자에 전달된 인수를 보고 매개변수를 유추한다.함수 템플릿은 항상 전달된 인수를 보고 템플릿 매개변수를 알아서 결정한다.그런데 클래스 템플릿 인수 추론(=CTAD)를 이용하면 핼퍼 함수 템플릿이 필요 없다.생성자에 전달된 인수를 보고 템플릿 매개변수를 알아내기 때문이다.추론 기능 사용 요건물론 이런 추론 기능은 다음과 같은 사용 요건을 필요로 한다.1. 클래스 템플릿에 매개변수 디폴트 값을 모두 지정 했거나2. 생성자에서 모든 매개변수를 사용하도록 작성된 경우위의 두 가지 경우에만 적용된딘.번외 : 사용자 정의 유추 방식템플릿 매개변수를 사용자가 직접 지정할 .. 프로그래밍 언어/C & C++ 정리 2025.06.12
T{} 영초기화 구문과 템플릿화 // 예시 코드template void Grid::veryfyCoordinate(size_t x, size_t y){ if(x >= m_width) { throw std::out_of_range { std::format("{} must br less than {}", x, m_width); } } if(y >= m_height) { throw std::out_of_range { std::format("{} must br less than {}", y, m_height); } }}클래스 템플릿 메서드 구현 코드를 작성할 때특정한 템플릿 타입 매개변수를 T에 대하여 디폴트 값을 지정하려면,T{}와 같은 문법에 .. 프로그래밍 언어/C & C++ 정리 2025.06.10
마이크로 소프트에서 사용되는 _CLRCALL_OR_CDECL _CLRCALL_OR_CDECL 는 으래 C++에서 쓰이는 endl을 타고 들어가면 볼 수 있는 매크로이다. enld을 타고 들어가면 다음과 같은 코드를 볼 수 있는데, 해당 코드에서 사용되는 basic_ostream의 클래스 크기는 1바이트이다.아마 c의 _Alignof나 C++의 alignof(T) 또는 alignas를 사용한 것 같다. alignas의 예시 alignas를 사용하지 않고 클래스 패딩 규칙에 따른 메모리 할당 크기 alignas를 사용하여 메모리 할당 크기를 사용자가 임의로 지정해 준 코드 해당 코드 전문class a{ int v[4];};// V의 메모리 풀 즉, 패딩을 내가 조절하는 것// alignas를 사용하면// V의 할당 될 메모리를 비트 단위로 내가 할당해.. 프로그래밍 언어/C & C++ 정리 2025.05.07
Static 링크 :외부 링크와 내부 링크 static링크를 설명하기 전에 먼저C++에서 링크를 처리하는 과정을 이해할 필요가 있다.C++ 코드는 소스 파일 단위로 컴파일해서생성된 객체 파일을 링크 단계에서 서로 연결한다.함수나 글로벌(전역) 변수처럼C++ 소스 파일마다,정의된 이름은 외부 링크나 내부 링크를 통해 서로 연결된다.외부 링크외부 링크로 연결되면 다른 소스 파일에서 이름을 사용할 수 있다.내부 링크(= 정적 링크)내부 링크(=정적 링크)로 연결되면같은 파일에서만 사용할 수 있다.함수나 글로벌 변수는 기본적으로 외부 링크가 적용된다.하지만 선언문 앞에 static키워드가 붙이면내부 링크(=정적 링크)가 적용된다.익명 네임스페이스를 이용하여 내부 링크 적용앞서 말했듯이 내부 링크로 연결되면 같은 파일 내에서만 사용 가능하다고 했다.이는 .. 프로그래밍 언어/C & C++ 정리 2025.04.30
순수 가상 메서드와 추상 베이스 클래스 순수 가상 메서드란 클래스 정의 코드에서명시적으로 정의하지 않는 메서드이다.메서드를 순수 가상 메서드로 만들면,컴파일러는 이 메서드에 대한 정의가 현재 클래스에는 없다고 판단한다.순수 가상 메서드가 하나라도 정의된 클래스를 추상 클래스라 부른다.추상 클래스는 다른 코드에서 인스턴스를 생성할 수 없다.클래스에 순수 가상 메서드가 하나라도 있으면컴파일러는 이 클래스가 객체를 생성하는데 사용되지 않는다고 생각한다.순수 가상 메서드를 지정하려면 선언 뒤에 =0 을 붙인다.그리고 구현 코드는 작성하지 않는다. 프로그래밍 언어/C & C++ 정리 2025.04.18
virtual 키워드 메서드 virtual 메서드 동작방식override하지 않고 상속 관계의 자식클래스가같은 이름의 함수를 정의하면,각각의 동일한 이름의 함수가 재정의되지 않고 개별적으로 존재한다.이처럼 메서드를 가리는 일을 방지하려면virtual 키워드가 내부적으로 처리되는 과정을 이해할 필요가 있다.C++에서 클래스를 컴파일하면그 클래스에 있는 메서드를 모두 담은 바이너리 객체가 생성된다.그런데 컴파일러는 virtual로 선언하지 않은 메서드를 호출하는 부분을 컴파일 시간에 결정된 타입의 코드로 교체한다.이를 정적 바인딩 또는 이른 바인딩이라 부른다.메서드를 virtual로 선언하면vtalble(가상 테이블)이라 부르는 특수 메모리 영역을 활용해서가장 적합한 구현 코드를 호출한다.virtual 메서드가 하나라도 정의된 클래스에.. 프로그래밍 언어/C & C++ 정리 2025.04.16