게시글
질문&답변
컨테이너 클래스 IntArray 과제 피드백 요청
안녕하세요? 질문&답변 도우미 Soobak 입니다. 메모리 접근과 관련된 일부 부분을 제외하고, 전반적으로 잘 구현하셨습니다. 👍 꼼꼼히 살펴보고 피드백 드려봅니다.void resize(const int& size) { int* temp_data = new int[size]; for (int i = 0; i = m_length) { temp_data[i] = 0; } } delete[] m_data; m_length = size; m_data = temp_data; }: resize() 함수의 구현에 있어서 기존의 크기보다 새롭게 할당하는 크기가 큰 경우, 읽지 말아야 할 메모리에 접근하게 됩니다. 즉, i >= m_length 일 때에도 m_data[i] 에 접근하므로 정의되지 않은 동작이 발생하게 됩니다. 또한,void insertBefore(const int& insert, const int& before) { if (before m_length) { std::cout : 여기에서 temp_data[i] = m_data[j++] 으로 j 값을 매번 증가시키는 경우, 반복문이 끝나기전 j 가 m_length 의 범위를 초과하여 잘못된 메모리에 접근할 수 있습니다. 예를 들어,int main() { IntArray my_arr{ 1, 3, 5, 7, 9 }; my_arr.insertBefore(10, 1); std::cout 질문자님의 코드에서 main() 함수를 위와 같이 바꾸어 메모리 검사를 진행해보면, resize() 함수와 insertBefore() 함수에서 잘못된 메모리 접근이 발생합니다.(사진) 만약, 제가 질문자님의 코드를 수정해본다면 resize() 함수의 반복문 안의 부분을if (i 과 같이 변경한 후, insertBefore() 함수에서 수정된resize() 함수를 활용하여 배열의 크기를 조정할 것 같습니다. 위 내용 이외에는 문제 없이 잘 구현하셨습니다.의욕적으로 학습하시는 점 진심으로 응원드리며, 잘 학습하고 계시는 것 같아 한번 더 응원드립니다! 😁 아래는 문제가 있거나 부족한 부분이 아닌, 코드를 살펴보면서 추가적으로 개선해보셔도 좋을 것 같은 부분에 대한 피드백입니다.IntArray(const std::initializer_list number) { m_length = number.size(); m_data = new int[m_length]; int count = 0; for (auto& arr : number) { if (count : 이 부분에서 if (count 조건문은 불필요한 부분 같습니다. for() 문 내부에서 m_length 만큼 반복하기 때문에 count 가 m_length 보다 커지는 경우가 없습니다. IntArray(const IntArray& copy) { m_length = copy.m_length; if (m_length > 0) { m_data = new int[m_length]; for (int i = 0; i : 복사 생성자의 경우 복사 대상 배열이 비어있는 경우, 즉, m_length == 0 인 대상 배열의 경우에 대해서 명시적으로 처리하면 더 안전한 코드가 됩니다. 잘 작성하셨습니다! IntArray 구현 과제와 관련된 다른 수강생 분들의 질문&답변 사례도 첨부드리오니, 비교해보시면서 학습에 도움이 되시길 바래봅니다.https://www.inflearn.com/questions/1410565(링크)https://www.inflearn.com/questions/1419179(링크)https://www.inflearn.com/questions/1038899(링크)https://www.inflearn.com/questions/1133894(링크)https://www.inflearn.com/questions/1453235(링크)
- 1
- 2
- 20
질문&답변
강의를 신뢰할수가 없습니다.
안녕하세요? 질문&답변 도우미 Soobak 입니다. 아래 답변 글의 댓글 또한 읽고 답변을 드려봅니다.코드를 작성하기 이전, 환경을 설정하는 것은 생각보다 어렵고 복잡한 부분입니다.특히, Visual Studio Code 의 경우에는 그 설정을 하는 것이 더욱 복잡합니다.따라서, 입문 단계에서는 Visual Studio 를 사용해보시는 것을 권장 드립니다.( Visual Studio Code 와 Visual Studio 는 다른 프로그램입니다.)강의에서 Visual Studio 의 사용법 또한 안내해주시므로, 쉽게 해결될 문제인 것 같습니다.저 또한 한 명의 수강생으로서, 비전공자에서부터 개발자가 되기까지 가장 큰 도움을 받은 강의 중 하나라는 점은 꼭 말씀드리고 싶습니다.질문자님께 맞는 길을 따라서 좋은 결과 이루시길 진심으로 바랍니다.
- 0
- 2
- 96
질문&답변
강의를 따라했는데 강의화면과는 다른결과가 나옵니다. 더 이상 강의를 진행할수가없네요
안녕하세요? 질문&답변 도우미 Soobak 입니다.환경 설정과 관련하여 최근 질문하신 글에 답변 남겨드렸습니다.
- 0
- 2
- 43
질문&답변
강의에서 while 문 오름차순 -> 내림차순으로 변경입니다.
안녕하세요? 질문&답변 도우미 Soobak 입니다. 해당 강의에서 권장된 'while() 반복문 사용 패턴을 응용한 다양한 시도' 를 잘 실천하셨네요.학습하신 내용의 공유 감사합니다.앞으로의 학습도 응원하겠습니다.👍궁금하시거나 어려우신 내용 있으시면 편히 질문 남겨주세요.
- 1
- 1
- 17
질문&답변
int array 과제 피드백 부탁드립니다!
안녕하세요? 질문&답변 도우미 Soobak 입니다. initialize_list 를 통한 생성자에서 push_back() 을 통해 처리하는 방식도 물론 가능한 방법 중 하나입니다.다만, push_back() 함수를 호출함으로써 각 요소마다 capacity 검사와 resize() 함수의 호출이 이루어진다는 점에서 효율성이 낮아지게 됩니다.또한, initialize_list 는 객체의 생성 시점에서 초기 값들을 한 번에 설정하기 위한 목적으로 설계되었음을 고려하여, '멤버 변수들을 직접 초기화' 하는 것이 보다 더 명확한 코드가 될 것 같습니다. 위 피드백과 관련하여, 기본 생성자에서 initilize() 함수를 호출하지만 m_capacity 는 0 인 상황이되므로 의미없는 메모리 할당을 수행하게 됩니다. 기본 생성자의 인수가 0 이거나 없는 경우(기본값)에 대해서 추가적인 처리를 해주시면 더 좋을 것 같습니다. 메모리 관리는 언제나 중요하므로, 소멸자에서 reset() 함수를 통해서 꼼꼼하게 메모리 누수를 방지한 점은 잘 작성하셨다고 생각됩니다. 추가적으로, insert() 함수에서 idx 가 0 보다 작은 경우, 혹은 m_length 보다 큰 경우 등에 대한 예외처리도 고려해보시면 학습에 도움이 되실 것 같습니다. 학습에 도움을 드리기 위해서 조심스레 피드백을 드렸지만,개인적으로 문법 학습 단계에서 이미 훌륭히 잘 구현하신 IntArray 라고 생각하며, 특히 질문자님 스스로 과제를 수행하려하신 노력이 잘 보여지는 코드인 것 같아 더 응원을 해드리고 싶네요. 마지막으로, 실제 STL 의 컨테이너들은 '효율성' 을 위해서 capacity 를 "필요할 때 마다, 필요한 만큼", 혹은 1 씩 증가시키지 않고, 어느정도 여유롭게 메모리를 할당하여 효율성을 향상시킨다는 점도 안내드려봅니다. 잘 구현하셨습니다! IntArray 구현 과제와 관련된 다른 수강생 분들의 질문&답변 사례도 첨부드리오니, 비교해보시면서 학습에 도움이 되시길 바래봅니다.https://www.inflearn.com/questions/1410565(링크)https://www.inflearn.com/questions/1419179(링크)https://www.inflearn.com/questions/1038899(링크)https://www.inflearn.com/questions/1133894(링크)
- 1
- 2
- 36
질문&답변
pa와 ap
안녕하세요? 질문&답변 도우미 Soobak 입니다. float arr2d[2][4] = { {1.0f, 2.0f, 3.0f, 4.0f}, {5.0f, 6.0f, 7.0f, 8.0f}}; 은 2 x 4 배열로 8 개의 float 값이 선언되어있지만, 중요한 점은 2 개의 행, 각 행당 4 개의 열을 가진 2차원 배열이라는 점입니다.이 때, float(*pa)[4] 는 "4 개의 float 원소를 가진 배열을 가리키는 포인터" 이며, 이는 2차원 배열에서 한 행을 가리키는 포인터입니다. 따라서, 정확히 한 행의 크기인 4 를 명시해주어야 합니다.만약, float(*pa)[8] 처럼 크기를 8 로 선언하신다면 "8 개의 float 원소들을 가진 배열을 가리키는 포인터" 가 되어, 현재의 2 x 4 배열 구조와 맞지 않게 됩니다.크기 4 는 pa + 1 과 같은 포인터 연산 등에 필요한 정보이므로 알맞게 작성해주어야 합니다. float(*pa)[4] 에서 괄호가 없다면, 즉, float *pa[4] 과 같이 선언한다면 "4개의 float 포인터 배열" 을 의미하게 됩니다.하지만, 괄호를 사용함으로써 float(*pa)[4] 는 "4개의 float 원소를 가진 배열을 가리키는 포인터" 라는 의미를 갖게 됩니다. 또한, 2차원 배열은 메모리에 연속적으로 저장된다는 점( float arr2d[2][4]는 8 개의 float 이 연속된 메모리 공간에 저장됨)과 포인터 연산의 특성(pa + 1 은 4 개의 float 크기만큼 이동하여 다음 행을 가리킴, ptr[1] 은 두번 째행의 시작주소)으로 인하여 모두 같은 메모리 위치를 가리킬 수 있기 때문에 float(*pa)[4] 는 이중 포인터와 호환이 가능한 형태로 사용될 수 있습니다.예제의 핵심에 대하여 말씀하신 부분은 잘 이해하신 것 같습니다.다만, 전반적으로 더욱 중요한 부분 해당 강의의 다양한 예제들을 통해 보여지는 2차원 배열과 포인터의 관계라고 생각합니다. 궁금한 점 있으시면 편하게 댓글 남겨주세요.
- 1
- 2
- 18
질문&답변
null 문자에 관해서 질문드립니다.
안녕하세요? 질문&답변 도우미 Soobak 입니다.바로 위에 작성해주신 질문 글에 답변을 작성 드렸습니다.
- 1
- 2
- 37
질문&답변
11.3 (8 : 35) 질문드립니다. (널 문자, 빈칸)
안녕하세요? 질문&답변 도우미 Soobak 입니다. 네, 실행 환경과 콘솔 출력에 관한 설정에 따라서 정렬이나 폰트 등이 다르게 출력될 수 있습니다.코드의 로직에 따라서 질문자님과 같이 출력되는 것이 옳습니다.한 번, 해당 강의의 앞 부분에서 다루어진 메모리 디버깅을 통해서 어떤 값이 들어가 있는지 직접 확인해보는 것도 좋은 학습 방법이 될 것 같습니다.
- 1
- 1
- 21
질문&답변
코드 c4996 오류
안녕하세요? 질문&답변 도우미 Soobak 입니다. strcpy() 함수가 메모리 침범을 할 위험성이 있기 때문에 안전하지 않다는 내용의 오류가 발생하는 것입니다. (해당 강의 11:00 부분의 경고창이 노출되는 부분을 참고해보시면 이해에 도움이 되실 것 같습니다.)강의에서 정상적으로 동작하는 이유는, 경고 수준과 오류 수준이 환경과 컴파일러 버전 등에 따라서 조금씩 달라질 수 있기 때문입니다.학습의 목적으로 strcpy() 함수를 사용해보시려면, 다음과 같이 #define CRTSECURE_NO_WARNINGS 코드를 맨 윗줄에 작성하여 보세요.#define CRTSECURE_NO_WARNINGS #include #include using namespace std; int main() { char source[] = "Copy this!"; char dest[5]; strcpy(dest, source); cout 이러한 메모리 침범의 위험성에 대한 이유로 strcpy() 함수보다 strspy_s() 를 쓰도록 권장되고 있습니다. 이에 대해서는 교수님께서 해당 강의에서 이어지는 strcpy_s() 함수의 사용 예시와 함께 설명해주시니 참고해보시면 도움이 되실 것 같습니다.
- 1
- 2
- 40
질문&답변
namespace가 필요한 경우가 이런 경우일까요?
안녕하세요? 질문&답변 도우미 Soobak 입니다. 학습 초반 단계부터 벌써 개념을 잘 확장하고 응용하여 생각하시는 점이 인상 깊네요.namespace 를 이용해서 같은 이름의 함수들을 논리적으로 구분하여 사용하기도 하지만,말씀해주신 예시(게임의 직업)의 경우 강의 8.1 객체지향 프로그래밍과 클래스 부터 학습하시게 되는 class 라는 더 좋은 개념이 있습니다. namespace 의 경우 주로 코드의 논리적 구조화, 관리 측면에서 많이 사용하게 됩니다.해당 강의에서 더욱 자세히 학습하시게 되겠지만, class 를 이용하면 '직업' 이라는 개념을 추상화하여 상속과 다형성을 구현하실 수 있고, 공격력/방어력/체력 등의 '상태' 또한 가질 수 있도록 하실 수 있게 됩니다. (지금은 단어가 낯설으실 수 있지만 강의를 수강하시면서 자세히 학습하고 자연스럽게 익숙해지실 개념들입니다.)학습 초반 단계이심에도 불구하고, 벌써 질문자님께서 관심있어하시는 내용과 잘 연결지으며 재미있게 공부하시는 것 같아 응원을 드리고 싶네요!
- 1
- 2
- 24