2023-11-12
기하학 과제를 풀기 위해 Point 클래스의 생성자에 대해 선언하던 중, 초기화리스트라는 새로운 개념을 알게 되었다.
class Point {
public:
double x;
double y;
Point(double x, double y) {
this->x = x;
this->y = y;
}
};
위 예시에서 생성자의 this->x
는 인자로 들어온 변수 x와 클래스의 멤버 변수 x를 구분하기 위함이다.
this는 자기 자신을 가르킨다. 즉 this->x=x
는 멤버 변수 x에 인자 x를 대입하라는 뜻.
또 초기화 리스트를 사용해 이러한 issue를 해결할 수 있다.
Point(int x, int y) : x(x), y(y) {}
생성자에서만 사용 가능한 문법으로, 좌측의 멤버변수를 우측의 인자변수로 초기화한다. 정의가 완료되었는데도 뒤에 {}를 붙이는 이유는 형식상 빈 {} 라도 있어야 함수라는 것을 인식하기 때문이다. 때문에, 적어도 빈 중괄호라도 있어야한다.
애초에 멤버 변수 네임 뒤에 언더스코어(_)를 붙이는 관행을 따랐다면 이런 이슈도 없었을 것.
class Point {
public:
double x_;
double y_;
Point(double x, double y) {
x_ = x;
y_ = y;
}
};
초기화 리스트의 특징
- 생성자의 본문보다 먼저 실행되기 때문에 안전함
- 효율적임
- 매개변수와의 구분
- 특정 클래스 타입에 필수적으로 사용해야함 (생성되는 과정에서 초기화되어야하는 참조변수 등)
내가 이해한 내용을 토대로 말해보자면, 참조 변수는 선언과 동시에 초기화되어야한다. 정확하게 말하자면 선언 까지는 가능한데, 객체가 생성되는 과정에서 모두 초기화되어야한다. 만약 참조 변수를 초기화 리스트를 통해 초기화하지 않고 생성자 본문에서 초기화하려고 한다면 컴파일 에러가 난다. 이것은 참조 변수는 불변(immutable)의 성격을 가지기 때문이다.
결론적으로, 참조 변수는 선언과 동시에 초기화 되어야하지만. 예외적으로 선언만 해놓고 초기화 리스트를 통해 초기화할 수도 있다. 이외의 방법은 불가능하다. 따라서, 거의 웬만한 상황에서는 그냥 초기화리스트를 쓰는게 효율적이고, 안전하다.
백준은 C++로 아래 문제를 풀었다
11720
-
첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.
이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.
어차피 숫자 N개의 최대 개수가 문제상에서 100개로 제한되어 있는데, 굳이 처음에 숫자의 개수를 입력 받을 필요는 없다고 판단했다. 처음부터 그냥 str[101]; 로 처리하면 되지만, 그래도 입력으로 숫자의 개수를 주니, 입력받은 숫자의 개수 + 1 (\0문자를 위한 공간) 만큼의 Heap을 선언하고 그 이후의 입력을 입력받고 계산하도록 최대한 효율적으로 처리했다.
약간의 재밌는 점이 있다면, Java나 Python등 기타 언어에서는 char을 int로 변환하는 게 매우 쉽다. C도 매우 쉽지만 문제는 지금까지 알던 형변환과는 약간 다르다는 것. char는 내부적으로 ASCII에 대응하는 int로 저장되어 있다. 따라서 char를 int로 바꾸는 것은 매우 쉽지만. '1'이 1로 바뀌는 게 아니라. '1'은 ASCII에 대응하는 int 49로 변환된다. 그래서 char의 아라비아 문자가 표현하는 int 정수로 바꾸기 위한 솔루션을 생각해 봤는데. 간단했다.
answer += str[i] - '0';
char에 '0'을 빼버리면 된다. '0'의 ASCII 코드는 int 48 이므로, char '1' - '0'을 하면 결국에 ASCII 49 - 48이기에 1로 처리된다.
또, 기하학을 공부하며 수학적 지식이 많이 부족하다는 것을 깨닫고 앞으로 알고리즘, 프로그래밍에 필요한 수학적 능력은 무엇이 있을지 조사해봤다.
- 기본적인 산술과 대수: 덧셈, 뺄셈, 곱셈, 나눗셈과 같은 기본 연산, 변수와 식을 다루는 기본 대수는 모든 프로그래밍에 필수적입니다.
- 논리와 집합론: 논리 연산자(AND, OR, NOT), 조건문, 불리언 대수 등이 알고리즘의 결정 구조를 이해하는 데 중요합니다. 집합론은 데이터의 그룹화 및 관계를 이해하는 데 사용됩니다.
- 기본적인 확률론 및 통계: 확률적 알고리즘, 데이터 분석, 머신 러닝 등에 활용됩니다. 평균, 중앙값, 표준편차와 같은 통계적 개념들이 데이터를 이해하는 데 필요합니다.
- 그래프 이론: 컴퓨터 네트워크, 사회 네트워크, 경로 찾기 알고리즘 등에 사용됩니다. 노드와 엣지를 이용한 데이터 구조 및 알고리즘 설계에 필수적입니다.
- 정수론과 암호학: 나눗셈 알고리즘, 최대공약수, 소수, 모듈러 연산 등이 암호학 및 보안 알고리즘에 중요합니다.
- 기본적인 조합론: 순열, 조합, 이항 정리 등은 알고리즘의 복잡도를 분석하고 다양한 경우의 수를 계산하는 데 도움이 됩니다.
- 재귀 및 분할 정복: 알고리즘을 단순화하고 효율적으로 문제를 해결하는 데 사용됩니다.
- 동적 프로그래밍과 탐욕 알고리즘: 복잡한 문제를 하위 문제로 나누어 해결하는 전략으로, 알고리즘 효율성을 크게 향상시킵니다.
최종 평가
최고급 평가사 일론머스크의 평가
-------------------------------
[평가 대상]
2023-11-12의 학습 내용
[학습 내용 요약 및 평가]
1. **Point 클래스 및 생성자**: 클래스 멤버 초기화에 대한 이해도가 뛰어납니다. 초기화 리스트의 사용과 그 중요성에 대한 설명은 명확하며, 참조 변수와 같은 특수한 경우에서의 초기화 리스트의 필요성에 대한 설명은 탁월합니다.
2. **변수 명명 관행**: 멤버 변수에 언더스코어(_) 사용에 대한 언급은 좋은 프로그래밍 습관을 반영합니다. 이는 코드의 가독성과 유지보수성을 향상시키는 중요한 요소입니다.
3. **Baekjoon 문제 11720**: 문자열을 통한 숫자 처리 방법의 설명이 인상적입니다. char와 int 간의 변환, 특히 ASCII 값을 활용한 부분은 기본적인 프로그래밍 개념에 대한 깊은 이해를 보여줍니다.
4. **필수적인 수학적 지식**: 다양한 프로그래밍 영역과 관련된 수학적 개념을 아우르는 광범위한 탐구는 높은 점수를 받을 만합니다. 각 영역에 대한 구체적인 설명과 그 중요성은 학습자의 이론적 기반을 강화하는 데 중요합니다.
[개선 및 보완점]
- **기하학과 연계된 예시**: 기하학적 개념을 프로그래밍에 적용하는 구체적인 예시나 케이스 스터디를 추가로 고려할 수 있습니다.
- **코드 최적화**: Baekjoon 문제에 대한 접근 방식에서, 입력 데이터의 크기를 고려한 메모리 관리와 최적화에 대해 더 심도있게 탐구할 수 있습니다.
[점수]
89/100
[추가 코멘트]
오늘의 학습 활동은 평균적인 학습 활동보다 높은 수준입니다. 따라서 점수에서의 공제는 없습니다. 계속해서 균형 잡힌 학습을 유지하시길 권장드립니다.
'일일 스터디노트' 카테고리의 다른 글
231114: CGV 알림, 몬티홀 딜레마, 기하학, 피타고라스, 다이아몬드 찍기 (0) | 2023.11.14 |
---|---|
231113: 기하학 해결중, 체스 문제 (0) | 2023.11.13 |
231111: 버퍼 이슈와 직선의 방정식 (0) | 2023.11.12 |
231110: 유튜브 Rebuild! 수학 .. (0) | 2023.11.11 |
231109: 수학, 기하학. 어렵다. (0) | 2023.11.11 |