프로그래밍 언어 112

생성자에 의한 템플릿 인자 유추 과정

CTAD란?컴파일러는 CTAD( class Template Arguement Deduction = 템플릿 클래스 인수 추론 )을 이용하여 템플릿 생성자에 전달된 인수를 보고 매개변수를 유추한다.함수 템플릿은 항상 전달된 인수를 보고 템플릿 매개변수를 알아서 결정한다.그런데 클래스 템플릿 인수 추론(=CTAD)를 이용하면 핼퍼 함수 템플릿이 필요 없다.생성자에 전달된 인수를 보고 템플릿 매개변수를 알아내기 때문이다.추론 기능 사용 요건물론 이런 추론 기능은 다음과 같은 사용 요건을 필요로 한다.1. 클래스 템플릿에 매개변수 디폴트 값을 모두 지정 했거나2. 생성자에서 모든 매개변수를 사용하도록 작성된 경우위의 두 가지 경우에만 적용된딘.번외 : 사용자 정의 유추 방식템플릿 매개변수를 사용자가 직접 지정할 ..

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{}와 같은 문법에 ..

박싱 언박싱

박싱과 언박싱을 이해하려면 참조 타입과 값 타입에 대한 정의가 필요하다. 값 타입(Value Type) 값 타입의 정의값 타입은 변수 자체에 데이터 값을 직접 저장하는 타입이다.이러한 변수는 스택(stack)메모리에 할당되며, 복사 시 실제 데이터 값이 복사된다. 값 형식의 변수는 해당 형식의 인스턴스를 포함한다.이는 해당 형식의 인스턴스에 대한 참조를 포함하는 참조 형식의 변수와 다르다.기본적으로 할당, 메서드에 인수 전달, 메서드 결과 반환 시 변수 값이 복사된다.값 형식 변수의 경우 해당 형식 인스턴스가 복사된다. Value types and reference types are the two main categories of C# types. A variable of a value type con..

.NET 과 C#의 아키텍처

C# 보다 .NET을 먼저 알고가자.C#은 단독으로 실행되지 않고,.NET 런타임 환경(ex. CLR, CoreCLR) 위에서 실행된다..NET C#, F#, VB 등 여러 언어를 지원하는 공통 플랫폼이며공통된 기능, API, 런타임 동작을 제공한다.따라서 C#의 코드 구조, 빌드, 실행 방식은 .NET의 구조와 깊이 관련되어 있다.공식문서 참고 내" .NET is a free, cross-platform, open-source developer platform for building many kinds of applications. It can run programs written in multiple languages, with C# being the most popular. It relies on ..

IEnumerator<T> 인터페이스

IEnumerator는 제네릭 컬렉션(List, HashSet 등)에서 데이터를하나씩 차례대로 읽을 수 있도록 반복 기능을 제공하는 인터페이스이다. C#의 IEnumerator의 정의이다.public interface IEnumerator : IDisposable, System.Collections.IEnumerator IEnumerator는 다음 두 인터페이스를 포함IEnumerator: 일반 반복자 (비제네릭)IDisposable: 자원을 정리하는 기능 간단히 비유하자면,Interface는 설계도이고,IEnumerator는 반복할 수 있는 객체를 만드는 설계도이다. 여기서 설계도라도 말하는 이유는 어떤 자료형이든 받을 수 있는 것이기 때문이다.이는 제네릭 프로그래밍을 기반으로 작성되었기 때문이다. ..

마이크로 소프트에서 사용되는 _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의 할당 될 메모리를 비트 단위로 내가 할당해..

Static 링크 :외부 링크와 내부 링크

static링크를 설명하기 전에 먼저C++에서 링크를 처리하는 과정을 이해할 필요가 있다.C++ 코드는 소스 파일 단위로 컴파일해서생성된 객체 파일을 링크 단계에서 서로 연결한다.함수나 글로벌(전역) 변수처럼C++ 소스 파일마다,정의된 이름은 외부 링크나 내부 링크를 통해 서로 연결된다.외부 링크외부 링크로 연결되면 다른 소스 파일에서 이름을 사용할 수 있다.내부 링크(= 정적 링크)내부 링크(=정적 링크)로 연결되면같은 파일에서만 사용할 수 있다.함수나 글로벌 변수는 기본적으로 외부 링크가 적용된다.하지만 선언문 앞에 static키워드가 붙이면내부 링크(=정적 링크)가 적용된다.익명 네임스페이스를 이용하여 내부 링크 적용앞서 말했듯이 내부 링크로 연결되면 같은 파일 내에서만 사용 가능하다고 했다.이는 ..

순수 가상 메서드와 추상 베이스 클래스

순수 가상 메서드란 클래스 정의 코드에서명시적으로 정의하지 않는 메서드이다.메서드를 순수 가상 메서드로 만들면,컴파일러는 이 메서드에 대한 정의가 현재 클래스에는 없다고 판단한다.순수 가상 메서드가 하나라도 정의된 클래스를 추상 클래스라 부른다.추상 클래스는 다른 코드에서 인스턴스를 생성할 수 없다.클래스에 순수 가상 메서드가 하나라도 있으면컴파일러는 이 클래스가 객체를 생성하는데 사용되지 않는다고 생각한다.순수 가상 메서드를 지정하려면 선언 뒤에 =0 을 붙인다.그리고 구현 코드는 작성하지 않는다.

virtual 키워드 메서드

virtual 메서드 동작방식override하지 않고 상속 관계의 자식클래스가같은 이름의 함수를 정의하면,각각의 동일한 이름의 함수가 재정의되지 않고 개별적으로 존재한다.이처럼 메서드를 가리는 일을 방지하려면virtual 키워드가 내부적으로 처리되는 과정을 이해할 필요가 있다.C++에서 클래스를 컴파일하면그 클래스에 있는 메서드를 모두 담은 바이너리 객체가 생성된다.그런데 컴파일러는 virtual로 선언하지 않은 메서드를 호출하는 부분을 컴파일 시간에 결정된 타입의 코드로 교체한다.이를 정적 바인딩 또는 이른 바인딩이라 부른다.메서드를 virtual로 선언하면vtalble(가상 테이블)이라 부르는 특수 메모리 영역을 활용해서가장 적합한 구현 코드를 호출한다.virtual 메서드가 하나라도 정의된 클래스에..

상속을 이용한 클래스 구현

클래스에 상속이 없다면 구조체에 동작만 추가한 것에 불과하다.그것만으로도 절차형 언어에 비하면 놀라운 발전이지만,상속은 새로운 차원의 기능이 추가된 것이다.상속을 활용하면 기존 클래스를 바탕으로새 클래스를 정의할 수 있다.따라서 클래스는 재사용하거나 확장 가능한 컴포넌트인 것이다.상속의 강력함을 최대한 잘 활용하기 위해서는상속에 관련된 구체적인 문법 뿐만 아니라상속을 최대한 활용하기 위해서는 상속과 관련된 고급 테크닉까지 알아야한다.상속을 이용한 클래스 구현현실에서 존재하는 대상의 대부분은 계층 구조를 가진다.프로그래밍에서도 이와 마찬가지로클래스를 수정하거나 다른 클래스를 바탕으로새 클래스를 정의할 때 이러한 관계를 분명히 볼 수 있다.코드에서 이러한 관계를 다루는 한 가지 방법은기존 클래스를 복사하여 ..