소개
게시글
질문&답변
2024.11.18
2.9 함수 만들기
안녕하세요? 질문&답변 도우미 Soobak 입니다. Q. 1분 30초에 printf가 출력은 맞는데, 여기서 받아와서 추가로 하는 작업이 없으니 가정으로 그냥 없다고 하신걸까요?: '함수의 출력' 과 'printf() 의 기능인 화면에 글자를 출력하는 것' 을 혼동하신 것 같습니다.printf() 함수는 '화면에 글자를 출력' 하는 기능을 합니다.이 때, 이 기능을 수행하는 '함수' say_hello() 의 관점에서 생각해보면,단순히, printf("Hello, World!\n"); 라는 기능을 수행하고 추가로 진행하는 작업이 없으므로'함수의 입력과 출력' 이 없다고 가정하였던 것입니다.출력이 없는 함수는 문법적으로 반환형에 무치형(void)을 사용하고, 입력 또한 없는 함수이므로 매개 변수에 void 를 명시합니다.최종적으로 say_hello() 함수는 다음과 같이 printf("Hello, World!\n") 를 통해 화면에 글자를 출력하는 기능을 갖는 함수가 됩니다.void say_hello(void) // 반환형 void, 매개 변수 void { printf("Hello, World!\n"); } 혹시 이해가 어려우시다면, 강의 2.6 printf() 함수의 기본적인 사용법 의 1:45 부분 교수님 설명과 그림을 참고해보시면 바로 이해가 쉽게 되실 것입니다. Q. 2분1초에 출력으로 받을게 없으니까 출력 받는 void 라고 쓴다고 하셨는데, 여기서 출력으로 받을게 없다는것이 어떤건가요?: 위 질문 답변의 내용과 같은 맥락에서, 함수의 출력(반환하는 것)이 없는 상황을 의미합니다.위의 void say_hello(void) 함수처럼 단순하게, 함수 내부에서 기능을 수행하는 경우입니다. 간단하게 추가 설명을 드려보면, C언어는 함수의 출력(반환)과 입력에 대해서 데이터의 자료형을 명시해주어야 합니다.(자료형에 대해서는 이전 강의 2.4 자료형이 필요한 이유 를 참고해보셔도 좋고, 이어지는 섹션 4 데이터와 C언어 에서도 자세하게 학습하시게 됩니다.)예를 들어, 정수(integer)를 출력(반환)하는 함수의 경우에는 다음과 같이 작성됩니다.int doSomething(void) // 함수의 출력 - 정수, 입력 - 없음 { return 2; // 함수가 출력하는 것은 정수 자료형의 2 } int doSomething(int i) // 함수의 출력(반환) - 정수, 입력 - 정수 { return i + 2; // i 라는 정수 자료형 데이터를 입력받아 함수가 반환(출력)하는 것은 정수 자료형의 입력값 + 2 } 곧 이어서 자세히 학습하게 되실 내용이니,'함수의 출력' 과 '화면에 글자를 출력' 하는 것의 차이점, 그리고 함수가 출력하거나 함수에 입력하는 것이 없을 때 에는 void 를 사용한다는 것 정도만 이해해두시고 학습을 이어나가시는 것을 추천드립니다.
- 1
- 2
- 3
질문&답변
2024.11.14
예외 클래스 상속 관련 다른 예제 코드 확인 부탁 드립니다.
안녕하세요? 질문&답변 도우미 Soobak 입니다. 흥미로운 질문이시네요.다만, 제 환경에서는 첫 번째 코드 또한 정상적으로 동작합니다.dynamic_cast 도 정상적으로 잘 동작하여 자식 클래스에 있는 에러 코드를 잘 출력합니다.(사진)(실행 화면) 메모리 관련 검사 또한 해보았으나, 아쉽게도 문제가 없었습니다.(사진) 어떠한 문제가 발생한 것이신지 조금 더 구체적으로 알려주시면 제가 더 적절한 도움을 드릴 수 있을 것 같습니다.그럼에도 질문주신 내용에 대해서 답변을 드려보자면, 예외 객체를 동적으로 할당하여 throw 하는 경우는 예외가 적절히 catch 되지 않으면 메모리가 해제되지 않아 메모리 문제가 생길 수 있게 됩니다.또한, 예외를 관리하는 데에 어려움이 증가할 것 같습니다. 스택에서 직접 생성된 예외 객체는 예외가 포착되지 않더라도 자동으로 메모리가 해제되므로,개인적으로는 try 이후 catch 구문의 순서를 적절히 조절하는 것, 그리고 예외 객체를 던지고 받을 때 상속 구조를 유의하여 값-참조 자료형을 적절히 선택하고 관리하는 방향을 더 선호할 것 같습니다.개인적으로는 dynamic_cast 를 사용하지 않고, 다음과 같이 작성할 것 같습니다.#include #include class Exception { public: explicit Exception(const std::string& message) : message_(message) {} virtual ~Exception() {} virtual const char* what() const noexcept { return message_.c_str(); } private: std::string message_; }; class CustomException : public Exception { public: explicit CustomException(const std::string& message, int errorCode) : Exception(message), errorCode_(errorCode) {} int getErrorCode() const { return errorCode_; } private: int errorCode_; }; void throwException() { CustomException ex("CustomException occurred", 404); throw ex; } int main() { try { throwException(); } catch (const CustomException& e) { // CustomException을 직접 catch std::cout 다만, 추후 섹션 16 에서 학습하시게 되는 스마트 포인터를 이용하신다면 메모리 관리에 조금 덜 신경쓰며 동적으로 예외 객체를 할당하여 사용하는 방법도 있겠네요.하지만, 그럼에도 불구하고 여러가지 측면을 고려했을 때 개인적으로 예외 객체를 동적으로 할당하는 것은 지양하는 것이 좋다고 생각합니다.고민해볼 수 있는 재미있는 내용이네요. 항상 열정있는 학습과 재미있는 질문 감사합니다. 저에게도 좋은 자극이 되어 주시고 계십니다.궁금한 점이 있으시면 편하게 질문해주세요! 글을 통해서 대화를 나누는 역량 그 자체는 저도 열심히 신경쓰며 키워나가고 있는 부분이지만,질문의 내용이나 주제에 대해서는 궁금증이 생기실 때 편하게 작성해주시는 것이 좋은 것 같습니다.
- 1
- 2
- 31
질문&답변
2024.11.13
mingw-w64 수동설치
안녕하세요? 질문&답변 도우미 Soobak 입니다. sourceforge 에서의 최신 버전 압축파일이 설정하기 조금 어렵게 되어있네요.조금 더 설정하시기 편한 압축 파일의 링크 주소를 첨부드립니다.https://github.com/brechtsanders/winlibs_mingw/releases/download/13.3.0posix-11.0.1-msvcrt-r1/winlibs-x86_64-posix-seh-gcc-13.3.0-mingw-w64msvcrt-11.0.1-r1.zip (https://winlibs.com/ 페이지에서 하단의 MSVCRT runtime 항목의 Zip 압축파일 입니다.) 이후의 과정은 C:\Program Files\ 에 mingw64 라는 폴더를 위치시키셔서 압축을 해제하신 후해당 강의 4:10 부분 부터의 내용에 따라서 '환경 변수'(Path)를 설정해주시면 됩니다.환경 변수를 설정하실 때에는 C:\Program Files\mingw64\bin 을 입력해주시면 됩니다. 개인적으로, 처음 학습하실 때에는 환경 설정이 복잡하다고 느껴지실 수 있으니 보다 편리한 Visual Studio 를 사용하시는 것을 추천드립니다. (Visual Studio 와 Visual Studio Code 는 다른 프로그램입니다.)
- 1
- 2
- 18
질문&답변
2024.11.11
연산자의 내부적인 작동 원리가 궁금합니다
안녕하세요? 질문&답변 도우미 Soobak 입니다. 연산자 자체에 자료형을 인지하고 판단하는 명령이 있다고 보기 보다는,컴파일러가 연산을 수행하는 변수의 자료형에 따라서 적절한 형변환을 진행한 후 연산을 수행한다는 것이 더 알맞은 표현 같습니다.C++ 언어에서는 연산자 오버로딩을 통해서 자료형에 따라 다른 동작을 하도록 명시적으로 정의할 수 있습니다.
- 1
- 2
- 20
질문&답변
2024.11.11
string data가 어느 메모리 영역에 저장 되는지 헷갈려서요..
안녕하세요? 질문&답변 도우미 Soobak 입니다. 일반적으로 읽기 전용 데이터 세그먼트에 저장됩니다.강의 12:08 부분의 화면에 첨부된 설명과,이어지는 강의 중 16:20 부분에서 동일한 문자열 리터럴을 다루는 예제를 참고해보시면 학습에 도움이 되실 것 같습니다.
- 1
- 2
- 20