분류 전체보기 212

dynamic_cast

dynamic_cast는 주로 다형성(polymorphism)과 관련이 있다. 이 연산자는 런타임에 안전한 형변환을 수행한다. 즉, 동적으로 객체의 타입을 확인하고, 그 결과에 따라 적절한 형변환을 수행한다. 주로 상속과 가상 함수(Virtual Functions)를 사용하는 클래스 계층 구조에서 사용된다. dynamic_cast의 기본 형태 new_type은 형변환하고자 하는 새로운 타입을 나타내며, expression은 형변환할 값이나 포인터입니다. new_type = dynamic_cast(expression); 예제를 통해 공부하자 현재 자식이 다시 부모로 캐스팅 하려고 한다. 이런 때를 업캐스팅이라고 한다. 업캐스팅을 해주는 것이 dynamic_cast이다. Base 클래스에는 가상 함수인 pr..

reinterpret_cast

reinterpret_cast()는 static_cast()보다 안전성은 조금 떨어지며, C++에서 가장 강력하면서도 위험한 형변환 중 하나이다. C++ 타입 규칙에서 허용하지 않더라도 상황에 따라 캐스팅하는 것이 적합할 때 사용할 수 있다. 예를 들어 서로 관련이 없는 레퍼런스끼리 변환할 수도 있다. 주로 다른 포인터 타입 간의 형변환에 사용됨. reinterpret_cast의 기본 형태 new_type은 형변환하고자 하는 새로운 타입을 나타내며, expression은 형변환할 값이나 포인터. new_type = reinterpret_cast(expression); 포인터 간 형변환 예제를 통해 알아보자 #include int main() { int intValue = 42; // int 포인터를 do..

static_cast

static_cast는 언어에서 지원하는 명시적 변환을 수행한다. → 작은 데이터 타입에서 큰 데이터 타입으로 바꾸기 예를 들어 다음 코드처럼 정수에 대한 나눗셈이 아닌 부동소수점에 대한 나눗셈으로 처리하도록 int를 double로 변환해야 할 때가 있다. 이때 static_cast()를 사용하면 된다. int i{ 3 }; int j{ 4 }; double result{ static_cast(i) / j }; → 더 큰 데이터 타입에서 더 작은 데이터 타입으로 변환 double pi = 3.141592653589793; int integerPi = static_cast(pi); // 더 큰 double을 더 작은 int로 형 변환 → 기본 데이터 타입 사이의 형 변환 int intValue = 42; ..

inff, inf, nan, NAN

