전문가를 위한 C++37 2025/03/23 ch.13 C++ I/O 심층 분석 출력 스트림에서 제공하는 메서드출력 스트림에서 가장 대표적인 연산자는 put() write()저수준 출력 메서드 - 출력 동작을 갖춘 객체나 변수를 인수로 받지 않고, 문자 하나를 받거나(put) 문자 배열 하나를 인수로 받는다(write) const char* test { "hello there\n" }; cout.write(test, strlen(test)); cout.put('a'); flush()일반적으로 출력 스트림은 들어온 데이터를 곧바로 쓰지 않고 버퍼에 잠시 쌓아둔다 목적지가 파일과 같은 스트림일 때는 한 문자씩 처리하기보다는 블록 단위로 묶어서 처리하는 것이 훨씬 효율적임 쌓아둔 데이터를 모두 내보내서 버퍼를 비우는 조건- endl과 같은 경곗값에 도달할 때- 스트림이 스코프를 벗어나.. 2025. 3. 23. 2025/03/21 ch.13 C++ I/O 심층 분석 I/O 시스템은 유연하고 사용하기 쉬워야 한다. 파일이나 콘솔을 비롯한 다양한 디바이스에 대해 입력과 출력을 지원한다는 뜻읽고 쓸 수 있는 데이터의 타입도 다양하게 지원해야 함에러에 대처하는 기능도 제공 C++는 스트림 이라는 고급 입출력 메커니즘을 제곡I/O를 유연하고 객체지향 스타일로 처리함 13.1 스트림 사용법스트림 에 정의된 스트림 버퍼를 사용하는 스트림(버퍼 스트림)받은 데이터를 버퍼에 저장했다가 블록 단위로 목적지로 보냄버퍼를 사용하지 않는 스트림(비버퍼 스트림)데이터가 들어오자마자 목적지로 보냄 버퍼링 - 버퍼에 잠시 저장하는것파일과 같은 대상에 입출력을 수행할 때는 블록 단위로 묶어서 보내는 것이 효율적임# 버퍼를 사용하는 스트림은 flush() 메서드를 이용하여 현재 버퍼에 담긴 데이터.. 2025. 3. 21. 2025/03/18 ch.12 템플릿으로 제네릭 코드 만들기 12.3.2 클래스 템플릿의 프렌드 함수 템플릿 메인 클래스에 대한 템플릿 전방선언을 한 후friend할 템플릿 함수에 대한 템플릿 전방선언을 해줘야 한다 12.3.3 템플릿 매개변수 유추에 대한 보출 설명컴파일러는 함수 템플릿에 전달된 인수를 보고 템플릿 매개변수의 타입을 추론한다.추론할 수 없는 템플릿 매개변수는 명시적으로 지정해야 한다. template RetType add(const T1& t1, const T2& t2) { return t1 + t2; }이런 함수가 있다면 auto result { add(1, 2) }; auto result { add(1, 2) };//입력값으로 타입 추론. 리턴값만 명시해주면 된다이것도 오른쪽부터 적용되므로 RetType을 중간에 선언해주면 그 왼쪽에있는건 자.. 2025. 3. 18. 2025/03/17 ch.12 템플릿으로 제네릭 코드 만들기 12.2.4 템플릿 매개변수클래스 템플릿에 지정할 매개변수 리스트는 꺾쇠괄호 안에 나열한다.함수나 메서드처럼 클래스 템플릿의 매개변수도 원하는 만큼 지정할 수 있다.이때 매개변수 자리에 타입 대신 디폴트값을 지정해도 된다.template template //여러 타입을 받고 싶을때template //class라고 작성해도 상관 없음template //특수화. 일반적인 템플릿이 아닌 특정한 값에 대해서만 동작template //디폴트 값을 지정할 수 있다. 타입을 지정하지 않고 선언했을때// 디폴트 값으로 채워줌. 함수처럼 매개변수의 오른쪽부터 지정해야 된다는 점에 주의 1. 비타입 템플릿 매개변수비타입 메개변수 - int나 포인터처럼 함수나 메서드에서 흔히 사용하는 종류의 매개변수정수계열의 타입.. 2025. 3. 17. 2025/03/16 ch.12 템플릿으로 제네릭 코드 만들기 클래스가 베이스 클래스를 상속받은 파생 클래스 뿐만 아니라 기본 타입도 지원하려면 포인터 전달방식이 아닌 값 전달방식을 사용하는것이 유리하다.값 전달방식은 변수에 항상 어떤 값이 들어있어야 하기 때문에 완전히 빈 곳을 만들기 어렵다. 포인터 기반으로 구현하면 nullptr로 빈 공간을 만들 수 있다.하지만 optional을 이용하면 값 전달 방식을 사용하며 완전히 빈 공간을 만들 수 있다. export template //이런식으로 표현도 가능뒤에 나올 클래스 정의가 T로 지정한 특정한 타입에 적용할 수 있는 템플릿이라고 선언함수가 매개변수를 통해 값을 받는 것처럼 템플릿도 타입을 매개변수로 받는다.T에는 특별한 의미가 없으며 다른 이름으로 정해도 된다. 포인터 기반으로 클래스를 만들면 복제생성자 등등을.. 2025. 3. 16. 2025/03/15 ch.12 템플릿으로 제네릭 코드 만들기 C++는 객체지향 프로그래밍 뿐만 아니라 제네릭 프로그래밍도 지원함재사용 가능한 코드를 작성하는 것이 목적제네릭 프로그래밍을 지원하기 위한 핵심 요소는 템플릿 알고리즘(함수)을 작성할 때 특정한 값에 종속되지 않게 실행되도록 구현한다. 매개변수화객체 = 데이터와 동작을 하나로 묶은 것값에 대한 매개변수화를 확장해서 타입에 대해서도 매개변수화할 수 있게 만든것이 템플릿 12.2 클래스 템플릿멤버 변수의 타입, 메서드의 리턴 타입, 메서드의 매개변수 타입등을 매개변수로 받아서 클래스를 정의주로 객체를 저장하는 컨테이너나 데이터 구조에서 많이 사용함.클래스가 특정한 타입에 종속되지 않게 만들 수 있다.클라이언트는 이런 템플릿을 이용하여 저마다 원하는 타입에 맞게 클래스를 인스턴스화해서 사용할 수 있다.장점 -.. 2025. 3. 16. 2025/03/14 ch.11 C++의 까다롭고 유별난 부분 11.2 헤더 파일 11.2.1 중복 정의인클루드 가드를 이용하면 중복 정의를 피할 수 있다. 요즘은 #pragma once 지시자를 지원하기 때문에 저렇게 불편하게 안써도 됨 11.2.2 순환 의존클래스를 참조해야 하지만 헤더 파일을 포함할 수 없는 경우가 있다A 클래스에서 B 클래스가 필요한데 B클래스에서도 A 클래스가 필요한 경우두 클래스에 각각의 클래스를 전부 include 하면 순환 의존문제가 발생이럴 때 전방선언을 하면 된다. 11.2.3 헤더 존재 확인특정 헤더 파일이 존재하는지 확인하려면 전처리 상수 표현식__has_include("파일명") 또는 __has_include() 을 사용해야 한다.해당 헤더 파일이 존재하면 1, 그렇지 않으면 0이 된다. 11.3C++20 부터 기능 테스트 매.. 2025. 3. 14. ch. 7, 8, 9 요약정리 C++ 프로그래밍은 도로가 없는 곳을 운전하는 것과 같다- 원하는 곳으로 마음껏 갈 수 있지만 책임은 본인이져야 함성능>>>안정성 7장에서는 C++의 자유로움 안에서 특히 문제가 발생하기 쉬운 포인터에 대해서 집중적으로 다룹니다 new와 malloc()의 차이malloc()은 메모리를 동적으로 할당하는것만이 목표이므로 초기값 지정Xnew는 생성자를 자동으로 호출 malloc() 왜씀?메모리 크기를 키워야 할때, 재할당해야 할때 malloc()은 realloc() 함수로 재할당 가능new는 새로 할당->복사-> 해제 해야함# realloc()은 매우 위험하니 쓰지 맙시다 포인터에 대한 타입 캐스팅포인터는 단지 메모리 주소에 불과해서 타입을 엄격히 따지지 않는다포인터의 타입은 C 스타일 캐스팅으로 얼마든.. 2025. 3. 14. 2025/03/13 ch.10 상속 활용하기 생성자 상속과 다중 상속다중 상속과 관련된 제약사항여러 베이스 클래스에서 매개변수 목록이 독같은 생성자는 상속할 수 없다. 10.6.4 메서드 오버라이딩의 특수한 경우1. 베이스 클래스가 satic인 경우- C++에서는 static 메서드를 오버라이드 할 수 없음. 메서드에 static과 virtual을 동시에 지정할 수 없다.2. 베이스 클래스 메서드가 오버로드된 경우베이스 클래스에 다양한 버전으로 오버로드된 메서드가 여러 개 있는데 그중 한 버전만 오버라이드하면 컴파일러가 베이스 클래스에 있는 다른 버전의 메서드도 함께 가려버림- 실제 오버라이드하고 싶은 버전은 하나인데 그거 사용하려고 모든 버전을 오버라이드하는것은 너무 불편.이럴땐 using 키워드를 사용해서 간편하게 처리 가능3.private 메.. 2025. 3. 13. 이전 1 2 3 4 5 다음