안녕하세요!
게시글
질문&답변
printf("%i + %i = The answer is %i", z) 이렇게 테스트를 했는데도 값이 나와요
안녕하세요? 질문&답변 도우미 durams입니다.코드를 첨부해주시지 않아 자세한 상황을 알 수는 없지만, 함수가 요구하는 개수보다 적은 인자를 전달한 경우 정상적으로 함수가 동작할 것이라고 기대할 수 없습니다.값이 알아서 채워졌다기보다는, 본래 해당 인자의 값을 얻어와야 하는 곳에 위치한 쓰레기 값을 가져온 것이라고 보는 것이 옳습니다.
- 1
- 2
- 12
질문&답변
8.8 예제 질문
안녕하세요? 질문&답변 도우미 durams입니다.일단 단순히 if else 블록과 switch case 문의 차이나 함수의 유무를 벗어나서, 강의의 코드와 질문자님의 코드에는 동작의 차이도 있습니다. 영상에서 나오는 get_first_char와 get_integer 함수의 구현을 살펴보시면 어떤 것에서 차이나는지 아실 수 있을겁니다. 힌트를 드리자면, 이번 단원의 주제가 입력 유효성 검사입니다.강의에서 교수님이 만드시는 것과 정확히 동일한 코드를 만드려고 신경쓰실 필요는 없습니다. 대신 정답으로 나오는 코드를 보고, 어떠한 기능을 구현하는 방법에는 여러가지가 있다는 것을 아는 것은 중요합니다.이번 영상 마지막 즈음에 교수님께서 말씀하셨듯이, 초보 때는 최적화하는 데 너무 집중하시기보다는 기능 구현이 잘 되었다면 일단은 넘어가셔도 될 것 같습니다.
- 1
- 1
- 23
질문&답변
프로그래머스 수열과 구간 쿼리 2 문제 질문입니다.
안녕하세요? 질문&답변 도우미 durams입니다.본 강의는 기초 C++ 강의로, 강의의 내용을 벗어나는 알고리듬 문제 풀이에 대해서는 답변드리기 어렵다는 점 먼저 말씀드립니다. 그럼에도 불구하고, 도움을 얻고자 하는 질문자님에게 몇 가지 조언을 드리고자 합니다.알고리듬 문제풀이에서 가장 중요한 것 중 하나는, 문제를 정확하게 이해하는 것입니다. 다시 문제를 천천히 읽으며 질문자님께서 구현한 코드가 정말 제대로 이것을 반영하는지 확인해보는 과정이 필요합니다.머리로는 어떻게 해야겠다고 이해했지만, 제대로 코드로 옮겨내지 못하는 경우가 있을 수도 있습니다. 이건 대부분 경험으로 해결되는 것이지만, 질문자님께서는 C++의 문법에 아직 익숙하지 않으신 것 같습니다. 혹시 자료구조와 알고리듬을 아직 공부하지 않으셨다면, 공부하시면서 문법에 익숙해지시는 것을 추천드립니다.정말 어떻게 푸는지 모르겠을 때 다른 사람이나 게시판에 질문할 수는 있지만, 글에는 어떻게 고민했는지 그 과정이 포함되어 있어야 합니다. 그래야 글을 보는 사람으로 하여금 어디까지 생각을 펼쳤는지, 또는 어디서 막힌 것인지 알 수 있습니다. 답변하기도 훨씬 쉬워집니다.그림을 그려가면서 풀거나, 주석을 달아가면서 푸는 것도 방법입니다.
- 1
- 2
- 34
질문&답변
[] 범위 검사시 assert 사용 관련 질문
안녕하세요? 질문&답변 도우미 durams입니다.말씀하신대로 assert는 거의 개발/디버깅 시에만 사용합니다. 하지만 그렇다고 해서 상용 소프트웨어에서의 대비책이 없는 것은 아닙니다.상용 소프트웨어는 사용 중 문제가 발생한다고 해서 갑자기 꺼져버리는(crash) 일이 되도록이면 없어야합니다. 그렇기 때문에 개발자가 가능한 모든 케이스에 대해 적절하게 대응하도록 구현해야하며, 필요하다면 오류로그를 기록하거나, 때로는 복구를 시도하는 등의 방법을 선택할 수 있습니다. 그리고 각 전략의 오버헤드도 각각 다르기 때문에, 프로그램의 성능이 얼마나 중요한지에 따라 다른 전략을 사용할 수 있습니다.심지어 프로그램이 결국 크래시되더라도, 선택에 따라 관련 정보가 담긴 리포트를 개발사로 보내는 등의 동작을 통해 대응이 이루어집니다.참고로, C++의 std::exception은 비용이 커 성능이 중요시되는 곳에서는 쓰이지 않는 것으로 알고 있습니다.
- 1
- 2
- 28
질문&답변
Lecture 클래스 멤버변수 명명 관련
안녕하세요? 질문&답변 도우미 durams입니다.아마 아래와 같은 코드를 보고 질문 주신 것 같네요.class Lecture{ private: std::string m_name; Teacher teacher; std::vector students; // ~~~~변수의 속성에 따라 m_이나 g_ 같은 prefix를 붙이는 것이 오래된 관행인 것은 알고 계실텐데요, 이번 영상에서는 변수의 이름에 크게 의미가 있지는 않습니다.변수 이름 명명과 같은 코딩 컨벤션은 어떤 프로젝트를 하느냐, 혹은 어떤 사람들과 협업하느냐에 따라 달라질 수 있는 영역입니다. 질문자님께서도 앞으로 주어진 환경에 따라 그때그때 적절한 것을 정하면 되니 크게 신경쓰지 않으셔도 될 듯 합니다.
- 0
- 2
- 27
질문&답변
프로그래머스의 대소문자 바꿔서 출력하기 문제를 푸는데요
안녕하세요? 질문&답변 도우미 durams입니다.첨부해주신 코드는 제대로 실행되는 코드입니다. 제대로 실행되지 않는 이유는 작성해주신 글 내용만으로는 알기가 어렵네요. 표시된 에러 메시지의 내용으로 이유를 유추해보시면 될 것 같습니다.(강의의 내용과 벗어나는 주제에 대해서는 내용에 따라 답변이 어려울 수도 있습니다)
- 0
- 1
- 28
질문&답변
noexcept과 throw()
안녕하세요? 질문&답변 도우미 durams입니다.throw()는 함수 선언 뒤에 따라붙는 걸 말씀하시는거죠? noexcept와 throw()를 동일하다고 볼 수도 있습니다만, 확실한 차이가 있습니다.먼저 throw()를 하는 문법인 Dynamic exception specification 문법은 C++11에서 deprecated되었고, c++17부터는 표준에서 제거되었습니다. 그 이유는 throw()의 괄호에 특정 타입들을 명시하여 발생 가능한 예외를 명시하는 경우 발생 가능한 문제들이 있었기 때문이라고 합니다. 간단히 말씀드리자면 기본적으로 throw()는 타입이 주어진 경우, 명시되지 않은 타입의 예외가 발생한다면 프로그램이 종료됩니다. 그런데 만약 예를 들어 throw(int)와 같이 타입을 명시한 함수에서 어떠한 외부 라이브러리 함수를 사용하는데, 라이브러리 함수가 업데이트되어 다른 타입의 예외를 발생시킨다면 어떻게 될까요? 프로그래머는 해당 예외에 대응하기 위해 가장 낮은 레벨에서부터 최상위 레벨까지 모든 코드를 수정해야합니다. 라이브러리의 업데이트를 저해하는 부수적인 효과는 덤이구요.C++17부터는 타입을 명시하지 않은 throw()만 사용할 수 있으며, 컴파일러에게는 noexcept(true)로 인식됩니다. 그리고 그 마저도 C++20부터는 표준에서 제거되었다고 합니다. (레거시 코드와의 호환성 지원을 위해서인지 컴파일러에 따라 사용이 가능한 경우는 있습니다)참고했던 링크입니다 : https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Re-specifications
- 1
- 2
- 30
질문&답변
explicit instantiation에 대해
안녕하세요? 질문&답변 도우미 durams입니다.템플릿 클래스 함수의 선언과 정의를 분리하는 목적에 대해 여쭤보시는 것 같습니다. 이에 대해서는 일반 클래스 함수의 선언과 정의를 분리하는 이유를 생각해보시면 될 것 같습니다.유지보수 시 부분 컴파일을 통한 빌드 시간 단축여러 파일에 include했을 때 포함되는 내용이 줄어드므로 프로그램 용량 감소라이브러리 작성 시 보다 깔끔한 모듈화여담으로, 2번을 반대로 생각하여 '선언과 정의를 분리하지 않은 경우, 해당 헤더 파일을 여러 translation unit에서 include하면 그만큼 최종 바이너리 사이즈가 증가하는가?'와 같은 재밌는 주제에 대해서도 고민해 볼 수도 있습니다.
- 1
- 2
- 25
질문&답변
RVO를 의도적으로 노리는 것에 대한 효율성
안녕하세요? 질문&답변 도우미 durams입니다.먼저 RVO와 NRVO를 간단하게 소개드리려합니다. 둘은 모두 불필요한 복사를 줄이기 위한 최적화 기술입니다.RVO (Return Value Optimization) : 함수가 임시 객체 반환 시, 반환값이 바로 호출 위치에 생성되는 것.NRVO (Named Return Value Optimization) : 함수가 지역 객체 반환 시, 반환값이 바로 호출 위치에 생성되는 것.(엄밀히 말하면 강의에서 등장한 doSomething 함수는 NRVO를 보여주는 예시라고 할 수 있습니다)둘을 나눠 소개드린 이유는, RVO는 C++17부터 mandatory(의무적)로 적용되지만, NRVO는 컴파일러의 판단 하에 선택적으로 적용되기 때문입니다. 즉, NRVO는 의도적으로 사용할 수 없습니다.사실 RVO와 NRVO도 수많은 최적화 기술 중 하나의 예시에 불과하며, 현대 컴파일러가 수행하는 최적화는 프로그래머가 의도적으로 적용하는 것이 가능하지 않다고 보는것이 적절합니다. 기능 또는 수준에 따라 켜고 끄는 것이 가능한 경우는 있습니다만, 언제나 특정 최적화가 적용될 것이라고 기대하는 것은 적절하지 않습니다.이에 대한 대안으로는 언급하신대로 참조 또는 r-value reference를 사용한 move semantics 구현이 있습니다. 컴파일러가 최적화 판단을 내리기 어려운 여러 상황들에 대해 프로그래머가 직접 최적화를 지원하는 방법이라고 할 수 있습니다.질문자님께서 말씀해주신 두 가지 방법은 불필요한 복사를 제거한다는 점에서 목적은 같지만, 동작 방식과 판단 주체가 다릅니다. 한 가지 방법을 선택하시기보다는 둘을 조합해서 좋은 프로그램을 작성하시면 될 것 같습니다.(관련 내용이 있는 제 이전 답변을 참고로 보셔도 좋을 듯 합니다)
- 1
- 2
- 34
질문&답변
14.22 포인터에 대한 질문
안녕하세요? 질문&답변 도우미 durams입니다.1추론하시는 과정이 좋네요. 함수의 매개변수가 포인터인 경우, 인자로 전달한 포인터의 값이 복사됩니다. 이 경우를 call by address 라고 일반적으로 지칭하는데요, 말씀하신대로 엄밀하게는 포인터 변수의 값을 복사해서 사용하는 call by value 에 해당한다고 볼 수 있습니다. 그러니 ToUpper의 str1은 main의 str 값을 복사받아서 초기화된 별개의 포인터 변수입니다.제가 약간 아쉬운 점은, 결정적으로 main의 str과 ToUpper의 str1이 다른 변수라는 것을 증명해보지는 않으신것 같아요. 간단한 출력으로 확인할 수 있으니, 시도해보셨으면 좋겠습니다.2네 맞습니다. char[]와 같이 배열로 초기화한 경우에는 왜 런타임 에러가 발생하지 않는지에 대해서도 생각해보셨으면 좋겠습니다.char str1[] = "Hello World!"; char* str2 = "Hello World!"; str1[0] = 'X'; // 가능 str2[0] = 'X'; // 불가능. 런타임 에러 발생
- 1
- 1
- 56