inff, inf inff, inf는 양의 무한대를 나타내는 부동 소수점 리터널 상수이다. double, float에서 사용하는 상수가 나뉘어지는데 밑 표를 보고 이히해보자. double float 양의 무한대 부동 소수점 리터널 상수 inf inff 음의 무한대 부동 소수점 리터널 상수 -inf -inff inf → double 또는 float 데이터 타입에서 양의 무한대를 나타내는 표준 상수이다. 기본적으로 double 형식으로 양의 무한대를 나타냄. float 형식으로 양의 무한대를 나타내려면 명시적으로 ‘f’를 사용해야함. 즉, double 변수에 inf 또는 float 변수에 inff를 할당하면 해당 변수는 양의 무한대를 나타낸다. inff → float 데이터 타입에서 양의 무한대(positi..

CS 2024.01.26

리터널, 상수

이번에는 프로그래밍 언어에서 리터널, 상수라는 이야기가 나오게 되는데 이걸 공부해보자. 리터널 리터널(literal)은 프로그래밍 언어에서 고정된 값을 나타내는 표현 방식 코드 상에서 직접 사용되어 특정한 값을 나타내는 표현. 변수나 식 등과 달리 값 그 자체로 나타냄. 여러 종류의 리터널이 있음. 주로 기본 데이터 타입에 따라 다양한 형태로 나타낼 수 있다. 정수 리터널 (Integer Literal): 정수 값을 나타냄. 42 부동소수점 리터널 (Floating-Point Literal): 부동소수점 숫자를 나타냅니다. 3.14 문자열 리터널 (String Literal): 문자열을 나타내며, 문자열은 작은 따옴표(')나 큰 따옴표(")로 묶어진다. "Hello, World!" 불리언 리터널 (Boo..

CS 2024.01.26

ex03

forms을 작성하는 거는 귀찮아서 interns이 존재한다고 한다. 인턴에게는 이름도 없고, 등급도 없고, 독특한 특성도 없습니다. 관료들이 관심을 갖는 유일한 것은 그들이 일을 하는 것입니다. → 멤버 변수가 없다라는 것임. 그렇지만 중요한 makeForm 함수가 존재. AForm *makeForm(const std::string &form, const std::string &target); 이 함수 안에는 if/elseif/else 금지 → 함수 포인터 사용. "Bender"를 대상으로 하는 RobotomyRequestForm을 생성. intern hpp #ifndef INTERN_HPP # define INTERN_HPP #include "AForm.hpp" #include "Presidentia..

ex02

이제 form에 어떠한 양식을 더 만들 거임 3가지로 나뉨 ShrubberyCreationForm: 필수 성적: 서명 145, 실행 137 작업 디렉터리에 _shrubbery 파일을 만들고 그 안에 ASCII 트리를 씁니다. RobotomyRequestForm: 필수 성적: 서명 72, 실행 45 드릴링 소음이 발생합니다. 그런 다음 이 50%의 확률로 로봇화되었음을 알려줍니다. 그렇지 않으면 로봇공학이 실패했음을 알립니다. PresidentialPardonForm: 필수 등급: sign 25, exec 5 이 Zaphod Beeblebrox에 의해 사면되었음을 알립니다. ShrubberyCreationForm hpp #ifndef SHRUBBERYCRETIONFORM_HPP # define SHRUBB..

ex01

Form Class 만들기 상수 이름. == const std::string name; 서명되었는지 여부를 나타내는 부울입니다(구성 시에는 서명되지 않음). == bool sign; 서명하려면 일정한 등급이 필요합니다. == const int signGrade; 이를 실행하기 위해서는 일정한 등급이 필요합니다. == const int execGrade; 양식의 등급은 관료에게 적용되는 것과 동일한 규칙을 따릅니다. 따라서 양식 등급이 범위를 벗어나면 Form::GradeTooHighException 및 Form::GradeTooLowException과 같은 예외가 발생합니다. class GradeTooLowException : public std::exception { public: const char ..

ex00

들어가기 전 try catch, throw과 exception,what을 공부하고 가자! try catch, throw https://wo-dbs.tistory.com/158 Try Catch, throw → 우리에게 익숙한 예외처리는 if문을 이용한 예외처리임. 하지만 if문을 보고 예외처리를 위한 코드인지 프로그램의 흐름을 구성하는 코드인지 쉽게 구분하지 못해서 가독성이 떨어짐. C++의 wo-dbs.tistory.com exception,what https://wo-dbs.tistory.com/159 exception, what → if-else문을 통해 예외를 인지하게 한 후 직접 throw를 던졌었지만 문제가 생기면 std::exception 클래스를 통해 시스템 상 내부에서 알아서 발생한 예외..

exception, what

→ if-else문을 통해 예외를 인지하게 한 후 직접 throw를 던졌었지만 문제가 생기면 std::exception 클래스를 통해 시스템 상 내부에서 알아서 발생한 예외를 throw 한다. 예외(exception)은 프로그램 실행 중에 예기치 않은 상황이나 오류가 발생했을 때 발생하는 이벤트를 가리킵니다. 예외는 프로그램이 비정상적으로 종료되는 것을 방지하고 오류를 처리하는 메커니즘을 제공 → C++ 표준 클래스로 예외의 여러 종류들을 나타내는 여러 자식 클래스들을 두고 있다. • runtime_error 클래스, logic_error 클래스 등등 C++ 표준의 exception 클래스 를 상속받고 있다. #include #include #include int main() { try { std::st..