Findy × O’Reilly 学び放題プログラムに当選したため、この機会にたくさん本を読んで知識を増やそうと思い始めた読書メモです。
書籍の内容ではなく、何を得られたかに重点を置いて自分のための読書備忘録も目的としています。
1. なぜこの本を選んだか
(書籍を選んだ背景や、今の自分の課題・興味。どんな期待を持って手に取ったか。)
ruby を経て静的型付け言語でオブジェクト指向の理解を深めるため Java 学習中のため、Java とは?の学習に選択
2. 何が学べたか
(実際に得られた発見や気づき。自分なりの収穫、意外だったこと、考えが変わった点など。)
でたなプリミティブ型...!!オブジェクトでないカタチなんて概念をそもそも持っていなかった(Rubyにはなかった)ので結構苦しめられたやつ...!!
静的型付け言語でも、動的に型をロードできるリフレクション機能
静的型付け言語って型を指定するから安全。の印象しかなかったけど変更したいときは毎度手動でコンパイルするのは大変そう...えっ、そこは動的にやるの?融通ききますねぇ...!!
- はじめはコンパイル時に型が決定(静的型ロード)
- その後は、JVM の仕組みにより実行時に新しい型をロードする(動的型ロード)
- Spring Boot などのフレームワークは、リフレクションを活用して設定ファイル(application.properties)やアノテーションから自動的にクラスをロードする
ここがややこしかったので整理してみよう
Javaの型
├── プリミティブ型
│ ├── オブジェクトを持たない
│ ├── ローカル変数の場合はスタックメモリに値が格納される
│ └── 例:int, boolean, double
│
└── リファレンス型
├── オブジェクトを持つ
├── 参照(ポインタ)はスタック、実体(オブジェクト)はヒープメモリ
└── 例:String, Integer, List
│
└── ラッパークラス
├── プリミティブ型をオブジェクト化
├── 例:Integer, Boolean, Double
└── オートボクシング/アンボクシング(※一部値はキャッシュで共有)
ラッパークラスはスタックメモリではなくヒープメモリになるんだ!
プリミティブ型とは
- 前提としてオブジェクトではない
- メモリ消費を抑えられ、単純な値に用いられる
- 先入後出しのスタックメモリ(↔︎ ヒープメモリ)に直接格納されるため管理が自動
スタックメモリとは?
リファレンス型とは
- 新しいクラスを定義すると、その型(クラス)が作成され、インスタンスはリファレンス型として扱われる
- 対するはプリミティブ型
- この2つがあるのは Java はパフォーマンスとメモリ効率を重視した設計になっているため
ヒープメモリとは?
- 格納対象がオブジェクトなど複雑なものが扱える
- GC が回収するまでメモリ保管
- ヒープとは山積みの意味で、順序がないため柔軟性は高いが管理コストありアクセス速度が落ちる可能性あり
- 使用シーンとしては、ユーザー情報や商品データ、db 接続、ログ出力、セッション情報、ビジネスロジック(@Service, @Repository, @Controller など)
例えば最終更新日時をとりたい場合だと、最新以外は不要になるから、最終更新日はスタックでもいいと思う。 逆に少し管理コストがかかっても1時間分のデータがまとめて入ってくるときは並び替えて保管したいからヒープメモリかなと思う。
3. どんな知識があると読みやすいか
(読者が事前に持っていると理解しやすい知識や経験。前提、基礎、関連分野など。)
プリミティブ型がオブジェクトを持たないという前提を聞いたことがあれば読みやすくとてもわかりやすいです。
4. 次にどんな知識を入れたいか
(この本を読んで広がった興味や、今後深掘りしたいテーマ。関連書籍や実践したいことなど。)
型について少しずつ分かってきたので引き続き型のメリットやデメリットを意識したい。
5. こんな人におすすめ
(どんな目的や課題を持った人に特におすすめか。読者への一言メッセージで締め。)
プリミティブ型はオブジェクトではない?、ではオブジェクトとして扱いたいときは?メモリ効率が良くなるからプリミティブ型がある?この辺りの疑問を言語化したい方におすすめです。