소개
강의
전체 5수강평
- 홍정모의 따라하며 배우는 C언어
- 홍정모의 따라하며 배우는 C언어
게시글
질문&답변
2024.06.21
공부방식에 대해
제 유튜브에 C++ 요약 3시간 강의 있으니까 그것부터 빠르게 먼저 보면서 틀을 잡고 다시 와서 보시는 것을 권장합니다. 게임 만들기 연습문제 패키지는 더이상 관리를 하지 않고 있습니다.
- 1
- 2
- 225
질문&답변
2024.05.24
캐스팅에 대해 질문이 있습니다.
안녕하세요? 여기서 C++ 스타일이라고 얘기한 것은 C언어 공부한 학생들에게 C++에서는 문법에 차이가 있다는 의미입니다.간단히 얘기하면 C에서는 int a = int(3.4);이 컴파일이 안됩니다.어떤 종류의 캐스팅인지 더 구체적으로 적어놓으면 당연히 좋겠죠. 더 구체적으로 적을 수 있으니 구체적으로 적는 것이 C++ 스타일이라고 말하는 것도 말이 됩니다. 그렇다면 C++에서 int a = int(3.4);를 사용하는 것이 C스타일인가? 정작 C에서는 컴파일이 안되는데? 그리고 C++에서 컴파일이 되는거면 다 C++ 스타일이라고 봐야 하는거 아닌가? 이런 얘기도 나올 수 있을 정도로 복잡한 상황입니다.그러나 원론적으로는 생각하시는 대로 C++에서는 어떤 종류의 형변환인지를 더 구체적으로 지정해줄 수 있으니까 적어주면 좋은 것은 맞습니다. 실무 코드나 유명한 오픈소스에서도 항상 static_cast를 쓰는 것은 아닙니다. 이런 현상이 C언어 사용자로부터 오는 관성 때문인지 아니면 C++에서도 'C-style' cast를 써도 된다고 보는 것인지 까지는 모르겠습니다. 하지만 만약에 C++ 커뮤니티에다가 꼭 어떻게 해야만 한다라고 압박하는 얘기가 나오면 대부분의 경우 논란이 꽤 있을겁니다.아래 링크가 원 교재 링크입니다. 원 교재에는 C++ 스타일이라는 표현이 사라졌는데 제가 강의를 만들면서 오류가 생긴 것인지 아니면 그사이에 원 교재가 수정되었는지는 잘 모르겠네요.https://www.learncpp.com/cpp-tutorial/explicit-type-conversion-casting-and-static-cast/ 2.static_cast와 나머지 방식이 차이가 없다고 얘기한 것이 아니라 int(4.0)과 static_cast(4.0)의 결과에 차이가 없다는 얘기였습니다. 제가 들어도 표현이 애매한 면이 있긴 합니다. 링크 글에서 정확히 어느 부분을 얘기하시는 것인지는 모르겠는데 일단 제가 추측해보건데 중간에static_cast - Effectively this converts an object from one type to another. Note this can change the value (static_cast(1) doesn't have the same bit pattern as 1 for instance).의 얘기는 static_cast(1) -> float 1.0f 과 정수 1이 비트 배열이 다르다는 얘기입니다. 4.Stroustrup글에서 What good is static_cast? 부분만 읽어보았는데, 잘 보시면 새로운 스타일이 추가가 되었다는 표현이 있고 새로 추가된 것이 C++ 스타일이라는 표현은 없습니다. 일반적으로 좋은 C++ 프로그래밍 스타일은 형변환을 할 때 프로그래머의 의도가 무엇인지를 컴파일러에게 떠넘기지 않고 코드에 잘 적어놓는 것이겠죠. 유교경전 문구 가지고 옥신각신 싸우는 것은 의미가 없다고 생각합니다만, C++ 스타일이 뭐냐라고 딱 정리하기는 여전히 쉽지 않은 것으로 알고 있습니다. (보통 우리 회사는 이렇게 한다 정도로 합의) 4.If there is exactly one expression in parentheses, this cast expression is exactly equivalent to the corresponding C-style cast expression. 혹시 도움될까 해서 덧붙이자면, 미국 애들끼리는 대화하면서 이런거 꼬치꼬치 따지고 고쳐주고 하는 경우가 많습니다. 가상의 예시) "I think A is B", "No, A is equivalent to B" 이런 대화가 많습니다. 이렇게 꼼꼼히 따져가면서 공부하시는 것은 개인에게는 당연히 좋은 일입니다만, 이 강의의 목표는 문법 자체를 꼼꼼히 익히는 것이 아니라는 점을 어느정도 감안을 하고 보셔야할 것 같습니다. 강의에 부족한 점이나 오류가 없다는 얘기는 아닙니다. 제가 언어 전공자가 아니라는 점도 한계가 있는 것 같고 개인적인 지향성도 응용 분야 쪽이라는 점도 영향이 있을 것 같습니다. 참고로 프로그래밍 언어 자체를 전공하신 분들도 계시니까 엄밀한 공부를 원하신다면 그런 분들의 강의나 교재를 보시는 방법도 있을 것 같습니다. 원 교재 같은 경우 예전에는 레딧에서 learncpp 보고 공부한 사람 걸러라 라는 얘기도 있었는데 최근에는 오랜 기간 동안 엄격한 검증을 거쳤기 때문에 많이 개선되었을 것으로 생각됩니다. 두 분이 좀 더 옥신각신 하시는 것도 좋은 의사소통 연습이 될거라고 봅니다. 저는 제가 항상 옳은 것은 아니라는 얘기를 하려다가 좀 길어졌네요.
- 1
- 2
- 251
질문&답변
2024.02.11
10분 15초경 질문
원 질문글에 대한 답변이 틀린 부분이 있어서 수정해 놓았습니다.간단히 요약하면 C언어에서 배열 대입을 안해주기 때문입니다.제가 틀린 부분은 이 오류는 Text segment가 read-only인 것과는 상관 없다는 점입니다. 부연 설명도 같이 적어놨습니다.아래 AI 자동 답변은 저와 무관합니다.
- 2
- 2
- 318
질문&답변
2024.02.11
(강의 10:21) 배열의 이름 dest에 "Start something"을 대입하는 것이 안되는 이유
안녕하세요? 오랫만에 이 질문에 대해 다시 질문이 들어와서 봤는데, 아래 답변에 잘못된 부분이 있어서 수정하겠습니다.gcc에서 아래 코드를 컴파일하려고 시도하면char dest[100] = "";dest = "Do Something";error: assignment to expression with array type배열에 대입하려고 시도했다는 에러가 발생합니다.C언어에서는 배열의 값을 바꾸고 싶을때 간단한 대입을 사용할 수 없습니다.strcpy, memcpy로 메모리 블럭을 복사하거나 아니면 for문으로 하나씩 대입해야 합니다.우리 입장에서는 그냥 좀 해주지 싶겠지만 C언어를 설계하신 분들 입장에서는 사용자가 해야할 일이라고 판단하신 것으로 추측됩니다.반면에 초기화할때는 가능합니다.char dest[100] = "Do Something"; // 그 다음은 제가 답변드리면서 헷갈렸던 사안인데,char *a = "Do Something";a[0] = 'A'; // printf("%s\n", a); // 이 부분은 강의 다른 부분에 설명이 있었을텐데 "Do something"은 프로그램의 일부로써 read-only 읽기 전용 영역에 들어있기 때문에 변경 시도가 어떤 문제를 만드는 것입니다. 반면에 아래 코드는 정상작동합니다. 왜냐하면 dest 배열이 스택에 수정가능한 메모리를 갖고 있고 거기에 "Do something"이 복사되어 있는 상황이라서 dest[0]으로 한 글자를 수정할 수 있습니다.char dest[100] = "Do Something";dest[0] = 'A';printf("%s\n", dest); 다시 원래 질문글로 돌아오면,error C2106: '=': left operand must be l-valueVS의 컴파일러에서 제공해주는 에러 메시지가 모호했던 것 같습니다.저는 문법 확인용으로 gcc를 급하게 사용하고 싶을 때 온라인 컴파일러를 사용합니다. 아래 캡쳐 화면 참고하세요.(사진)
- 1
- 2
- 450
질문&답변
2024.02.06
다중 상속 시 부모 클래스 간 생성자 호출 순서가 궁금합니다.
아 그리고 이런 생성자 호출 순서를 고려해야 하는 작업이 있나요? 객체지향적으로 설계한다면 생성자의 호출 순서에 따라 결과가 바뀌도록 설계하진 않을 것 같아서요.-> 이상적으로는 그렇게 생각하실 수 있지만, 실제로는 그런것들까지 고려해서 작성합니다. C++을 사용할 때는 (보통) 성능을 위해 다른 요소들을 희생시키는 경우가 많습니다. (예: 비숙련자를 위한 API 편의성)
- 1
- 2
- 433