전문가를 위한 C++37 2025/04/09 ch.18 표준 라이브러리 컨테이너 표준 라이브러리 컨테이너는 대부분 크기를 조절할 수 있고 원소의 추가나 삭제에 따라 자동으로 늘어나거나 줄어듦 18.1.1 원소에 대한 요구사항표준 라이브러리 컨테이너는 원소를 값으로 처리함(값 의미론)원소의 복제본을 저장하고 대입 연산자로 대입하고 소멸자로 원소를 삭제함표준 라이브러리를 사용하는 클래스를 작성할 때는 반드시 복제할 수 있게 만들어야 함 원소를 레퍼런스로 처리하고 싶다면 원소를 그대로 넣지 않고 원소에 대한 포인터를 저장함 이동 전용 타입, 복제할 수 없는 타입도 컨테이너에 저장할 수 있지만 컴파일 에러를 발생시킬 수 있다 할당자원소에 대한 메모리를 할당하거나 해제할 수 있다 비교자원소를 정렬하는데 사용 18.2 순차 컨테이너1. vector원소를 추가,삭제하는 작업은 선형 시간원소의 추.. 2025. 4. 9. 2025/04/08 ch.17 반복자와 범위 라이브러리 17.3.2 역방향 반복자표준 라이브러리는 양방향 또는 임의 접근 반복자로 역방향을 탐색하게 해주는 reverse_iterator 클래스 템플릿을 제공함 17.3.3 이동 반복자move_iterator의 역참조 연산자는 값을 자동으로 우측값 참조로 변환함복재하지 않고도 값 이동 가능단, 이동 의미론을 적용하기 전에 반드시 해당 객체가 이를 지원하는지 확인해야 함 17.4 범위range 라이브러리에서 제공하는 범위는 반복자 위에 추상화를 한 단계 더해서 반복자가 일치하지 않는 에러를 제거하고, 범위 어댑터를 통해 원소 시퀀스를 변환하거나 필터링하는 부가 기능도 제공함 2025. 4. 8. 2025/04/07 ch.17 반복자와 범위 라이브러리 17.1 반복자컨테이너마다 원소에 대한 반복문을 지원하는 특수한 스마트 포인터인 반복자가 정의되어 있음반복자는 컨테이너의 특정 원소를 가리키는 포인터++연산자를 이용해 다음 원소를 가리키도록 변경 가능반복자는 반드시 복제 생성자, 복제 대입 연산자, 소멸자를 제공해야 함반복자의 좌측값은 반드시 맞바꾸기를 지원해야 함 반복자는 여섯가지로 분류 가능함 연속 반복자는 모두 임의 접근 반복자임의 접근 반복자는 모두 양방향 반복자양방향 반복자는 모두 정방향 반복자정방향 반복자는 모두 입력 반복자출력 반복자의 요구사항을 만족하는 반복자 - 가변 반복자아니면 상수(불변) 반복자 알고리즘마다 필요한 반복자를 지정하는 표준 방식은 반복자 템플릿 타입 인수에 이름을 넣는것타입검사 기능이 없으므로 반복자 타입을 지정하고 다.. 2025. 4. 7. 2025/04/06 ch.16 C++ 표준 라이브러리 둘러보기 C++표준 라이브러리 중에서도 가장 핵심은 제네릭 컨테이너와 제네릭 알고리즘원래 표준 템플릿 라이브러리(STL) 이라는 서드 파티 라이브러리였다이제는 표준 라이브러리 이므로 STL은 사실 잘못된 용어 표준 라이브러리에서 제공하는 대다수의 알고리즘과 컨테이너가 상호 호환되고 컨테이너에 담긴 데이터 타입의 종류에 무관하게 작동하는 범용성프로그래머가 직접 정의한 것보다 더 빠른 컨테이너와 알고리즘을 제공 템플릿 활용템플릿을 활용하면 제네릭 프로그래밍을 할 수 있음모든 종류의 객체를 다룰 수 있을 뿐만 아니라 코드 작성 시점에는 모르던 객체도 처리할 수 있게 만들 수 있음템플릿 코드를 만드는 프로그래머- 객체 생성에 필요한 클래스 요구사항을 명시해야 함- 비교 연산자나 복제 생성자 등과 같은 해당 템플릿을 사용.. 2025. 4. 7. 2025/03/28 ch.15 연산자 오버로딩 double()을 구현했을 때의 문제점SpreadsheetCell cell { 6.6 };double d1 { cell + 3.3 }; //컴파일 에러!이유는?cell이 double() 을 통해 형변환 되어 덧셈이 될지3.3이 double 생성자를 통해 임시객체가 되어 덧셈이 될지컴파일러가 정할 수 없기 때문 생성자 앞에 explicit 키워드를 지정해서 자동 형변환이 일어날때 이 생성자를 사용하지 않게 할 수 있다다만 형변환으로 객체가 생성되는 기능은 매우 편리하기 때문에 막기엔 좀 그렇다그래서 C++11 부터는 double 변환 연산자를 explicit으로 선언해서 생성자쪽으로 연산되도록 할 수 있다 15.8.3 부울 표현식으로 변환객체를 부울 표현식에서 사용하면 좋을 때가 있다if(obj) ...i.. 2025. 3. 28. 2025/03/27 ch.15 연산자 오버로딩 15.3 비트 연산자와 논리 연산자 오버로딩비트 연산자는 산술 연산자와 비슷하고, 축약 비트 대입 연산자는 축약 산술 대입 연산자와 비슷함활용 사례가 매우 드물다 15.4 스트림 입력과 출력 연산자 오버로딩값을 쓸때는 추가(삽입) 연산자인 스트림에서 데이터를 읽을 때는 추출 연산자인 >>를 스트림 입력 연산자로 사용한다. 스트림 입력이나 출력 연산자의 왼쪽에는 클래스 객체가 아닌 istream나 ostream 객체가 나와야 한다.istream이나 ostream에 메서드를 직접 추가할 수 없으니 >>, 이렇게 i,o stream에 대한 레퍼런스를 받으면 cout cerr clog 등에 적용할 수 있다 >>는 객체를 수정하기 때문에 레퍼런스를 const로 지정하면 안된다 15.5 인덱스 연산자 오버로드 하기.. 2025. 3. 27. 2025/03/26 ch.15 연산자 오버로딩 연산자 오버로딩은 일반적으로 자신이 정의할 클래스를 기본 타입처럼 다루기 위해 사용한다. 연산자 오버로딩의 한계1. 연산자 기호를 새로 추가할 수 없다2. [ . ] [ .* ] [ :: ] [ sizeof ] [ ?: ] 를 비롯한 일부 연산자는 오버로드 불가3. 애리티는 연산자의 인수 또는 피연산자의 개수. 함수 호출, new, delete 연산자에 대해서만 에리티를 변경할 수 있고 다른 연산자는 불가능. 단항 연산자는 무조건 피연산자 하나, 이항은 두개4. 연산자의 우선순위, 결합순의는 바꿀수 없다5. 기본 타입 연산자의 의미는 바꿀 수 없다. 클래스의 메서드로 정의할지, 글로벌 함수로 정의할지메서드일 때는 연산자를 사용한 표현식의 왼쪽에 반드시 그 클래스의 객체가 나와야 한다.글로벌일때는 왼쪽에 .. 2025. 3. 26. 2025/03/25 ch.14 에러처리 14.2.7 noexcept(표현식) 지정자표현식이 true를 리턴할 때만 noexcept가 적용됨. noexcept(false)가 붙은 메서드는 익셉션을 던질 수 없음 14.2.8 noexcept(표현식) 연산자지정자랑 표현이 똑같아서 매우 헷갈리지만 이건 연산자이다표현식에 noexcept 지정자나 noexcept(표현식) 지정자가 들어오면 true를 반환한다void f1() noexcept {} //noexcept임void f2() noexcept(false) {} //표현식이 false이므로 noexcept가 아님//f1이 noexcept이므로 noexcept(f1())은 true를 반환.f3은 noexcept임void f3() noexcept(noexcept(f1())) {} //f2가 noexc.. 2025. 3. 25. 2025/03/24 ch.14 에러처리 C++는 예상치 못한 예외적인 상황에 대처하도록 익셉션 이라는 기능을 제공한다. 예외상황 - 프로그램에서 발생할 가능성이 있는 잠재적인 문제들을 통틀어 부르는 말 C언어 - 에러 처리 기능을 직접 제공하지 않음자바 - 언어에서 제공하는 익셉션메커니즘을 반드시 활용해서 프로그래밍하도록 강제함C++ - 중간. 언어에서 익셉션 메커니즘을 제공하지만 반드시 사용할 필요는 없음 익셉션은 코드의 정상적인 실행 프름과는 별도로 실행됨.에러가 발생하면 익셉션을 던지고, 이를 처리하는 코드는 발생한 익셉션을 받아서 처리. 순차적으로 실행되지 않음익셉션을 던지면 프로그램의 정상 실행 흐름을 잠시 멈추고 익셉션 핸들러로 제어권을 넘긴다. 비공식 에러처리 방법보다 익셉션 메커니즘이 뛰어난 점1. 에러를 리턴값으로 표현하면 호.. 2025. 3. 24. 이전 1 2 3 4 5 다음