- 結論からいうと以下の通りです。
- abstractは、メモリー節約のために使われました。ただし自由度が高すぎて、interfaceが提供されるきっかけになりました。
- interfaceは、ポリモーフィズム(ArrayListとかLinkedListを実現するアレ)を提供するために作られました。
- interfaceのdefaultは、ムーアの法則対策のために作られました。
abstractが提供されるようになった経緯
まず、継承機能について、基礎的な歴史から解説いたします。(存じておりましたら申し訳ございません。)
昔のプログラミングは商業的価値があまりなく、小規模な開発しかありませんでした。そこから大規模開発になっていき、大規模なコードを読みやすくしたい上に、メモリも足りないという問題がありました。そこで、メモリを節約しようということで、再利用性というか、抽象性が欲しい!ということになりました。
(抽象性の意味を再確認)
例えば、我々が他の人に「野球、サッカー、テニスとか楽しい!」を説明する時、一言で「スポーツ楽しい!」で伝わりますね。
昔のプログラミングは、そのような、重複した意味をまとめる力(抽象化)がありませんでした。そこで、親クラス(抽象化)も表現できるオブジェクト指向(Java)のabstractが出番になった訳です。(当時interfaceはありませんでした。)
abstractは、ぶっちゃけ自由度が高すぎて読みづらいものでした。メソッド(機能)とグローバル変数(状態)両方出てこられて、直感的によく分からない物でした。まぁそれでも使えるっちゃ使えました。
interfaceが提供されるようになった経緯
ある時、abstractを利用したオブジェクト指向開発で、ある要望が発生しました。ポリモーフィズムで作りたいと。そして、もう少し制約を設けて読みやすくしたい。
ポリモーフィズムと言えば、List型ですね。例えば、List型で、ArrayListやLinkedListを両方扱えるようにしたい、.size()とか.add()を、どの型でも扱えるようにしまいたいというものですね。
そのような目的に絞って継承関係を扱えてしまえるなら、interfaceで綺麗に書いて読みやすくしましょうよ!ということで、interfaceがJavaに提供されました。
interfaceのdefaultが提供されるようになった経緯 「abstract interface 違い」の根源
時が過ぎてJava8になり、interface自身に、機能が持てるようになりました。default機能ですね。この話がきっと、abstractとinterfaceの違いマジ分からん問題になっているかと思います。
このdefault機能が提供された経緯は、今までの抽象化の要望とは違います。ムーアの法則対策だった気がします。来たるべくリソース不足問題に少しでも対応できるようにするために、今ある半導体のリソースを最大限に節約したいという理由で、徹底的に並列化したいという要望がありました。
そこで、並列処理を簡単かつ安全に作れるようにするためにストリームAPIが作られ、これじゃ匿名クラスだらけで分かりづらいねということで簡潔なラムダ式が導入されることになりました。
つまり、defaultはムーアの法則崩壊対策のストリームAPI提供のために作られたということで、defaultを自由に使っていいというルールが現状ないということですね。
まとめ
defaultの使い方は基本的にストリームAPI・ラムダ式で必要になる機能であって、default機能を自由に使っていいかどうかまでは分かりませんでした。しばらく様子見がいいでしょう。
余談1 パンドラの箱
abstractって、interfaceみたいに多重継承できませんでしたよね。多重継承したいという理由で、別の抽象化機能interfaceを作っちゃったという経緯もあるようです。(多重継承できてしまうとバグの追跡がしづらくなったりして、昔は禁じ手とかパンドラの箱とか言われて反対されていたらしいです。)
余談2 オブジェクト指向の歴史
コンピュータって趣味だよね
↓
コンピュータって商売のタネになるね!
↓
コンピュータって立派な産業だね!よっしゃもっとプログラミングを大規模に扱いたい!せめてプログラミングに抽象化の機能が欲しい!それでメモリーも節約したい!
↓
高機能なJavaが台頭する。abstractも提供されている。
↓
abstractって読みづらい。ポリモーフィズムも欲しい。
↓
interfaceの提供
↓
なんかムーアの法則が危ういんじゃね....? 笑えない....せや!今ある半導体リソースをとにかく有効に扱いたいから、徹底的な並列処理が簡潔に書ける機能を提供しよう!
↓
ストリームAPIとかラムダ式の提供
だったと思います。