[Core GuideLine] 인터페이스
2024. 11. 7. 18:54
Programming/C++
1.인터페이스는 명시적으로 만들어야 한다.인터페이스에 명시되지 않은 가정은 쉽게 간과되며 테스트가 어렵다.int round(double d){ return (round_up) ? ceil(d) : d; // 나쁜 코드 : "보이지 않는" 의존성}위 코드에서 round(7.2)를 두 번 호출했을 때, 서로 다른 결과를 반환할 수도 있다는 점이 호출자에게 명확하게 보이지 않는다. 경우에 따라 환경 변수를 통해 일련의 작업 세부 사항을 제어하기도 합니다. 예를 들어, 일반 출력과 자세한 출력, debug와 optimized 모드 등, 비록 비-로컬 제어가 잠재적으로 혼란을 줄 수 있지만, 이는 고정된 의미를 갖는 세부 구현에만 영향을 미칩니다.// 나쁜 코드 : fprintf의 반환 값을 테스트하..
[cpp][c++11] 타입 추론 (type inference)
2022. 12. 16. 15:59
Programming/C++
타입 추론 (type inference) ? 표현식의 타입을 컴파일러가 스스로 알아내는 기능 관련된 키워드로 auto와 decltype 이 있다. auto 키워드 함수의 리턴타입 추론 구조적 바인딩에 사용 표현식의 타입을 추론 non type, 즉 타입이 아닌 템플릿 매개변수의 타입 추론 함수에 대한 또다른 문법으로 사용 제네릭 람다 표현식에서 사용 컴파일 시간에 자동으로 추론해서 결정됨 auto로 표현식의 타입을 추론하면 함수에 지정된 레퍼런스나 const 한정자가 제거됨 복제 방식으로 전달되지 안헥 하려면 auto&나 const auto& 타입으로 지정해야 함 const std::string message = "TEST"; const std::string& foo() { return message; ..
[cpp][c++11] noexcept 키워드
2022. 12. 16. 15:54
Programming/C++
정의 noexcept가 지정된 함수는 익셉션을 던지지 않는다. 예문 int testfunc() noexcept; 추가 내용 noexcpet키워드가 지정된 함수에 익셉션을 던지는 코드가 있다면 c++런타임은 terminate()를 호출하여 프로그램 종료 파생클래스에서 virtual함수를 오버라이드할때 베이스클래스에 정의된 메서드에 noexcept가 지정되어 있지않더라도, 오버라이드 하는 함수에서 noexcept를 지정할 수 있다. 하지만 반대는 불가능하다.
[cpp][c++ 17] std::string_view
2022. 12. 7. 17:07
Programming/C++
먼저 알아야 할 개념 : 문자열 리터럴 overview std::string_view 클래스는 "문자열에 대한 비소유 참조" 이다 문자열에 대한 "상수 참조" 또는 "읽기 전용 참조" 라고 할 수도 있지만, const std::string& 로 오해할 수 있기 때문에 이렇게 정의한다. 실질적인 기능을 제공하는 것은 std::basic_string_view라는 템플릿이다. std::string_view는 미리 정의된 std::basic_string_view의 별칭일 뿐..(std::basic_string 을 std::string으로 쓰는것과 유사) std::string C Style 문자열 표현 문자열의 마지막에 널문자(\0)를 붙여서 끝남을 표시함 std::string 헤더에 정의 비교연산자 연산자 오버..
[cpp] 전방 선언에 대하여
2022. 12. 2. 18:33
Programming/C++
전방 선언(forward declarations) 과 정의(definitions) 실제로 식별자를 정의하기 전에 식별자의 존재를 컴파일러에게 미리 알리는 것이다 함수의 경우 전방선언을 하려면 함수 원형으로 사용해야 한다 전방선언을 할 경우 클래스의 존재만 인지시키는 것이기 때문에 포인터로밖에 선언하지 못한다 전방 선언을 사용하는 이유? 참조하려는 헤더파일에 변경이 생겨도 헤더파일의 재컴파일이 이루어지지 않기 때문에 효율성과 속도가 증진된다! 역참조가 되는 구조를 막기도 한다 코드 Closet.h 에 아래와 같이 선언되어있다고 보자. class Button; class Jumper { Button *pB; }; 전방 선언을 사용하지 않는다면 Closet.cpp는 이렇게 사용해야한다. #include "Cl..
[cpp][effective_c++_19] 클래스 설계는 타입 설계와 똑같이
2022. 12. 1. 19:09
Programming/C++
좋은 클래스를 설계하기 위한 여러 가지 질문들 새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가? 객체 초기화는 객체 대입과 어떻게 달라야 하는가? 초기화와 대입을 헷갈리지 않는게 가장 중요함, 각각에 해당되는 함수 호출이 아예 다르다 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가? 어떤 타입에 대해 값에의한 전달을 구현하는 쪽은 복사 생성자이다 새로운 타입이 가질 수 있는 적법한 값에 대한 제약은 무엇으로 가질 것인가? 기존의 클래스 상속에 맞출 것인가? 이미 갖고 있는 클래스로부터 상속을 시킨다면, 당연히 이번에 설계한 클래스는 이녀석들에 의해 제약을 받게 된다. 특히 멤버함수가 가상인가 비가상인가 여부가 가장 크다. 이번에 설계하는 클래스를 다른클래스..
[cpp][effective_c++_18] 인터페이스 설계는 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게
2022. 11. 23. 01:06
Programming/C++
함수도 인터페이스,클래스도 인터페이스,템플릿 또한 인터페이스요.... 사용자가 의도한 대로 동작하지 않는다면 그 코드는 컴파일 되어야 하지 않는 것이 맞다. 또한, 어떤 코드가 컴파일된다면... 사용자가 원하는 대로 동작해야한다. '제대로 쓰기는 쉬우나 엉터리로 쓰기엔 어려운' 인터페이스를 개발하려면 우선 사용자가 저지를 만한 실수를 머리에 넣어 두고 있어야 한다. 예를 들면, 날짜를 저장하는 클래스의 생성자를 설계해보자 class Date{ public: Date(int month, int day, int year); ... }; 여기엔 사용자가 저지를 만한 실수가 있다! 매개변수의 전달 순서를 잘못쓰거나,유효 범위를 넘어서는 숫자가 들어갈 수 있다. 1. Date date(30,3,1999) ->mo..
[Cpp] Lambda 표현식에 대하여 알아보자
2022. 9. 8. 13:20
Programming/C++
함수형 프로그래밍을 안다면 람다표현식이 쉬울것이다. 하지만 C++ 11이전 버전만 사용하던 나에게... 개념이해가 어렵다..^_^... 다수의 구글링과 유튜브(https://www.youtube.com/channel/UCHcG02L6TSS-StkSbqVy6Fg)를 이용해 학습한 내용을 정리한다. 먼저 Java Script의 Closure개념에 대해 알아두면 좋을 듯 하다. 1.Closure의 정의 클로저는 자바스크립트 고유의 개념이 아니다. 클로저에 대해 MDN은 아래와 같이 정의하고 있다. “A closure is the combination of a function and the lexical environment within which that function was declared.” 클로저는 함..