게시글
질문&답변
독립적인 함수 vs 종속적인 함수
안녕하세요? 질문&답변 도우미 Soobak 입니다. 좋은 질문이시네요.말씀하신 문제점들에 대해서는 프로그래머가 항상 고민하고, 공부하고, 염두해두며 코드를 작성하려고 노력하며 풀어내야 한다고 생각합니다.언어의 문법에 대한 내용 이외에도 프로그래밍의 구조를 설계하고, 디버깅 뿐만 아니라 가독성과 유지보수성도 고려하며 "어떻게 하면 '좋은 코드' 를 작성할 수 있을까?" 그리고 '좋은 코드' 란 무엇일까? 등등에 대해서 많은 사람들이 함께 고민하고 방법이 발전되어왔습니다.그 중 하나가 C++ 에서 문법적으로 지원되는 '객체 지향' 입니다. (섹션 9. 객체지향의 기초 와 이후의 강의에서 학습하시게 됩니다.)프로그래밍 구조를 설계하고 코드를 작성할 때, '객체' (클래스) 단위로 책임과 기능을 분리하여 관리하고, add() 와 같은 기본 함수에 대해서 기능을 추가할 때에는 어떻게 할 것인가 등에 대해서 '객체' 라는 관점을 통해 풀이한 방법입니다.이외에도 '디자인 패턴' 이라는, 프로그래머들이 공통적으로 특정 구조를 패턴화하여 의사소통과 유지보수가 잘 이루어지도록 약속한 방법도 있으며, 말씀하신 내용의 문제를 풀어내고자 시도한 다양한 방법들이 있습니다.이미 좋은 관점을 가지고 계시니, 문법 학습을 끝내신 후 해당 내용들에 대해 더 자세하게 학습해보시면 도움이 되실 것 같습니다!
- 1
- 2
- 81
질문&답변
7.2 i = '0'일 때 i++의 계산에 관하여
안녕하세요? 질문&답변 도우미 Soobak 입니다. 네, 맞습니다.for (int i = '0'; i 에서 '0' 과 '9' 는 문자(char)이지만, 말씀하신 내용처럼 내부적으로는 아스키 코드 값을 가집니다.이 때, 문자 '0' 의 아스키 코드 값은 48 이고, 문자 '9' 의 아스키 코드 값은 57 입니다.따라서, int i = '0'; 은 사실상 int i = 48; 과 동일합니다.또한, '0' (48) 에 1 을 더하면, 49 가 되고, 아스키 코드 값 49 는 문자 '1' 을 나타냅니다.따라서, ++i 연산으로 인해 i 는 '0' -> '1' -> '2' -> ... -> '9' 까지 연속적으로 증가합니다.즉, 문자 연산처럼 보여도 사실은 정수 연산이 이루어지고 있는 것입니다.
- 1
- 2
- 51
질문&답변
static int가 아닌 int로도 메모리 주소가 계속 같습니다.
안녕하세요? 질문&답변 도우미 Soobak 입니다. 이해하신 내용들과 생각하신 방향성 모두 문법과 개념적으로 정확하십니다.다만, 컴파일러가 스택 메모리와 관련된 최적화를 진행하여 다음 함수 호출시에도 동일한 주소를 할당 받도록 하여 재사용하도록 하는 것입니다.컴파일러 최적화를 고려했을 때 일반적으로 정상적인 동작입니다.꼼꼼하게 다방면으로 생각해보시면서 직접 실행해보시는 부분이 인상 깊네요! 화이팅입니다.
- 1
- 2
- 51
질문&답변
동적 변수 질문이요!
안녕하세요? 질문&답변 도우미 Soobak입니다. 같지 않습니다.int *r1 = new int[col];: 여기서 r1 은 포인터(int*)이며, 동적으로 할당된 배열의 첫 번째 원소의 주소를 저장하게 됩니다.new int[col] 은 int 타입의 배열을 동적으로 생성하고, 배열의 첫 번째 요소의 주소를 반환합니다. 반면,int r1; int *r1 = &r1; int col = r1;: 이 코드는 우선 문법적으로 옳지 않아 컴파일 오류가 발생합니다.int *r1 = &r1; 이 부분에서, 기존 r1이 이미 정의되었으므로 같은 이름의 변수를 선언할 수 없기 때문입니다.질문주신 내용의 맥락 상으로 int *r1 = &r1; 가 가능하다고 가정하더라도, col = r1; 부분에서 int* 타입을 int 에 할당하는 것이므로 컴파일 오류 발생합니다. 이해를 돕기 위해 동적으로 생성하는 배열이 아닌, 정적 배열에 대한 경우로 예를 들어보자면 다음과 같습니다.int arr[col]; // 정적 배열 선언 int *r1 = arr; // 배열의 첫 번째 요소의 주소를 포인터에 저장: arr 은 정적 배열이며, arr 자체가 배열의 첫 번째 요소의 주소를 나타냅니다. r1 은 arr 의 첫 번째 요소의 주소를 가리키는 포인터입니다. 이와 비슷하게, int *r1 = new int[col]; 에서 r1 은 동적으로 생성된 배열의 첫 번째 요소의 주소를 가리키는 포인터입니다. 마지막에 질문주신 "int *r1의 int랑 new int[col]의 int랑 타입은 항상 같아야 하는가?" 에 대해서는 옳습니다.포인터를 통해 배열의 첫 번째 원소의 주소를 가리킬 때, 포인터의 자료형은 배열의 자료형과 같아야 합니다.
- 1
- 2
- 36
질문&답변
13.4 double 템플릿 추가한 뒤로 obj 중복으로 실행되지 않습니다.
안녕하세요? 질문&답변 도우미 Soobak 입니다. 사진의 콘솔 창과 프로젝트 목록을 자세히 보니, chapter13-4 프로젝트에서 Storage.cpp 파일 뿐만 아니라, 함수 템플릿 특수화.cpp 라는 파일이 있네요. 해당 파일에서 "Storage.h" 헤더를 포함시키고 계시지는 않는지 확인해보시면 좋을 것 같습니다.만약, 두 .cpp 파일에서 모두 동일한 "Storage.h" 헤더를 포함하게 되어 템플릿 특수화가 중복 정의 되어 링킹 과정에서 문제가 발생하게 됩니다.
- 1
- 3
- 54
질문&답변
for each반복문에 대해서요
안녕하세요? 질문&답변 도우미 Soobak 입니다. number 변수에 대해 말씀해주신 설명은 옳습니다.즉, 해당 for 반복문의 지역 범위 안에서만 존재하며, 반복문이 끝나면 사라집니다. 다만, 배열뿐만 아니라, 이터레이터(반복자)를 제공하는 컨테이너에서 모두 사용 가능합니다.예를 들어서, std::array 와 std::vector, std::set, std::map 과 같은 다양한 컨테이너에서 모두 사용 가능합니다.이에 대한 내용은 질문 주신 섹션의 이어지는 강의 6.20 std::array 소개 와 6.21 std::vector 소개, 그리고 추후 섹션 17 표준 템플릿 라이브러리 에서 보다 자세하게 학습하시게 됩니다.
- 1
- 2
- 37
질문&답변
char 포인터 관련 질문
안녕하세요? 질문&답변 도우미 Soobak 입니다. 포인터를 처음 접하실 때 혼동하기 쉬운 부분에 대한 질문이시네요.일반적인 값 을 담는 자료형과 주소 를 담는 포인터 자료형 사이에서 혼동이 있으신 것 같습니다.char 자료형은 말씀해주신 것 처럼, 1 바이트 크기를 가지며, 문자 값을 저장합니다.하지만, char* (문자 포인터) 자료형은 실제 데이터가 저장된 메모리 주소 를 가리키는 주소값을 저장하는 변수 입니다. (운영체제와 컴파일러 환경에 따라 말씀해주신 것처럼 4바이트, 혹은 8 바이트의 크기를 가집니다.)따라서, char c = 'A'; // 1바이트 char *p = &c; // p는 c의 '주소' 를 저장 (4바이트 또는 8바이트): 여기서 p 가 담고 있는 값은 c 의 메모리 주소이며, 포인터 변수는 값의 실제 크기가 아닌, 메모리 주소의 크기를 가지고 있기 때문에 오버플로우와 같은 문제가 발생하지 않습니다. 이해가 어려우시거나 궁금하신 점 있으시면 편히 댓글 달아주세요.
- 1
- 2
- 41
질문&답변
이 워닝은 왜 뜨는 걸까요?
안녕하세요? 질문&답변 도우미 Soobak 입니다. scanf() 함수는 사용자가 입력한 값을 변수에 저장하는 기능을 하는 함수입니다.이 때, scanf() 함수는 '성공적으로 읽은 변수의 개수' 를 반환합니다.즉, 몇 개의 변수를 정상적으로 입력받았는지 확인할 수 있습니다.여기서, 이러한 반환값을 사용하지 않고 있다는 내용과 관련하여 컴파일러가 경고를 출력해주는 것입니다.교수님께서 이어지는 강의에서 설명해주시기도 하는데요, #define CRTSECURE_NO_WARNINGS 전처리기를 사용해서 이러한 경고를 무시할 수 있습니다.보다 자세한 설명이 담긴 교수님의 답변 링크를 첨부드립니다. https://www.inflearn.com/courses/lecture?courseId=324482&unitId=28109&tab=QnA&category=questionDetail&q=67969
- 1
- 2
- 27
질문&답변
2진수 1010 0010 을 무부호 10진수로
안녕하세요? 질문&답변 도우미 Soobak 입니다. 흥미로운 질문이시네요."2진수"그 자체는 프로그래밍에서의 자료형이 아닌 단순한 숫자 표현의 방식으로, 1010 0010₂ 라는 순수한 숫자, 즉 부호 없는 2진수 로 해석하는 것이 가장 자연스럽다고 생각합니다.다만, 말씀해주신 내용처럼, 비트가 부호에 대한 정보를 담고 있는 경우를 고려하는 맥락에서는 질문자님의 말씀대로 두 가지 경우로 변환될 수 있을 것 같습니다.꼼꼼하게 경우를 나누어서 잘 생각하신 점이 인상 깊네요!
- 1
- 2
- 29
질문&답변
안녕하세요 혹시 제가 이해한게 맞을까요
안녕하세요? 질문&답변 도우미 Soobak 입니다. 네, 잘 이해하고 계십니다.void printColorName(Colors color) 함수는 Colors 라는 열거형 클래스 (enum class)의 매개변수 color 를 받습니다.이 때, color 인수는 Colors 열거형 클래스에 정의된 값 중 하나만 가질 수 있습니다.즉, Colors 에 정의되지 않은 값은 인수로 전달할 수 없습니다.열거형 클래스를 사용하실 때에는 Colors::BLACK 와 같이 명시해주셔야 하며, 인수로 값을 전달할 때에도 마찬가지입니다.
- 1
- 2
- 37