発見メモ
2024.12.4(水)
・基数は進数のことを表している
・リソースが限られている状況や高い計算精度が求められるアプリケーションでは、適切なデータ型の選択が不可欠
・null は、データを読み取る際にメモリに何も存在しないことを表し、非常に重要な役割を果たしている
・プログラムの構成要素は、機械語・処理対象となるデータ
・アセンブリ言語(プログラミング言語)
→コンパイル(コンパイラーによる変換)
→実行可能なプログラムファイル
←CPUが解釈・実行
※コンパイラとは、人間が理解できる言語から機械語に翻訳するプログラム
・より一般的なデータ構造:配列やリストは、あらゆるデータ型の複数の値を格納できる
・文字列はテキストベースのデータを格納し操作するために特別に設計されている。
・Javaプログラムの main メソッドで String[] args が使われている理由は、プログラム外部から値を受け取るため。コマンドライン引数をプログラムに渡すため。main メソッドはプログラムのエントリポイントとして、外部から渡されるデータを受け取るための仕組みを持っている
→コマンドラインから渡される引数はすべて文字列型(String)として扱われる。
たとえ引数が数値やその他の形式で入力されても、最初は文字列として受け取られる。
・引数が1つだけではなく、複数渡される可能性があるため、配列で受け取れるよう[]を入力している
・コンパイラは、変数に自動的にメモリアドレスを割り当て、そのアドレスを使ってメモリ内のデータにアクセスし操作する機械語を生成
・インタープリタ式言語はプログラムがソースコードの各命令を直接処理しなければならないため、コンパイル言語よりも実行速度が遅くなることもある
→インタープリタ式言語はプログラムを一行ずつ解釈しながら実行していく
2024.12.5(木)
・コンパイラは、プログラムを「文法的に正しいか」確認するもの。
・オーバーフローは「実行時」に発生する現象であり、コンパイラのチェック対象ではありません。
・オーバーフローについて
オーバーフローが発生すると、余った分がそのデータ型の最小値に巻き戻り(循環し)、そこから再計算される。
・√x は Math.sqrt(x) を使って求めることができる
・public - どんなクラスでも使用可能
・static - インスタンスがなくても使用可能
・/ 2は * 0.5に書き換えてOK
・わざわざ全て求めなくていい、必要最小限に留める努力が必要
・関数の戻り値がブーリアン型であれば、if文を省略できる
・if文は条件としてブール値を期待している
→述語の結果を直接返すことができる
2024.12.6(金)
・参照とは、アドレスのこと
・Javaでは、小文字の型名はプリミティブ型を表し、大文字の型名はそのプリミティブ型に対応するラッパークラス(オブジェクト型)を表している
・指数(べき乗)が 0.5 の場合、それは平方根(ルート)と同じ意味
=ある数 x を 0.5 乗するということは、その数の平方根を求めることと等しい
→ x ^ 0.5 = √x
・連鎖比較(chained comparison):Python独自の機能
指定範囲をまとめて記述することができる
・f文字列により、データ型を自動的に文字列に変換することができる
・(Java) '' : char型、 "" : String型
2024.12.7(土)
・Javaにおいて、charAt(0) メソッドは指定した位置の1文字を char 型 として返すがゆえ、String.valueOf()でString型に変換することが必要なことが多い。
・定数は原則、値を変更できない。例外的に、参照型(オブジェクトや配列)の場合は値を変更できる。
・ブール値を返す関数の名前には「is」をつける傾向にある。
・関数の合成において、簡潔さを犠牲にしてでも、ロジックを明確にすることが可読性・再利用性のために重要。
・再帰関数において、ベースケースは関数に戻り値を保証する。
2024.12.8(日)
・再帰関数
ベースケース(終了条件)を常に考慮すること
追跡する引数を考える
・Pythonのmathモジュールは浮動小数点をデフォルトにしている
・何かを繰り返すと求めたいものに近づけるか
・相対誤差は古い値を基準に計算する
a - b / b (b : 古い値)
・基準値を分母にする
・1 はほとんどの数に対して適切な初期近似値
・再帰関数において補助関数を頻繁に使うことがある
・アルゴリズム/データ構造/計算量
・関数呼び出しは四則演算より優先される
2024.12.9(月)
・再帰の強みは、漸化式だけで問題を解けること。数学的な一般項を導き出す必要がない。
※再帰は分割した問題を1つずつ解くため、計算回数が多くなることがあるため、効率性を考える必要はある。
数学的に一般項を導き出さなくても、前後の関係性(漸化式)さえ表すことができれば、プログラムに自動で計算させることができるのが再帰の強み。
・再帰の問題は前後関係を押さえることが超重要。
・時間計算量/空間計算量を意識していこう。
・再帰ケースでの場合分けする場合、ベースケースとの違いに注意すること。
・PythonやJavaは末尾呼び出し最適化をサポートしていない。
2024.12.10(火)
・Javaは末尾呼び出し最適化をサポートしていないため、スタックが積み上がり、空間計算量がO(1)にならない。
・再帰が深い場合は、ループに置き換えることで、スタック使用量を削減し、空間計算量をO(1)にする。
・コンピュータはプログラムの実行時、変数が宣言されたときに型に応じたサイズのメモリ領域を確保する。
2024.12.11(水)
・名前の紐付けとシンボルテーブルの関係性
・動的型付け言語では、ソースコードが一行ずつ解釈されるため、変数宣言のコードを解釈したときに、メモリアドレスが割り当てられる。対して、静的型付け言語ではコンパイル時にメモリアドレスが割り当てられる。
・同じ名前の変数がローカルスコープで宣言される場合、親スコープ(グローバルスコープなど)の変数を参照しない(一時的デッドゾーン)。
・let や const を使わずに値を代入した場合、その名前がグローバルスコープに存在しなければ、JavaScript は暗黙的に「グローバル変数」を作成するという特徴がある。
・静的型付け言語では、変数は「宣言後」でないと利用できない。
・静的型付け言語では、スコープはコードブロック{ }内でのみ有効。
・関数が作られると、新しいスコープが作成される。関数の引数がそのローカルスコープに最初に紐付けされることに注意。
2024.12.12(木)
・メソッドに渡された引数は、そのメソッド内でのみ有効な変数として扱われる。メソッドが終了すると、その引数はメモリから解放され、アクセスできなくなる。
・関数内のconsole.log()やprint()は、その関数が実行された際の内部的な状態や結果を出力するために使用される。デバッグやログ出力、または関数が期待通りに動作しているかを確認するために役立つ。
・静的メンバは、クラスがロードされる際にメモリに割り当てられる。そのため、インスタンスが生成される前から存在する。インスタンスメンバは、インスタンスが生成されるたびにメモリに割り当てられる。
・関数を実際に呼び出したい場合は、括弧()を付ける必要がある。括弧がない場合、PHPは関数を呼び出す意図ではなく、単に関数名を評価しているだけと解釈される。
・プログラムが関数を呼び出すと、関数の処理に必要な情報(ローカル変数、引数、戻り先アドレスなど)がスタック領域にスタックフレームとして積み上げられます。
・関数の呼び出しがコールスタックに追加され、一時的なメモリを作成し、ポップされると呼び出しの中に存在する全てのデータが消去される。
・全ての関数は、個別のローカルスコープで実行される。
・もし適切なテストやエラーが実行前に検証されていない場合、副作用による論理的なエラーによって莫大な損害をもたらす可能性があることを認識すること。
・引数は異なるスコープ間でデータをやりとりするための仕組み。
・Javaにおけるクラス定義にstatic キーワードの使い分け
Javaの仕様として、トップレベルのクラス(他のクラスの中に含まれていない、単独で定義されたクラス)にはstaticキーワードを付けることはできません。staticは、クラスのメンバ(変数やメソッド、内部クラス)に対してのみ使用できる修飾子。
外側のクラス(トップレベルクラス)にはstaticは付けられない
まず、Javaの仕様として、トップレベルのクラス(他のクラスの中に含まれていない、単独で定義されたクラス)にはstaticキーワードを付けることはできません。staticは、クラスのメンバ(変数やメソッド、内部クラス)に対してのみ使用できる修飾子です。
内部クラス(ネストクラス)におけるstaticの役割
クラスの中に定義されたクラスを内部クラス(ネストクラス)といいます。内部クラスには、大きく分けて以下の2種類があります。
非静的内部クラス(インナークラス): staticが付いていない内部クラス。
静的内部クラス(静的ネストクラス): staticが付いている内部クラス。
静的内部クラスは、外側のクラスのインスタンスに依存しません。つまり、外側のクラスのインスタンスを作成しなくても、静的内部クラスのインスタンスを作成したり、静的メンバにアクセスしたりすることができます。
インスタンス化
非静的内部クラスの場合:外側のクラスのインスタンスを通してのみインスタンス化できます。
静的内部クラスの場合:外側のクラスのインスタンスなしに直接インスタンス化できます。